支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

34.6. pgtypes 库 #

pgtypes 库将 PostgreSQL 数据库类型映射到 C 程序中可用的 C 等效类型。它还提供了在 C 中对这些类型进行基本计算的函数,即无需 PostgreSQL 服务器的帮助。请参见以下示例

EXEC SQL BEGIN DECLARE SECTION;
   date date1;
   timestamp ts1, tsout;
   interval iv1;
   char *out;
EXEC SQL END DECLARE SECTION;

PGTYPESdate_today(&date1);
EXEC SQL SELECT started, duration INTO :ts1, :iv1 FROM datetbl WHERE d=:date1;
PGTYPEStimestamp_add_interval(&ts1, &iv1, &tsout);
out = PGTYPEStimestamp_to_asc(&tsout);
printf("Started + duration: %s\n", out);
PGTYPESchar_free(out);

34.6.1. 字符串 #

某些函数(如 PGTYPESnumeric_to_asc)返回指向新分配的字符串的指针。这些结果应该使用 PGTYPESchar_free 而不是 free 来释放。(这仅在 Windows 上很重要,因为有时内存分配和释放需要由同一个库完成。)

34.6.2. numeric 类型 #

numeric 类型提供了执行任意精度计算的功能。有关 PostgreSQL 服务器中等效的类型,请参见第 8.1 节。由于具有任意精度,该变量需要能够动态扩展和收缩。这就是为什么只能通过 PGTYPESnumeric_newPGTYPESnumeric_free 函数在堆上创建 numeric 变量的原因。decimal 类型与此类似,但精度有限,它可以在堆上创建,也可以在栈上创建。

可以使用以下函数来处理 numeric 类型

PGTYPESnumeric_new #

请求指向新分配的 numeric 变量的指针。

numeric *PGTYPESnumeric_new(void);
PGTYPESnumeric_free #

释放 numeric 类型,释放其所有内存。

void PGTYPESnumeric_free(numeric *var);
PGTYPESnumeric_from_asc #

从其字符串表示法解析 numeric 类型。

numeric *PGTYPESnumeric_from_asc(char *str, char **endptr);

有效的格式例如:-2.794+3.44592.49E07-32.84e-4。如果可以成功解析该值,则返回一个有效的指针,否则返回 NULL 指针。目前 ECPG 总是解析完整的字符串,因此它目前不支持将第一个无效字符的地址存储在 *endptr 中。您可以安全地将 endptr 设置为 NULL。

PGTYPESnumeric_to_asc #

返回一个由 malloc 分配的字符串的指针,该字符串包含 numeric 类型 num 的字符串表示形式。

char *PGTYPESnumeric_to_asc(numeric *num, int dscale);

numeric 值将以 dscale 个十进制数字打印,并在必要时应用舍入。结果必须使用 PGTYPESchar_free() 释放。

PGTYPESnumeric_add #

将两个 numeric 变量相加到第三个变量中。

int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);

该函数将变量 var1var2 加到结果变量 result 中。该函数在成功时返回 0,在出错时返回 -1。

PGTYPESnumeric_sub #

减去两个 numeric 变量,并在第三个变量中返回结果。

int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);

该函数从变量 var1 中减去变量 var2。运算的结果存储在变量 result 中。该函数在成功时返回 0,在出错时返回 -1。

PGTYPESnumeric_mul #

将两个 numeric 变量相乘,并在第三个变量中返回结果。

int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);

该函数将变量 var1var2 相乘。运算的结果存储在变量 result 中。该函数在成功时返回 0,在出错时返回 -1。

PGTYPESnumeric_div #

将两个 numeric 变量相除,并在第三个变量中返回结果。

int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);

该函数将变量 var1 除以 var2。运算的结果存储在变量 result 中。该函数在成功时返回 0,在出错时返回 -1。

PGTYPESnumeric_cmp #

比较两个 numeric 变量。

int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)

此函数比较两个 numeric 变量。如果出错,则返回 INT_MAX。如果成功,该函数返回以下三个可能结果之一:

  • 如果 var1 大于 var2,则为 1

  • 如果 var1 小于 var2,则为 -1

  • 如果 var1var2 相等,则为 0

PGTYPESnumeric_from_int #

将 int 变量转换为 numeric 变量。

int PGTYPESnumeric_from_int(signed int int_val, numeric *var);

此函数接受一个 signed int 类型的变量,并将其存储在 numeric 变量 var 中。成功时返回 0,失败时返回 -1。

PGTYPESnumeric_from_long #

