2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本: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 上很重要,在 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。成功时,该函数返回三个可能结果之一

  • 1,如果 var1 大于 var2

  • -1,如果 var1 小于 var2

  • 0,如果 var1var2 相等

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 变量复制到另一个 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 指向的整数变量。成功时返回 0,发生错误(包括溢出)时返回 -1。溢出时,全局变量 errno 还会被设置为 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_long #

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

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

该函数将 nv 指向的变量中的 numeric 值转换为 lp 指向的长整数变量。成功时返回 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类型date的数据。有关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 1959年11月23日
yyyy dd mm 1959 23 11
ddd, mmm. dd, yyyy 星期一,1959年11月23日
(ddd) mmm. dd, yyyy (星期一) 1959年11月23日

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类型timestamp的数据。有关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,发生错误时返回负值。

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

  • %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 - 被替换为自纪元(UTC)以来的秒数。

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

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

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

  • %u - 被替换为星期几(星期一作为一周的第一天),用十进制数表示 (1–7)。

  • %V - 被替换为一年中的星期数(星期一作为一周的第一天),用十进制数表示 (01–53)。如果包含 1 月 1 日的星期在新的一年中有四天或更多天,则它是第 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);

该函数将从 ts1 指向的时间戳变量中减去 ts2 指向的时间戳变量,并将结果存储到 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 变量添加到 timestamp 变量中。

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

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

成功时,函数返回0,发生错误时返回负值。

PGTYPEStimestamp_sub_interval #

从 timestamp 变量中减去 interval 变量。

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

该函数从 tin 指向的 timestamp 变量中减去 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 字符串。输出类似于此示例:@ 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 变量的指针。

decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_free #

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

void PGTYPESdecimal_free(decimal *var);

34.6.7. pgtypeslib 的 errno 值 #

PGTYPES_NUM_BAD_NUMERIC #

参数应包含 numeric 变量(或指向 numeric 变量),但实际上其内存表示无效。

PGTYPES_NUM_OVERFLOW #

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

PGTYPES_NUM_UNDERFLOW #

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

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 #

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

提交更正

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