受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

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服务器中等效的类型请见Section 8.1。因为要用于任意精度,这种变量需要能够动态地扩展和收缩。这也是为什么你只能用PGTYPESnumeric_newPGTYPESnumeric_free函数在堆上创建numeric变量。decimal类型与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变量相加放到第三个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变量相乘并且把结果返回到第三个numeric变量。

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

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

PGTYPESnumeric_div #

把两个numeric变量相除并且把结果返回到第三个numeric变量。

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

该函数用变量var2除变量var1。该操作的结果被存储在变量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 #

把一个整数变量转换成一个numeric变量。

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

这个函数接受一个有符号整型变量并且把它存储在numeric变量var中。成功时返回 0,失败时返回 -1。

PGTYPESnumeric_from_long #

把一个长整型变量转换成一个numeric变量。

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

这个函数接受一个有符号长整型变量并且把它存储在numeric变量var中。成功时返回 0,失败时返回 -1。

PGTYPESnumeric_copy #

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

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

这个函数把src指向的变量的值复制到dst指向的变量中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_from_double #

把一个双精度类型的变量转换成一个numeric变量。

int  PGTYPESnumeric_from_double(double d, numeric *dst);

这个函数接受一个双精度类型的变量并且把结果存储在dst指向的变量中。成功时该函数返回 0,出错时返回 -1。

PGTYPESnumeric_to_double #

将一个numeric类型的变量转换成双精度。

int PGTYPESnumeric_to_double(numeric *nv, double *dp)

这个函数将nv指向的变量中的numeric值转换成dp指向的双精度变量。成功时该函数返回 0,出错时返回 -1(包括溢出)。溢出时,全局变量errno将被额外地设置成PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_int #

将一个numeric类型的变量转换成整数。

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

该函数将nv指向的变量的numeric值转换成ip指向的整数变量。成功时该函数返回 0,出错时返回 -1(包括溢出)。溢出时,全局变量errno将被额外地设置成PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_long #

将一个numeric类型的变量转换成长整型。

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

34.6.3. 日期类型 #

C 中的日期类型允许你的程序处理 SQL 日期类型的数据。PostgreSQL服务器的等效类型可见Section 8.5

下列函数可以被用于日期类型:

PGTYPESdate_from_timestamp #

从一个时间戳中抽取日期部分。

date PGTYPESdate_from_timestamp(timestamp dt);

该函数接收一个时间戳作为它的唯一参数并且从这个时间戳返回抽取的日期部分。

PGTYPESdate_from_asc #

从日期的文本表示解析一个日期。

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

该函数接收一个 C 的字符串str以及一个指向 C 字符串的指针endptr。当前 ECPG 总是解析完整的字符串并且因此当前不支持将第一个非法字符的地址存储在*endptr中。你可以安全地把endptr设置为 NULL。

注意该函数总是假定格式按照 MDY 格式化并且当前在 ECPG 中没有变体可以改变这种格式。

Table 34.2展示了所有允许的输入格式。

Table 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 #

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

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 个整数构成的数组创建一个日期值,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 - 月份的名称(简写)。

所有其他字符会被原封不动地复制到输出字符串中。

Table 34.3指出了一些可能的格式。这将给你一些线索如何使用这个函数。所有输出都是基于同一个日期:1959年11月23日。

Table 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);

该函数接收一个保存结果的日期值指针(d)、用于解析日期的格式掩码(fmt),以及包含日期文本表示的 C char* 字符串(str)。该函数期望文本表示与格式掩码相匹配,不过并不要求字符串与格式掩码一一对应。它只分析先后顺序,并查找表示年份位置的yyyyyy、表示月份位置的mm以及表示日期位置的dd

Table 34.4给出了一些可能的格式。这将给你一些线索如何使用这个函数。

Table 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, February 3rd 1954-02-03
mmm.dd.yyyy 041269 1969-04-12
yy/mm/dd 在 2525 年的七月二十八日,人类还将存在 2525-07-28
dd-mm-yy 也是 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. 时间戳类型 #

C 中的时间戳类型允许你的程序处理 SQL 时间戳类型的数据。PostgreSQL服务器的等效类型可见Section 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服务器那样应用任何计算。时区标识符会被静默丢弃。

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

Table 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 (time zone specifier ignored)
J2451187 04:05-08:00 1999-01-08 04:05:00 (time zone specifier ignored)

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 - 被替换为自纪元时以来的秒数,协调世界时。

  • %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 变量。

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

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

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

PGTYPEStimestamp_sub_interval #

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

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

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

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

34.6.5. interval 类型 #

C 中的 interval 类型允许程序处理 SQL interval 类型的数据。PostgreSQL服务器中的等效类型见Section 8.5

下列函数可用于处理 interval 类型:

PGTYPESinterval_new #

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

interval *PGTYPESinterval_new(void);
PGTYPESinterval_free #

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

void PGTYPESinterval_free(interval *intvl);
PGTYPESinterval_from_asc #

从文本表示解析一个区间。

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指向的 interval 变量中。注意,需要事先为目标变量分配好内存。

34.6.6. decimal类型 #

decimal类型和numeric类型相似。不过,它被限制为最大精度是 30 个有效位。与numeric类型只能在堆上创建相反,decimal类型既可以在栈上也可以在堆上创建(使用函数PGTYPESdecimal_newPGTYPESdecimal_free)。在Section 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。为了检测到错误,确认你的应用在每次调用PGTYPEStimestamp_from_asc后不仅仅测试PGTYPESInvalidTimestamp,还应该测试errno != 0

提交更正

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