将 long int 变量转换为 numeric 变量。

int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);

此函数接受一个 signed long int 类型的变量,并将其存储在 numeric 变量 var 中。成功时返回 0,失败时返回 -1。

PGTYPESnumeric_copy #

将一个 numeric 变量复制到另一个变量中。

int PGTYPESnumeric_copy(numeric *src, numeric *dst);

此函数将 src 指向的变量的值复制到 dst 指向的变量中。成功时返回 0,如果发生错误,则返回 -1。

PGTYPESnumeric_from_double #

将 double 类型的变量转换为 numeric。

int  PGTYPESnumeric_from_double(double d, numeric *dst);

此函数接受 double 类型的变量,并将结果存储在 dst 指向的变量中。成功时返回 0,如果发生错误,则返回 -1。

PGTYPESnumeric_to_double #

将 numeric 类型的变量转换为 double。

int PGTYPESnumeric_to_double(numeric *nv, double *dp)

该函数将 nv 指向的变量中的 numeric 值转换为 dp 指向的 double 变量。成功时返回 0,如果发生错误(包括溢出),则返回 -1。发生溢出时,全局变量 errno 将另外设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_int #

将 numeric 类型的变量转换为 int。

int PGTYPESnumeric_to_int(numeric *nv, int *ip);

该函数将 nv 指向的变量中的 numeric 值转换为 ip 指向的 integer 变量。成功时返回 0,如果发生错误(包括溢出),则返回 -1。发生溢出时,全局变量 errno 将另外设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_long #

将 numeric 类型的变量转换为 long。

int PGTYPESnumeric_to_long(numeric *nv, long *lp);

该函数将 nv 指向的变量中的 numeric 值转换为 lp 指向的 long integer 变量。成功时返回 0,如果发生错误(包括溢出和下溢),则返回 -1。发生溢出时,全局变量 errno 将设置为 PGTYPES_NUM_OVERFLOW,发生下溢时,errno 将设置为 PGTYPES_NUM_UNDERFLOW

PGTYPESnumeric_to_decimal #

将 numeric 类型的变量转换为 decimal。

int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);

该函数将 src 指向的变量中的 numeric 值转换为 dst 指向的 decimal 变量。成功时返回 0,如果发生错误(包括溢出),则返回 -1。发生溢出时,全局变量 errno 将另外设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_from_decimal #

将 decimal 类型的变量转换为 numeric。

int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);

该函数将 src 指向的变量中的十进制值转换为 dst 指向的数值变量。成功时返回 0,发生错误时返回 -1。由于十进制类型是作为数值类型的有限版本实现的,因此此转换不会发生溢出。

34.6.3. 日期类型 #

C 语言中的日期类型使您的程序能够处理 SQL 日期类型的数据。有关 PostgreSQL 服务器中等效的类型,请参阅第 8.5 节

以下函数可用于处理日期类型

PGTYPESdate_from_timestamp #

从时间戳中提取日期部分。

date PGTYPESdate_from_timestamp(timestamp dt);

该函数接收一个时间戳作为其唯一参数,并返回从此时间戳中提取的日期部分。

PGTYPESdate_from_asc #

从文本表示中解析日期。

date PGTYPESdate_from_asc(char *str, char **endptr);

该函数接收一个 C char* 字符串 str 和一个指向 C char* 字符串 endptr 的指针。目前,ECPG 总是解析完整的字符串,因此它目前不支持在 *endptr 中存储第一个无效字符的地址。您可以安全地将 endptr 设置为 NULL。

请注意,该函数始终假定 MDY 格式的日期,并且目前在 ECPG 中没有变量可以更改该格式。

表 34.2 显示了允许的输入格式。

表 34.2. PGTYPESdate_from_asc 的有效输入格式

输入 结果
1999 年 1 月 8 日 1999 年 1 月 8 日
1999-01-08 1999 年 1 月 8 日
1/8/1999 1999 年 1 月 8 日
1/18/1999 1999 年 1 月 18 日
01/02/03 2003 年 2 月 1 日
1999-Jan-08 1999 年 1 月 8 日
Jan-08-1999 1999 年 1 月 8 日
08-Jan-1999 1999 年 1 月 8 日
99-Jan-08 1999 年 1 月 8 日
08-Jan-99 1999 年 1 月 8 日
08-Jan-06 2006 年 1 月 8 日
Jan-08-99 1999 年 1 月 8 日
19990108 ISO 8601;1999 年 1 月 8 日
990108 ISO 8601;1999 年 1 月 8 日
1999.008 年份和一年中的第几天
J2451187 儒略日
公元前 99 年 1 月 8 日 公元前 99 年

