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

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。