2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 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 语言中对这些类型进行基本计算,即无需 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 变量减去另一个 numeric 变量,并将结果存储在第三个变量中。

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

该函数将变量 var2 从变量 var1 中减去。操作结果存储在 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 变量复制到另一个变量。

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 指向的变量中的 decimal 值转换为 dst 指向的 numeric 变量。成功时返回 0,出错时返回 -1。由于 decimal 类型实现为 numeric 类型的受限版本,因此此转换不会发生溢出。

34.6.3. date 类型 #

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

可以使用以下函数处理 date 类型

PGTYPESdate_from_timestamp #

从 timestamp 中提取日期部分。

date PGTYPESdate_from_timestamp(timestamp dt);

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

PGTYPESdate_from_asc #

从其文本表示形式解析一个 date。

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 的有效输入格式

输入 结果
January 8, 1999 January 8, 1999
1999-01-08 January 8, 1999
1/8/1999 January 8, 1999
1/18/1999 January 18, 1999
01/02/03 February 1, 2003
1999-Jan-08 January 8, 1999
Jan-08-1999 January 8, 1999
08-Jan-1999 January 8, 1999
99-Jan-08 January 8, 1999
08-Jan-99 January 8, 1999
08-Jan-06 January 8, 2006
Jan-08-99 January 8, 1999
19990108 ISO 8601; January 8, 1999
990108 ISO 8601; January 8, 1999
1999.008 年和日
J2451187 儒略日
January 8, 99 BC 公元前 99 年

PGTYPESdate_to_asc #

返回 date 变量的文本表示形式。

char *PGTYPESdate_to_asc(date dDate);

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

PGTYPESdate_julmdy #

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

void PGTYPESdate_julmdy(date d, int *mdy);

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

PGTYPESdate_mdyjul #

从一个包含 3 个整数的数组(指定日、月、年)创建 date 值。

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

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

PGTYPESdate_dayofweek #

返回一个表示 date 值的星期几的数字。

int PGTYPESdate_dayofweek(date d);

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

  • 0 - 星期日

  • 1 - 星期一

  • 2 - 星期二

  • 3 - 星期三

  • 4 - 星期四

  • 5 - 星期五

  • 6 - 星期六

PGTYPESdate_today #

获取当前日期。

void PGTYPESdate_today(date *d);

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

PGTYPESdate_fmt_asc #

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

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

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

成功时返回 0,错误时返回负值。

以下字面量是您可以在格式掩码中使用的字段说明符

  • dd - 月份中的日期号。

  • mm - 一年中的月份。

  • yy - 年份(两位数)。

  • yyyy - 年份(四位数)。

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

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

所有其他字符都逐字复制到输出字符串中。

表 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 Nov. 23, 1959
mmm dd yyyy Nov 23 1959
yyyy dd mm 1959 23 11
ddd, mmm. dd, yyyy Mon, Nov. 23, 1959
(ddd) mmm. dd, yyyy (Mon) Nov. 23, 1959

PGTYPESdate_defmt_asc #

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

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

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

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

表 34.4. rdefmtdate 的有效输入格式

格式 String 结果
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, February 3rd 1954-02-03
mmm.dd.yyyy 041269 1969-04-12
yy/mm/dd In the year 2525, in the month of July, mankind will be alive on the 28th day 2525-07-28
dd-mm-yy I said on the 28th of July in the year 2525 2525-07-28
mmm.dd.yyyy 9/14/58 1958-09-14
yy/mm/dd 47/03/29 1947-03-29
mmm.dd.yyyy oct 28 1975 1975-10-28
mmddyy Nov 14th, 1985 1985-11-14

34.6.4. timestamp 类型 #

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

可以使用以下函数处理 timestamp 类型

PGTYPEStimestamp_from_asc #

将 timestamp 从其文本表示形式解析到 timestamp 变量中。

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

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

该函数在成功时返回解析后的 timestamp。出错时,返回 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
January 8 04:05:06 1999 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);

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

PGTYPEStimestamp_current #

检索当前 timestamp。

void PGTYPEStimestamp_current(timestamp *ts);

该函数检索当前 timestamp 并将其保存到 ts 指向的 timestamp 变量中。

PGTYPEStimestamp_fmt_asc #

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

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

该函数接收要转换的 timestamp 的指针作为第一个参数(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 - 被本地化的“ante meridiem”(上午)或“post meridiem”(下午)替换。

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

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

  • %S - 被秒的十进制数(00–60)替换。

  • %s - 被自 Epoch 以来的秒数(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 #

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

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

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

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

PGTYPEStimestamp_defmt_asc #

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

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

该函数接收变量 str 中的 timestamp 文本表示形式,以及变量 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);

该函数将 span 指向的 interval 变量从 tin 指向的 timestamp 变量中减去,并将结果保存到 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 变量的指针。

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 #

将一个无效的 interval 字符串传递给 PGTYPESinterval_from_asc 函数,或者将一个无效的 interval 值传递给 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 #

将一个无效的 timestamp 字符串传递给 PGTYPEStimestamp_from_asc 函数,或者将一个无效的 timestamp 值传递给 PGTYPEStimestamp_to_asc 函数。

PGTYPES_TS_ERR_EINFTIME #

在无法处理的上下文中遇到了一个无限 timestamp 值。

34.6.8. pgtypeslib 的特殊常量 #

PGTYPESInvalidTimestamp #

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

提交更正

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