PGTYPESdate_to_asc #

返回日期变量的文本表示。

char *PGTYPESdate_to_asc(date dDate);

该函数接收日期 dDate 作为其唯一参数。它将以 1999-01-18 的形式输出日期,即 YYYY-MM-DD 格式。必须使用 PGTYPESchar_free() 释放结果。

PGTYPESdate_julmdy #

从日期类型的变量中提取日、月和年的值。

void PGTYPESdate_julmdy(date d, int *mdy);

该函数接收日期 d 和一个指向 3 个整数值数组 mdy 的指针。变量名称指示顺序:mdy[0] 将设置为包含月份的数字,mdy[1] 将设置为日的值,mdy[2] 将包含年份。

PGTYPESdate_mdyjul #

从指定日期的日、月和年的 3 个整数数组创建一个日期值。

void PGTYPESdate_mdyjul(int *mdy, date *jdate);

该函数接收 3 个整数 (mdy) 的数组作为其第一个参数,并接收一个指向应保存操作结果的日期类型变量的指针作为其第二个参数。

PGTYPESdate_dayofweek #

返回表示日期值对应的星期几的数字。

int PGTYPESdate_dayofweek(date d);

该函数接收日期变量 d 作为其唯一参数,并返回一个整数,该整数指示该日期的星期几。

  • 0 - 星期日

  • 1 - 星期一

  • 2 - 星期二

  • 3 - 星期三

  • 4 - 星期四

  • 5 - 星期五

  • 6 - 星期六

PGTYPESdate_today #

获取当前日期。

void PGTYPESdate_today(date *d);

该函数接收指向日期变量 (d) 的指针,该指针将其设置为当前日期。

PGTYPESdate_fmt_asc #

使用格式掩码将日期类型的变量转换为其文本表示。

int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);

该函数接收要转换的日期 (dDate)、格式掩码 (fmtstring) 和将保存日期的文本表示的字符串 (outbuf)。

成功时,返回 0;如果发生错误,则返回负值。

以下字面量是您可以使用的字段说明符

  • dd - 月份中的日期数。

  • mm - 年份中的月份数。

  • yy - 以两位数表示的年份。

  • yyyy - 以四位数表示的年份。

  • ddd - 日期的名称(缩写)。

  • mmm - 月份的名称(缩写)。

所有其他字符都以 1:1 复制到输出字符串。

表 34.3 指示了一些可能的格式。这将使您了解如何使用此函数。所有输出行都基于同一日期:1959 年 11 月 23 日。

表 34.3. PGTYPESdate_fmt_asc 的有效输入格式

格式 结果
mmddyy 112359
ddmmyy 231159
yymmdd 591123
yy/mm/dd 59/11/23
yy mm dd 59 11 23
yy.mm.dd 59.11.23
.mm.yyyy.dd. .11.1959.23.
mmm. dd, yyyy 1959 年 11 月 23 日
mmm dd yyyy 11 月 23 日 1959
yyyy dd mm 1959 23 11
ddd, mmm. dd, yyyy 星期一,11 月 23 日,1959
(ddd) mmm. dd, yyyy (星期一)11 月 23 日,1959

PGTYPESdate_defmt_asc #

使用格式掩码将 C char* 字符串转换为日期类型的值。

int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);

该函数接收一个指向应该保存操作结果的日期值的指针 (d),用于解析日期的格式掩码 (fmt) 和包含日期的文本表示的 C char* 字符串 (str)。文本表示应与格式掩码匹配。但是,您不需要将字符串与格式掩码进行 1:1 的映射。该函数仅分析顺序,并查找指示年份位置的字面量 yyyyyy,指示月份位置的 mm 和指示日期位置的 dd

表 34.4 指示了一些可能的格式。这将使您了解如何使用此函数。

表 34.4. rdefmtdate 的有效输入格式

格式 字符串 结果
ddmmyy 21-2-54 1954-02-21
ddmmyy 2-12-54 1954-12-02
ddmmyy 20111954 1954-11-20
ddmmyy 130464 1964-04-13
mmm.dd.yyyy MAR-12-1967 1967-03-12
yy/mm/dd 1954 年 2 月 3 日 1954-02-03
mmm.dd.yyyy 041269 1969-04-12
yy/mm/dd 在 2525 年,7 月,人类将在 28 日活着 2525-07-28
dd-mm-yy 我说过在 2525 年 7 月 28 日 2525-07-28
mmm.dd.yyyy 9/14/58 1958-09-14
yy/mm/dd 47/03/29 1947-03-29
mmm.dd.yyyy 1975 年 10 月 28 日 1975-10-28
mmddyy 1985 年 11 月 14 日 1985-11-14

