支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:開發版
不再支援的版本: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 上很重要,在 Windows 上記憶體配置和釋放有時需要由同一個函式庫完成。)

34.6.2. numeric 型別 #

numeric 型別提供任意精度的計算功能。有關 PostgreSQL 伺服器中等效的型別,請參閱 第 8.1 節。由於任意精度,此變數需要能夠動態擴展和收縮。這就是為什麼您只能在堆積上建立 numeric 變數,透過 PGTYPESnumeric_newPGTYPESnumeric_free 函式。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 變數複製到另一個變數中。

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,包括溢位 (overflow)。 如果發生溢位,全域變數 errno 將額外設置為 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_int #

將 numeric 類型的變數轉換為 int。

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

該函數將 nv 指向的變數中的 numeric 值轉換為 ip 指向的 integer 變數。 成功時返回 0,發生錯誤時返回 -1,包括溢位 (overflow)。 如果發生溢位,全域變數 errno 將額外設置為 PGTYPES_NUM_OVERFLOW

PGTYPESnumeric_to_long #

將 numeric 類型的變數轉換為 long。

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

該函數將 nv 指向的變數中的 numeric 值轉換為 lp 指向的 long integer 變數。 成功時返回 0,發生錯誤時返回 -1,包括溢位 (overflow) 和下溢 (underflow)。 如果發生溢位,全域變數 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,包括溢位 (overflow)。 如果發生溢位,全域變數 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 #

從時間戳記中提取日期部分。

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

輸入 結果
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 year and day of year
J2451187 Julian day
January 8, 99 BC year 99 before the Common Era

PGTYPESdate_to_asc #

返回日期變數的文字表示形式。

char *PGTYPESdate_to_asc(date dDate);

該函數接收日期 dDate 作為其唯一的參數。 它將以 1999-01-18 的形式輸出日期,即以 YYYY-MM-DD 格式輸出。 必須使用 PGTYPESchar_free() 釋放結果。

PGTYPESdate_julmdy #

從 date 類型的變數中提取日、月和年的值。

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) 作為其第一個參數,並接收指向 date 類型變數的指標作為其第二個參數,該變數應保存運算的結果。

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 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* 字串轉換為日期型別的值。

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, 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;如果發生錯誤,則傳回負值。

您可以將以下格式指定符用於格式遮罩。 格式指定符與 libcstrftime 函式中使用的相同。 任何非格式指定符都會複製到輸出緩衝區。

  • %A - 替換為完整星期名稱的國家表示形式。

  • %a - 替換為縮寫星期名稱的國家表示形式。

  • %B - 替換為完整月份名稱的國家表示形式。

  • %b - 替換為縮寫月份名稱的國家表示形式。

  • %C - 替換為 (year / 100) 作為十進制數字;個位數前面加零。

  • %c - 替換為時間和日期的國家表示形式。

  • %D - 相當於 %m/%d/%y

  • %d - 替換為月份中的日數,表示為十進制數字 (01–31)。

  • %E* %O* - POSIX locale 擴充。序列 %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 meridiempost meridiem(視情況而定)。

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

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

  • %S - 會被替換為以十進制數字表示的秒數 (00–60)。

  • %s - 會被替換為自 Epoch (UTC) 以來的秒數。

  • %T - 等同於 %H:%M:%S

  • %t - 會被替換為 tab。

  • %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 的指標,以及指向 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 的資料。請參閱第 8.5 節,以了解 PostgreSQL 伺服器中對應的類型。

以下函數可用於處理 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 #

輸入字串中存在無效的 token,由 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 #

無效的時間戳記字串已傳遞給 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

提交更正

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