<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 33.6\. pgtypes 庫 Pgtypes庫映射PostgreSQL數據庫類型到C等值, 它可用于C程序。沒有PostgreSQL服務器的幫助下, 它也提供一些函數在C中用這些類型做基本的運算。 請看下面的例子: ``` 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); free(out); ``` ## 33.6.1\. 數值類型 數值類型提供任意精度的計算。 參見[Section 8.1](#calibre_link-695) 獲取PostgreSQL服務器等價類型。 由于任意精度這一變量需要能夠擴展和動態收縮。 那就是你只能在堆上創建數值變量的原因, 通過`PGTYPESnumeric_new`和`PGTYPESnumeric_free`函數。 和十進制類型類似但精確度有限,可以在棧中創建也可以在堆上創建。 下列函數用于處理數值類型: `PGTYPESnumeric_new` 請求一個新分配的數值變量的指針。 ``` numeric *PGTYPESnumeric_new(void); ``` `PGTYPESnumeric_free` 任意數值類型釋放所有內存。 ``` void PGTYPESnumeric_free(numeric *var); ``` `PGTYPESnumeric_from_asc` 從字符串標號解析數值類型。 ``` numeric *PGTYPESnumeric_from_asc(char *str, char **endptr); ``` 有效格式比如:`-2`, `.794`, `+3.44`, `592.49E07`或者 `-32.84e-4`。 如果值解析不成功,返回一個有效指針,否則空指針。 此刻ECPG總是解析完整的字符串, 所以目前不支持存儲在`*endptr`第一無效字符的地址。 你可以安全地設置`endptr`為空。 `PGTYPESnumeric_to_asc` 返回一個指向字符串的指針, 該字符串是通過`malloc`包 含數值類型`num`的字符串表示形式分配的。 ``` char *PGTYPESnumeric_to_asc(numeric *num, int dscale); ``` 如果必要的話,數值類型的值將帶有`dscale`小數位數舍入。 `PGTYPESnumeric_add` 添加兩個數值變量到三分之一。 ``` int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result); ``` 函數添加變量`var1`和 `var2`到結果變量`result`中。 函數成功時返回0,錯誤情況下返回-1。 `PGTYPESnumeric_sub` 減去兩個數值變量并且返回三分之一結果。 ``` int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result); ``` 函數從變量`var1`中減去變量`var2`。 操作的結果被存儲在變量`result`中。 函數成功時返回0,并且錯誤的情況下返回-1。 `PGTYPESnumeric_mul` 兩個數值變量相乘,并且返回三分之一結果。 ``` int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result); ``` 函數將變量`var1`和 `var2`相乘。操作的結果被存儲在變量`result`中。 函數成功時返回0,并且錯誤的情況下返回-1。 `PGTYPESnumeric_div` 兩個數值變量相除并且返回三分之一結果。 ``` int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result); ``` 函數將變量`var1`除以變量`var2`。 操作的結果被存儲在變量`result`中。 函數成功時返回0并且錯誤的情況下返回-1。 `PGTYPESnumeric_cmp` 比較兩個數值變量。 ``` int PGTYPESnumeric_cmp(numeric *var1, numeric *var2) ``` 這個函數比較兩個數值變量。在錯誤的情況下,返回`INT_MAX`。 成功,函數返回三個可能結果之一: * 如果`var1`大于`var2`,則返回1。 * 如果`var1`小于`var2`,則返回-1。 * 如果`var1`等于`var2`,則返回0。 `PGTYPESnumeric_from_int` 轉換一個int變量到數值變量。 ``` int PGTYPESnumeric_from_int(signed int int_val, numeric *var); ``` 這個函數接受有符號整型變量并將其存儲在數值變量`var`中, 成功時,則返回0。在失敗的情況下,返回-1。 `PGTYPESnumeric_from_long` 轉換長整型變量到數值變量。 ``` int PGTYPESnumeric_from_long(signed long int long_val, numeric *var); ``` 這個函數接受有符號長整型變量并將其存儲在數值變量`var`中,成功時, 則返回0。在失敗的情況下,返回-1。 `PGTYPESnumeric_copy` 拷貝一個數值變量為另一個變量。 ``` int PGTYPESnumeric_copy(numeric *src, numeric *dst); ``` 這個函數拷貝變量的值,這個變量是`src`指向`dst`指向的變量, 成功時返回0,錯誤的情況下返回-1。 `PGTYPESnumeric_from_double` 將double類型的變量轉換成數值類型的。 ``` int PGTYPESnumeric_from_double(double d, numeric *dst); ``` 這個函數接受double變量并將其結果存儲在`dst`指向的變量中, 成功時,則返回0。在失敗的情況下,返回-1。 `PGTYPESnumeric_to_double` 將數值類型變量轉換成double類型的。 ``` int PGTYPESnumeric_to_double(numeric *nv, double *dp) ``` 這個函數從變量中轉換數值類型的值, 這個變量是`nv`指向的`dp`指向的double變量, 成功時返回0,錯誤的情況下返回-1,包括溢出。溢出的時候, 全局變量`errno`將額外設置`PGTYPES_NUM_OVERFLOW`。 `PGTYPESnumeric_to_int` 將數值類型變量轉化成整型。 ``` int PGTYPESnumeric_to_int(numeric *nv, int *ip); ``` 這個函數從變量中轉換數值類型的值,這個變量是`nv`指向的`ip`指向的整型變量, 成功時返回0,錯誤的情況下返回-1,包括溢出。溢出的時候, 全局變量`errno`將額外設置`PGTYPES_NUM_OVERFLOW`。 `PGTYPESnumeric_to_long` 將數值類型的變量轉換成long類型。 ``` int PGTYPESnumeric_to_long(numeric *nv, long *lp); ``` 這個函數從變量中轉換數值類型的值,這個變量是`nv`指向的`lp`指向的長整型變量, 成功時返回0,錯誤的情況下返回-1,包括溢出。溢出的時候, 全局變量`errno`將額外設置`PGTYPES_NUM_OVERFLOW`。 `PGTYPESnumeric_to_decimal` 將數值類型的變量轉換成十進制類型。 ``` int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst); ``` 這個函數從變量中轉換數值類型的值,這個變量是`src`指向的 `dst`指向的十進制變量, 成功時返回0,錯誤的情況下返回-1,包括溢出。溢出的時候, 全局變量`errno`將額外設置`PGTYPES_NUM_OVERFLOW`。 `PGTYPESnumeric_from_decimal` 將十進制類型的變量轉換成數值類型。 ``` int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst); ``` 這個函數從變量中轉換十進制值,這個變量是`src`指向的`dst`指向的數值變量, 成功時返回0,錯誤的情況下返回-1,包括溢出。 由于十進制類型作為數值類型的有限版本實現的,不會發生這種轉換溢出。 ## 33.6.2\. 日期類型 C中的日期類型允許你的程序處理SQL類型的數據。參見[Section 8.5](#calibre_link-783) 獲得PostgreSQL服務器的等價類型。 下面的函數可以適用于日期類型: `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`無效。 注意,函數始終假定MDY格式化日期目前在ECPG還沒有改變。 [Table 33-2](#calibre_link-2236)顯示了允許輸入格式。 **Table 33-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`格式。 `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` - 2位數的年數。 * `yyyy` -4位數的年數。 * `ddd` - 某天的名字(縮略)。 * `mmm` - 某月份名字(縮略)。 所有其它的字符按1:1復制到輸出字符串中。 [Table 33-3](#calibre_link-2237)表示一些可能的格式。 這將讓你知道如何使用這些功能。所有輸出行基于相同的日期:1959年11月23號。 **Table 33-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`)的格式掩碼以及包含日期(`str`)文本表示的C char*字符串。 希望文本表示匹配格式掩碼。但是你不需要字符串1:1映射到格式掩碼。 這個函數僅分析相繼順序, 并且查找`yy`或者`yyyy`顯示年的位置, `mm`顯示月的位置,`dd`顯示一天的位置。 [Table 33-4](#calibre_link-2238)表明一些可能的格式。 這將讓你知道如果使用這個函數。 **Table 33-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年,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` | `oct 28 1975` | `1975-10-28` | | `mmddyy` | `Nov 14th, 1985` | `1985-11-14` | ## 33.6.3\. 時間戳類型 C中時間戳類型允許你的程序處理SQL類型時間戳數據。 參見[Section 8.5](#calibre_link-783) 獲取關于PostgreSQL服務器的等價類型。 下面的函數可以用于時間戳類型。 `PGTYPEStimestamp_from_asc` 將文本表示的時間戳解析成一個時間戳變量。 ``` timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr); ``` 函數接收一個解析(`str`)字符串和指向C char*(`endptr`)指針。 此刻ECPG總是解析完整字符串, 因此它目前不支持存儲`*endptr`中第一無效字符地址。 你可以安全地設置`endptr`為空。 成功時函數返回解析的時間戳,產生錯誤時返回`PGTYPESInvalidTimestamp`, 并且設置`errno`為`PGTYPES_TS_BAD_TIMESTAMP`。 參見[_`PGTYPESInvalidTimestamp`_](#calibre_link-2239)獲取這個值的重要注釋。 一般情況下,輸入的字符串可以包含一個所允許日期規范、 一個空格字符和允許的時間規范的任意組合。請注意,ECPG不支持時區。 它可以解析它們,但不適用于任何計算比如PostgreSQL服務器。 時區說明符默認是省略的。 [Table 33-5](#calibre_link-2240)包含輸入字符串的一些例子。 **Table 33-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); ``` 函數接收時間戳`tstamp`作為其唯一的參數 并返回一個包含時間戳的文本表示的分配的字符串。 `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` - 作為十進制數(00-23)按小時(24小時)進行替換。 * `%h` -等同于`%b`。 * `%I` - 作為十進制數(01-12)按小時(12小時)進行替換。 * `%j` - 作為十進制數(001-366)按一年的一天來替換。 * `%k` - 作為十進制數(0-23)按小時(24小時)替換; 單位數前面有空格。 * `%l` - 作為十進制數(1-12)按小時(12小時)替換; 單位數前面有空格。 * `%M` - 作為十進制數(00-59)按分鐘來替換。 * `%m` - 作為十進制數(01-12)按月替換。 * `%n` - 通過換行符替換。 * `%O*` - 等同于`%E*`。 * `%p` - 由合適的"午前"或"午后"的國家表示形式進行替換。 * `%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周。 * `%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); ``` 該函數將減去時間戳變量,這個變量是`ts2` 指向的`ts1`指向的時間戳的變量, 并將結果存儲在`iv`指向的時間戳變量中。 成功時,函數返回0。如果發生錯誤則返回一個負值。 `PGTYPEStimestamp_defmt_asc` 從使用格式掩碼的文本表示中分析一個時間戳值。 ``` int PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d); ``` 這個函數接受變量`str`時間戳的文本表示 以及格式掩碼中使用的變量`fmt`。 結果將存儲在`d`指向的變量中。 如果格式掩碼`fmt`是空, 該函數將回落到缺省格式掩碼`%Y-%m-%d%H:%M:%S`。 這是[_`PGTYPEStimestamp_fmt_asc`_](#calibre_link-2080)的反向函數。 參見文檔找出可能的格式掩碼項。 `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); ``` 這個函數減去interval變量,這個變量是`span` 指向的`tin`指向的timestamp變量, 并且將結果存儲在`tout`指向的變量中。 成功時,這個函數返回0。當產生錯誤的時候,返回負數。 ## 33.6.4\. 區間類型 C中區間類型允許你的程序處理SQL類型區間的數據。 參見[Section 8.5](#calibre_link-783)獲取 PostgreSQL服務器的等價類型。 下面的函數可以用于區間類型: `PGTYPESinterval_new` 返回一個已分配的區間變量的指針。 ``` interval *PGTYPESinterval_new(void); ``` `PGTYPESinterval_free` 釋放已經分配區間變量的內存。 ``` void PGTYPESinterval_new(interval *intvl); ``` `PGTYPESinterval_from_asc` 解析文本表示的區間。 ``` interval *PGTYPESinterval_from_asc(char *str, char **endptr); ``` 該函數解析輸入的字符串`str`并返回分配區間變量的指針。 此刻ECPG總是解析完整的字符串,所以目 前不支持存儲在`*endptr`中的第一無效字符的地址。 你可以安全地設置`endptr`為空。 `PGTYPESinterval_to_asc` 將類型區間的變量轉換成它的文本表示。 ``` char *PGTYPESinterval_to_asc(interval *span); ``` 該函數將轉換`span`指向C char*的區間變量, 輸出看起來像這樣的例子:`@ 1 day 12 hours 59 mins 10 secs`。 `PGTYPESinterval_copy` 復制區間類型的變量。 ``` int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest); ``` 該函數復制`intvlsrc`指向`intvldest`指向的區間變量,注意, 你需要在目標變量前分配內存。 ## 33.6.5\. 十進制類型 decimal類型和numeric類型是類似的。然而, 它僅僅是一個30位數的最大精度。相反, numeric類型只能在堆上創建,decimal類型可以在棧或堆上創建 (通過函數`PGTYPESdecimal_new`和 `PGTYPESdecimal_free`)。 [Section 33.15](#calibre_link-2042)中描述的 Informix兼容模式還有很多處 理decimal類型的其他函數。 下面的函數可以用于decimal類型,不僅包含在`libcompat`庫中。 `PGTYPESdecimal_new` 請求一個新分配的decimal變量的指針。 ``` decimal *PGTYPESdecimal_new(void); ``` `PGTYPESdecimal_free` 任意decimal類型,釋放所有內存。 ``` void PGTYPESdecimal_free(decimal *var); ``` ## 33.6.6\. pgtypeslib的errno值 `PGTYPES_NUM_BAD_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` 無效的timestamp字符串被傳遞給`PGTYPEStimestamp_from_asc`函數, 或者無效timestamp值被傳遞給`PGTYPEStimestamp_to_asc`函數。 `PGTYPES_TS_ERR_EINFTIME` 在環境中遇到的無限timestamp值不能處理它。 ## 33.6.7\. pgtypeslib的特殊常量 `PGTYPESInvalidTimestamp` 代表一個無效的時間戳的timestamp類型的值。 這是通過函數`PGTYPEStimestamp_from_asc`返回解析錯誤。 請注意,由于該`timestamp`數據類型的內部表示, 同時`PGTYPESInvalidTimestamp`也是一個有效的timestamp。 它設置`1899-12-31 23:59:59`。為了檢測錯誤, 確保你的應用每次調用`PGTYPEStimestamp_from_asc`后 不僅測試`PGTYPESInvalidTimestamp`也能檢測`errno != 0`。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看