34.6.4. 时间戳类型 #

C 语言中的时间戳类型使您的程序能够处理 SQL 时间戳类型的数据。有关 PostgreSQL 服务器中等效的类型,请参阅第 8.5 节

以下函数可用于处理时间戳类型

PGTYPEStimestamp_from_asc #

将时间戳从其文本表示解析为时间戳变量。

timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr);

该函数接收要解析的字符串 (str) 和指向 C char* (endptr) 的指针。目前,ECPG 总是解析完整的字符串,因此它目前不支持在 *endptr 中存储第一个无效字符的地址。您可以安全地将 endptr 设置为 NULL。

该函数在成功时返回解析的时间戳。如果发生错误,则返回 PGTYPESInvalidTimestamp,并且 errno 设置为 PGTYPES_TS_BAD_TIMESTAMP。有关此值的更多重要信息,请参阅PGTYPESInvalidTimestamp

一般来说,输入字符串可以包含任何允许的日期规范、空格字符和允许的时间规范的组合。请注意,ECPG 不支持时区。它可以解析它们,但不会像 PostgreSQL 服务器那样进行任何计算。时区说明符会被静默丢弃。

表 34.5 包含了一些输入字符串的示例。

表 34.5. PGTYPEStimestamp_from_asc 的有效输入格式

输入 结果
1999-01-08 04:05:06 1999-01-08 04:05:06
1999 年 1 月 8 日 04:05:06 PST 1999-01-08 04:05:06
1999-Jan-08 04:05:06.789-8 1999-01-08 04:05:06.789 (忽略时区说明符)
J2451187 04:05-08:00 1999-01-08 04:05:00 (忽略时区说明符)

PGTYPEStimestamp_to_asc #

将日期转换为 C char* 字符串。

char *PGTYPEStimestamp_to_asc(timestamp tstamp);

该函数接收时间戳 tstamp 作为其唯一参数,并返回一个已分配的字符串,其中包含时间戳的文本表示。必须使用 PGTYPESchar_free() 释放结果。

PGTYPEStimestamp_current #

获取当前时间戳。

void PGTYPEStimestamp_current(timestamp *ts);

该函数获取当前时间戳,并将其保存到 ts 指向的时间戳变量中。

PGTYPEStimestamp_fmt_asc #

使用格式掩码将时间戳变量转换为 C char*。

int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);

该函数接收指向要转换的时间戳的指针作为其第一个参数 (ts),指向输出缓冲区的指针 (output),为输出缓冲区分配的最大长度 (str_len) 以及用于转换的格式掩码 (fmtstr)。

成功时,该函数返回 0;如果发生错误,则返回负值。

您可以为格式掩码使用以下格式说明符。格式说明符与 libc 中的 strftime 函数中使用的格式说明符相同。任何非格式说明符都将被复制到输出缓冲区中。

  • %A - 被替换为完整的工作日名称的国家表示形式。

  • %a - 被替换为缩写的工作日名称的国家表示形式。

  • %B - 被替换为完整月份名称的国家表示形式。

  • %b - 被替换为缩写月份名称的国家表示形式。

  • %C - 被替换为 (年份 / 100) 的十进制数;个位数前面加零。

  • %c - 被替换为时间和日期的国家表示形式。

  • %D - 等效于 %m/%d/%y

  • %d - 被替换为月份中的日期,以十进制数表示 (01–31)。

  • %E* %O* - POSIX 区域设置扩展。序列 %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy 应该提供替代表示形式。

    此外,%OB 被实现为表示替代的月份名称(单独使用,不提及日期)。

  • %e - 被替换为月份中的日期,以十进制数表示 (1–31);个位数前面加空格。

  • %F - 等效于 %Y-%m-%d

  • %G - 被替换为带世纪的年份的十进制数。此年份是包含该周大部分(周一为一周的第一天)的年份。

  • %g - 被替换为与 %G 中相同的年份,但表示为不带世纪的十进制数 (00–99)。

  • %H - 被替换为小时(24 小时制),以十进制数表示 (00–23)。

  • %h - 与 %b 相同。

  • %I - 被替换为小时(12 小时制),以十进制数表示 (01–12)。

  • %j - 被替换为一年中的日期,以十进制数表示 (001–366)。

  • %k - 被替换为小时(24 小时制),以十进制数表示 (0–23);个位数前面加空格。

  • %l - 被替换为小时(12 小时制),以十进制数表示 (1–12);个位数前面加空格。

  • %M - 被替换为分钟,以十进制数表示 (00–59)。

  • %m - 被替换为月份,以十进制数表示 (01–12)。

  • %n - 被替换为换行符。

  • %O* - 与 %E* 相同。

  • %p - 被替换为适当的 上午下午的国家表示形式。

  • %R - 等效于 %H:%M

  • %r - 等效于 %I:%M:%S %p

  • %S - 被替换为秒,以十进制数表示 (00–60)。

  • %s - 被替换为自 Unix 纪元以来的秒数,UTC。

  • %T - 等效于 %H:%M:%S

  • %t - 被替换为制表符。

  • %U - 被替换为一年中的周数(周日为一周的第一天),以十进制数表示 (00–53)。

  • %u - 被替换为工作日(周一为一周的第一天),以十进制数表示 (1–7)。

  • %V - 被替换为一年中的周数(周一为一周的第一天),以十进制数表示 (01–53)。如果包含 1 月 1 日的一周在新的一年中包含 4 天或更多天,则它是第 1 周;否则它是前一年的最后一周,下一周是第 1 周。

  • %v - 等效于 %e-%b-%Y

  • %W - 被替换为一年中的周数(周一为一周的第一天),以十进制数表示 (00–53)。

  • %w - 被替换为工作日(周日为一周的第一天),以十进制数表示 (0–6)。

  • %X - 被替换为时间的国家表示形式。

  • %x - 被替换为日期的国家表示形式。

  • %Y - 被替换为带世纪的年份,以十进制数表示。

  • %y - 被替换为不带世纪的年份,以十进制数表示 (00–99)。

  • %Z - 被替换为时区名称。

  • %z - 被替换为与 UTC 的时区偏移量;前导加号表示 UTC 以东,减号表示 UTC 以西,小时和分钟各两位数,它们之间没有分隔符(RFC 822 日期标头的常用格式)。

  • %+ - 被替换为日期和时间的国家表示形式。

  • %-* - GNU libc 扩展。执行数值输出时不要进行任何填充。

  • $_* - GNU libc 扩展。显式指定空格用于填充。

  • %0* - GNU libc 扩展。显式指定零用于填充。

  • %% - 被替换为 %

PGTYPEStimestamp_sub #

从另一个时间戳中减去一个时间戳,并将结果保存在 interval 类型的变量中。

int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);

该函数将 ts2 指向的时间戳变量从 ts1 指向的时间戳变量中减去,并将结果存储在 iv 指向的 interval 变量中。

成功时,该函数返回 0;如果发生错误,则返回负值。

PGTYPEStimestamp_defmt_asc #

使用格式掩码从文本表示形式解析时间戳值。

int PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d);

该函数接收变量 str 中的时间戳的文本表示形式以及在变量 fmt 中使用的格式掩码。结果将存储在 d 指向的变量中。

如果格式掩码 fmt 为 NULL,则该函数将回退到默认格式掩码,即 %Y-%m-%d %H:%M:%S

这是 PGTYPEStimestamp_fmt_asc 的反向函数。请参阅该处的文档以了解可能的格式掩码条目。

PGTYPEStimestamp_add_interval #

将 interval 变量添加到时间戳变量。

int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);

该函数接收指向时间戳变量 tin 的指针和指向 interval 变量 span 的指针。它将 interval 添加到时间戳,并将结果时间戳保存在 tout 指向的变量中。

成功时,该函数返回 0;如果发生错误,则返回负值。

PGTYPEStimestamp_sub_interval #

从时间戳变量中减去 interval 变量。

int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);

该函数从 tin 指向的时间戳变量中减去 span 指向的 interval 变量,并将结果保存到 tout 指向的变量中。

成功时,该函数返回 0;如果发生错误,则返回负值。

34.6.5. interval 类型 #

C 中的 interval 类型使您的程序能够处理 SQL 类型 interval 的数据。有关 PostgreSQL 服务器中的等效类型,请参见第 8.5 节

以下函数可用于处理 interval 类型

PGTYPESinterval_new #

返回指向新分配的 interval 变量的指针。

interval *PGTYPESinterval_new(void);
PGTYPESinterval_free #

释放先前分配的 interval 变量的内存。

void PGTYPESinterval_free(interval *intvl);
PGTYPESinterval_from_asc #

从文本表示形式解析 interval。

interval *PGTYPESinterval_from_asc(char *str, char **endptr);

该函数解析输入字符串 str,并返回指向分配的 interval 变量的指针。目前,ECPG 始终解析完整的字符串,因此当前不支持在 *endptr 中存储第一个无效字符的地址。您可以安全地将 endptr 设置为 NULL。

PGTYPESinterval_to_asc #

将 interval 类型的变量转换为文本表示形式。

char *PGTYPESinterval_to_asc(interval *span);

该函数将 span 指向的 interval 变量转换为 C char*。输出类似于此示例: @ 1 day 12 hours 59 mins 10 secs。必须使用 PGTYPESchar_free() 释放结果。

PGTYPESinterval_copy #

复制 interval 类型的变量。

int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);

该函数将 intvlsrc 指向的 interval 变量复制到 intvldest 指向的变量中。请注意,您需要在之前为目标变量分配内存。

34.6.6. decimal 类型 #

decimal 类型类似于 numeric 类型。但是,它被限制为最大 30 位有效数字的精度。与只能在堆上创建的 numeric 类型不同,decimal 类型可以在堆栈上或堆上创建(通过函数 PGTYPESdecimal_newPGTYPESdecimal_free)。在 第 34.15 节中描述的 Informix 兼容模式下,有许多其他函数可以处理 decimal 类型。

以下函数可用于处理 decimal 类型,并且不仅包含在 libcompat 库中。

PGTYPESdecimal_new #

请求一个指向新分配的十进制变量的指针。

decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_free #

释放一个十进制类型,释放其所有内存。

void PGTYPESdecimal_free(decimal *var);

34.6.7. pgtypeslib 的 errno 值 #

PGTYPES_NUM_BAD_NUMERIC #

一个参数应该包含一个数值变量(或指向一个数值变量的指针),但实际上它的内存表示是无效的。

PGTYPES_NUM_OVERFLOW #

发生溢出。由于数值类型可以处理几乎任意的精度,将数值变量转换为其他类型可能会导致溢出。

PGTYPES_NUM_UNDERFLOW #

发生下溢。由于数值类型可以处理几乎任意的精度,将数值变量转换为其他类型可能会导致下溢。

PGTYPES_NUM_DIVIDE_ZERO #

尝试除以零。

PGTYPES_DATE_BAD_DATE #

传递给 PGTYPESdate_from_asc 函数的日期字符串无效。

PGTYPES_DATE_ERR_EARGS #

传递给 PGTYPESdate_defmt_asc 函数的参数无效。

PGTYPES_DATE_ERR_ENOSHORTDATE #

PGTYPESdate_defmt_asc 函数在输入字符串中找到了无效的标记。

PGTYPES_INTVL_BAD_INTERVAL #

传递给 PGTYPESinterval_from_asc 函数的间隔字符串无效,或者传递给 PGTYPESinterval_to_asc 函数的间隔值无效。

PGTYPES_DATE_ERR_ENOTDMY #

PGTYPESdate_defmt_asc 函数中,日期/月份/年份的赋值不匹配。

PGTYPES_DATE_BAD_DAY #

PGTYPESdate_defmt_asc 函数找到了无效的月份日期值。

PGTYPES_DATE_BAD_MONTH #

PGTYPESdate_defmt_asc 函数找到了无效的月份值。

PGTYPES_TS_BAD_TIMESTAMP #

传递给 PGTYPEStimestamp_from_asc 函数的时间戳字符串无效,或者传递给 PGTYPEStimestamp_to_asc 函数的时间戳值无效。

PGTYPES_TS_ERR_EINFTIME #

在无法处理的上下文中遇到了无限时间戳值。

34.6.8. pgtypeslib 的特殊常量 #

PGTYPESInvalidTimestamp #

一个表示无效时间戳的 timestamp 类型的值。这由函数 PGTYPEStimestamp_from_asc 在解析错误时返回。请注意,由于 timestamp 数据类型的内部表示,PGTYPESInvalidTimestamp 同时也是一个有效的时间戳。它被设置为 1899-12-31 23:59:59。为了检测错误,请确保您的应用程序不仅测试 PGTYPESInvalidTimestamp,还要在每次调用 PGTYPEStimestamp_from_asc 后检查 errno != 0

提交更正

如果您发现文档中有任何不正确、与您的特定功能体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。