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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 33.15\. Informix兼容模式 `ecpg`可以在所謂的 _Informix兼容模式_下運行。 如果這種模式是活躍的,它試圖表現得好像Informix E/SQL的Informix預編譯器。 通常所說的這將允許你使用美元符號, 而不是`EXEC SQL`原始的引入嵌入式的SQL命令。 ``` $int j = 3; $CONNECT TO :dbname; $CREATE TABLE test(i INT PRIMARY KEY, j INT); $INSERT INTO test(i, j) VALUES (7, :j); $COMMIT; ``` > **Note:** 在`$`之間不能有任何空格和下面的預處理指令, 即`include`,`define`, `ifdef`等等。否則,預處理器將解析令牌作為宿主變量。 有兩種兼容模式:`INFORMIX`, `INFORMIX_SE`。 當使用這些兼容模式連接程序時,記得要鏈接`libcompat`前內置于ECPG中。 除了前面所說的語法塊, Informix兼容模式為輸入輸出和數據轉換功能, 以及從E/SQL到ECPG嵌入式SQL語句提供一些函數。 Informix兼容模式緊密聯系ECPG的pgtypeslib庫。 pgtypeslib在C主機程序映射SQL數據類型到數據類型,并且 Informix 兼容模式的大部分附加函數允許你在那些C主機程序類型上進行操作。 但值得注意的是,兼容性的程度是有限的。它并不試圖復制Informix的操作;它允許你做或多或少相同的操作,使你具有相同的名稱和相同的基本行為功能,但如果你現在使用Informix,它沒有下拉式功能表位置。 此外,一些數據類型是不同的。比如,PostgreSQL的 datetime和 區間類型不知道范圍比如`YEAR TO MINUTE`, 因此你在ECPG的這兩種類型中不會找到支持。 ## 33.15.1\. 附加類型 在不使用`typedef`的Informix模式中 現在支持為存儲正確修剪字符串數據 Informix特殊"字符串"偽類型。 實際上,在Informix模式中,ECPG拒絕包含`typedef sometype string;`的過程源文件。 ``` EXEC SQL BEGIN DECLARE SECTION; string userid; /* 這個變量將包含修剪的數據 */ EXEC SQL END DECLARE SECTION; EXEC SQL FETCH MYCUR INTO :userid; ``` ## 33.15.2\. 附加的/失蹤的嵌入的SQL語句 `CLOSE DATABASE` 這個語句關閉當前連接。事實上,這是ECPG的 `DISCONNECT CURRENT`的同義詞: ``` $CLOSE DATABASE; /* 關閉當前連接 */ EXEC SQL CLOSE DATABASE; ``` `FREE cursor_name` 由于ECPG與Informix的ESQL/C如何運行的不同(即這個步驟是純粹的語法轉換并且依賴于底層運行時的庫)在ECPG中沒有 `FREE cursor_name`聲明。 這是因為在ECPG中,`DECLARE CURSOR`不轉化為使用游標名稱調用運行時庫的一個函數。 這意味著,在ECPG中運行時庫中SQL游標沒有運行時的記錄,只有在PostgreSQL服務器上。 `FREE statement_name` `FREE statement_name`是 `DEALLOCATE PREPARE statement_name`的同義詞。 ## 33.15.3\. Informix兼容SQLDA描述符區域 Informix兼容模式支持一個 比[Section 33.7.2](#calibre_link-2007)描述中的不同的結構。見下文: ``` struct sqlvar_compat { short sqltype; int sqllen; char *sqldata; short *sqlind; char *sqlname; char *sqlformat; short sqlitype; short sqlilen; char *sqlidata; int sqlxid; char *sqltypename; short sqltypelen; short sqlownerlen; short sqlsourcetype; char *sqlownername; int sqlsourceid; char *sqlilongdata; int sqlflags; void *sqlreserved; }; struct sqlda_compat { short sqld; struct sqlvar_compat *sqlvar; char desc_name[19]; short desc_occ; struct sqlda_compat *desc_next; void *reserved; }; typedef struct sqlvar_compat sqlvar_t; typedef struct sqlda_compat sqlda_t; ``` 全局屬性是: `sqld` 在`SQLDA`描述符中的字段的數目。 `sqlvar` 每個字段屬性的指針。 `desc_name` 未使用的,填充零字節。 `desc_occ` 分配的結構大小。 `desc_next` 如果結果集中包含1個以上的記錄,指向下一個SQLDA結構的指針。 `reserved` 未使用指針,包含空。保持Informix兼容。 下面每個字段屬性,它們被存儲在`sqlvar`數組中: `sqltype` 字段類型。常量在`sqltypes.h`中。 `sqllen` 字段數據的長度。 `sqldata` 指向字段數據的指針。指針是`char *`類型, 通過它指出的數據是二進制格式。例子: ``` int intval; switch (sqldata-&gt;sqlvar[i].sqltype) { case SQLINTEGER: intval = *(int *)sqldata-&gt;sqlvar[i].sqldata; break; ... } ``` `sqlind` 指向空指針。如果通過DESCRIBE或取回后,那么它總是一個有效的指針。 如果使用`EXECUTE ... USING sqlda;` 作為輸入,然后空指針值意味著該字段的值為非空。否則,一個有效的指針 和`sqlitype`必須正確設置。例子: ``` if (*(int2 *)sqldata-&gt;sqlvar[i].sqlind != 0) printf("value is NULL\n"); ``` `sqlname` 字段名稱。0終止字符串。 `sqlformat` 保留在Informix中,`PQfformat()`的值為字段的值。 `sqlitype` 空指針的數據類型。當從服務器返回數據時,它總是SQLSMINT。 當`SQLDA`用于參數化查詢時, 數據是根據設定的類型來處理的。 `sqlilen` 空指針數據的長度。 `sqlxid` 字段的擴展類型,結果`PQftype()`。 `sqltypename``sqltypelen` `sqlownerlen` `sqlsourcetype` `sqlownername` `sqlsourceid` `sqlflags` `sqlreserved` 未使用。 `sqlilongdata` 如果`sqllen`大于32KB。它等于`sqldata`。 例子: ``` EXEC SQL INCLUDE sqlda.h; sqlda_t *sqlda; /* 這個不需要在嵌入DECLARE SECTION的下面 */ EXEC SQL BEGIN DECLARE SECTION; char *prep_stmt = "select * from table1"; int i; EXEC SQL END DECLARE SECTION; ... EXEC SQL PREPARE mystmt FROM :prep_stmt; EXEC SQL DESCRIBE mystmt INTO sqlda; printf("# of fields: %d\n", sqlda->sqld); for (i = 0; i < sqlda->sqld; i++) printf("field %d: \"%s\"\n", sqlda->sqlvar[i]->sqlname); EXEC SQL DECLARE mycursor CURSOR FOR mystmt; EXEC SQL OPEN mycursor; EXEC SQL WHENEVER NOT FOUND GOTO out; while (1) { EXEC SQL FETCH mycursor USING sqlda; } EXEC SQL CLOSE mycursor; free(sqlda); /* 主結構被free(), sqlda和sqlda->sqlvar在分配區域中*/ ``` 獲取更多信息,參見`sqlda.h`頭文件和 `src/interfaces/ecpg/test/compat_informix/sqlda.pgc` 回歸測試。 ## 33.15.4\. 附加函數 `decadd` 增加2個decimal類型值。 ``` int decadd(decimal *arg1, decimal *arg2, decimal *sum); ``` 這個函數接受一個指向類型decimal(`arg1`)的第一個操作數的指針, 類型decimal (`arg2`)的第二個操作數的指針和包含sum (`sum`)類型decimal值的指針。成功時,函數返回0。 以免溢出返回`ECPG_INFORMIX_NUM_OVERFLOW`和在下溢的情況下返回 `ECPG_INFORMIX_NUM_UNDERFLOW`。其他錯誤返回-1, `errno`設置為pgtypeslib的各自的`errno`數。 `deccmp` 比較decimal類型的2個變量。 ``` int deccmp(decimal *arg1, decimal *arg2); ``` 這個函數接受一個指向第一個decimal值(`arg1`)的指針, 一個指向第二個decimal值(`arg2`)的指針并返回 一個表示這是更大值的整數值。 * 如果`arg1`指向比`var2`指向的值更大,則為1。 * 如果`arg1`指向比`arg2`指向的值更小,則為-1。 * 如果`arg1`指向和`arg2`指向的值相等,則為0。 `deccopy` 復制一個decimal值。 ``` void deccopy(decimal *src, decimal *target); ``` 這個函數接受一個指向復制為第一個參數(`src`) 的decimal值的指針和 一個指向decimal(`target`)的目標結構作為第二個參數的指針。 `deccvasc` 將一個值從ASCII表示轉換為decimal類型。 ``` int deccvasc(char *cp, int len, decimal *np); ``` 這個函數接受一個指向字符串的指針, 這個字符串包含轉換成和其長度一樣為`len` 的(`cp`)數字的字符串表示形式。 `np`是一個指向decimal值的指針,節省了運算的結果。 有效格式比如:`-2`, `.794`, `+3.44`, `592.49E07`或者 `-32.84e-4`。 函數成功時返回0。如果發生溢出或下溢, 返回`ECPG_INFORMIX_NUM_OVERFLOW`或者 `ECPG_INFORMIX_NUM_UNDERFLOW`。如果ASCII表示不能被解析, 返回`ECPG_INFORMIX_BAD_NUMERIC`, 如果解析指數發生此問題時返回`ECPG_INFORMIX_BAD_EXPONENT`。 `deccvdbl` 轉換double類型的值到一個decimal類型的值。 ``` int deccvdbl(double dbl, decimal *np); ``` 函數接收一個被作為第一個參數(`dbl`)轉換的double類型的變量。 作為第二個參數(`np`), 函數接收一個指向保持操作結果的decimal變量的指針。 成功時函數返回0,如果轉換失敗則返回一個負數。 `deccvint` 轉換一個int類型的值到一個decimal類型的值。 ``` int deccvint(int in, decimal *np); ``` 函數接收應作為第一個參數(`in`)轉換的int類型的變量。作為第二個參數(`np`),函數接收一個指向保持操作結果的decimal變量的指針。 成功時函數返回0,如果轉換失敗則返回一個負數。 `deccvlong` 轉換一個long類型的值到一個decimal類型的值。 ``` int deccvlong(long lng, decimal *np); ``` 函數接收應作為第一個參數(`lng`)轉換的long類型的變量。 作為第二個參數(`np`),函數接收一個指向保持操作 結果的decimal變量的指針。 成功時函數返回0,如果轉換失敗則返回一個負數。 `decdiv` decimal類型的兩個變量相除。 ``` int decdiv(decimal *n1, decimal *n2, decimal *result); ``` 函數接收一個指向第一個(`n1`)和第二個(`n2`)操作數變量的指針并且計算`n1`/`n2`。 `result`是指向保持操作結果的變量的指針。 成功則返回0,如果除法運算失敗則返回一個負數。如果產生溢出或者下溢,函數各自返回`ECPG_INFORMIX_NUM_OVERFLOW`或者 `ECPG_INFORMIX_NUM_UNDERFLOW`。 如果觀察到嘗試除以0, 函數返回`ECPG_INFORMIX_DIVIDE_ZERO`。 `decmul` 兩個decimal值相乘。 ``` int decmul(decimal *n1, decimal *n2, decimal *result); ``` 函數接收指向第一個(`n1`)和第二個(`n2`)操作數變量的指針并且計算`n1`*`n2`。 `result`是指向保持操作結果的變量的指針。 成功則返回0,如果乘法運算失敗則返回一個負數。如果發生溢出或者下溢,函數各自返回 `ECPG_INFORMIX_NUM_OVERFLOW`或者 `ECPG_INFORMIX_NUM_UNDERFLOW`。 `decsub` 一個decimal值與另一個值相減。 ``` int decsub(decimal *n1, decimal *n2, decimal *result); ``` 函數接收指向第一個(`n1`)和第二個(`n2`)操作數變量的指針并且計算`n1`-`n2`。 `result`是指向保持操作結果的變量的指針。 成功則返回0,如果減法運算失敗則返回一個負數。如果發生溢出或者下溢,函數各自返回`ECPG_INFORMIX_NUM_OVERFLOW`或者 `ECPG_INFORMIX_NUM_UNDERFLOW`。 `dectoasc` 轉換一個decimal類型變量到C char*字符串中ASCII表示。 ``` int dectoasc(decimal *np, char *cp, int len, int right) ``` 函數接收一個指向decimal(`np`)類型文本表示的變量的指針。 `cp`是保存操作結果的緩沖區。參數`right`指明小數點右邊有多少位數字應該包含在輸出中。結果將四舍五入小數數字位數。設置`right`到-1表明所有可用的小數位數應包含在輸出中。如果由`len` 指明的輸出緩沖區的長度不足以保持包含尾隨NUL字符的文本表示,僅僅在結果中存儲一個單一的`*`字符并且返回-1。 如果緩沖區`cp`太小,函數則返回-1,如果內存耗盡, 則返回`ECPG_INFORMIX_OUT_OF_MEMORY`。 `dectodbl` 轉換一個decimal類型的變量到一個double類型。 ``` int dectodbl(decimal *np, double *dblp); ``` 函數接受一個指向decimal值轉換(`np`)和 一個指向應保持操作結果(`dblp`)的double變量的指針。 成功則返回0,如果轉換失敗則返回一個負數。 `dectoint` 轉化一個decimal類型到一個integer類型的變量。 ``` int dectoint(decimal *np, int *ip); ``` 函數接受一個指向decimal值轉換(`np`)和 指向應保持操作結果(`ip`)的integer變量的指針。 成功則返回0,如果轉換失敗則返回一個負數。如果發生溢出, 則返回`ECPG_INFORMIX_NUM_OVERFLOW`。 注意ECPG應用不同于Informix應用。 當ECPG應用中的限制取決于(`-INT_MAX .. INT_MAX`)的結構,Informix 限制integer的范圍從-32767到32767。 `dectolong` 轉換一個decimal類型的變量到一個long integer類型。 ``` int dectolong(decimal *np, long *lngp); ``` 函數接受一個decimal值轉換(`np`)和 一個應保持操作結果(`lngp`)的long變量的指針。 成功則返回0,如果轉換失敗則返回一個負數。 如果發生溢出,則返回`ECPG_INFORMIX_NUM_OVERFLOW`。 注意ECPG應用不同于Informix應用。當ECPG應用中的限制取決于(`-LONG_MAX ..LONG_MAX`)的結構,Informix限制long integer的范圍從-2,147,483,647到2,147,483,647。 `rdatestr` 轉換一個date類型到C char*字符串。 ``` int rdatestr(date d, char *str); ``` 這個函數接收2個參數,第一個是日期轉換(`d`和第二個參數是一個指向目標字符串的指針。輸出格式總是`yyyy-mm-dd`,因此你需要為字符串至少分配11個字節(包含0字節終止符)。 成功函數則返回0,出錯時則返回一個負數。 注意ECPG應用不同于Informix應用。 Informix中格式受到環境變量設置的影響。 然而在ECPG中,你不能改變輸出格式。 `rstrdate` 解析日期的文本表示。 ``` int rstrdate(char *str, date *d); ``` 這個函數接受日期轉換(`str`)的文本表示形式和指向類型date(`d`)的變量的指針。這個函數不允許你指明格式掩碼。它使用Informix缺省格式掩碼`mm/dd/yyyy`。實質上,它通過`rdefmtdate`實現的。因此,`rstrdate`不是很快,如果你有選擇了,你應該選擇`rdefmtdate`,它允許你明確指定掩碼格式。 函數返回和`rdefmtdate`一樣的值。 `rtoday` 獲取當前日期。 ``` void rtoday(date *d); ``` 函數接受一個設置當前日期的日期變量(`d`)的指針。 實質上這個函數使用[_`PGTYPESdate_today`_](#calibre_link-2072)函數。 `rjulmdy` 從date類型的變量中提取一天,一個月,一年中的值。 ``` int rjulmdy(date d, short mdy[3]); ``` 這個函數接受日期`d`和一個指向3個短整型數值`mdy`數組的指針,變量名表明了相繼順序:`mdy[0]` 的設置包含了月數,`mdy[1]`的設置是一天的值, `mdy[2]`包含年的值。 函數此時總是返回0。 實質上函數使用[_`PGTYPESdate_julmdy`_](#calibre_link-2073)函數。 `rdefmtdate` 使用格式掩碼轉換字符串到一個date類型的值。 ``` int rdefmtdate(date *d, char *fmt, char *str); ``` 函數接受一個保持操作(`d`)結果日期值的指針。 格式掩碼用于解析日期(`fmt`)和包含date(`str`)文本表示形式的C char*字符串。文本表示形式期望匹配格式掩碼。然而你不需要有一個1:1字符串映射格式掩碼。它僅分析相繼順序并且查找`yy`或者 `yyyy`表明年的位置,`mm`表示月份 和`dd`表示一天的位置。 函數返回下列值: * 0 - 函數成功終止。 * `ECPG_INFORMIX_ENOSHORTDATE` - 在日,月和年之間日期不包含定界符。 在這種情況下輸入字符串必須確切地6或8個字節但是不是這樣的。 * `ECPG_INFORMIX_ENOTDMY` - 格式字符串不能正確顯示年,月,日的相繼順序。 * `ECPG_INFORMIX_BAD_DAY` - 輸入字符串不包含一個有效的天數。 * `ECPG_INFORMIX_BAD_MONTH` - 輸入字符串不包含一個有效的月份。 * `ECPG_INFORMIX_BAD_YEAR` - 輸入字符串不包含一個有效的年份。 實質上這個函數使用[_`PGTYPESdate_defmt_asc`_](#calibre_link-2074)函數來實現。 請參閱這兒的實例輸入的表。 `rfmtdate` 轉換一個date類型變量到它的一個格式掩碼的文本表示。 ``` int rfmtdate(date d, char *fmt, char *str); ``` 這個函數接收一個日期轉換(`d`), 格式掩碼(`fmt`)和將保持日期(`str`)的文本表示形式 的字符串。 成功返回0,如果產生錯誤則返回一個負值。 實質上這個函數 使用[_`PGTYPESdate_fmt_asc`_](#calibre_link-2075)函數。請參閱這兒的例子。 `rmdyjul` 從指明日期中的年,月,日的3維短整型數組中創建一個日期值。 ``` int rmdyjul(short mdy[3], date *d); ``` 這個函數接收一個3維短整型(`mdy`)數組 和一個指向應保持操作結果的日期類型變量的指針。 當前這個函數總是返回0。 實質上這個函數使用[_`PGTYPESdate_mdyjul`_](#calibre_link-2076)來實現。 `rdayofweek` 返回一個數字表示的一個日期值中某一周的某一天。 ``` int rdayofweek(date d); ``` 函數接收日期變量`d`作為其唯一的參數并返回一個整數, 表示這一天是星期幾。 * 0 - 星期日 * 1 - 星期一 * 2 - 星期二 * 3 - 星期三 * 4 - 星期四 * 5 - 星期五 * 6 - 星期六 實質上這個函數使用[_`PGTYPESdate_dayofweek`_](#calibre_link-2077)來實現。 `dtcurrent` 檢索當前的timestamp。 ``` void dtcurrent(timestamp *ts); ``` 這個函數檢索當前timestamp并且保存 它到`ts`指向的timestamp變量中。 `dtcvasc` 解析一個文本表示的timestamp到一個timestamp變量。 ``` int dtcvasc(char *str, timestamp *ts); ``` 這個函數接收解析字符串(`str`) 和一個指向應保持操作結果(`ts`)的timestamp變量的指針。 成功時函數返回0,發生錯誤的時候返回負數。 實質上這個函數使用 [_`PGTYPEStimestamp_from_asc`_](#calibre_link-2078)函數。 請參見這兒的實例輸入的表。 `dtcvfmtasc` 使用格式掩碼解析文本表示的timestamp為timestamp變量。 ``` dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue) ``` 這個函數接收解析(`inbuf`)字符串, 使用(`fmtstr`)格式掩碼, 以及一個指向保持操作(`dtvalue`)結果的timestamp變量的指針。 這個函數 通過[_`PGTYPEStimestamp_defmt_asc`_](#calibre_link-2079) 函數來實現。參見文檔中使用的格式說明符列表。 成功時函數返回0,發生錯誤的時候則返回一個負數。 `dtsub` 一個timestamp與另一個相減,并且返回一個區間類型變量。 ``` int dtsub(timestamp *ts1, timestamp *ts2, interval *iv); ``` 該函數將時間戳變量相減, 其中`ts2`指向`ts1`指向的時間戳變量, 并將結果存儲在`iv`指向的區間變量中。 成功時函數返回0,如果發生錯誤則返回一個負數。 `dttoasc` 轉換一個timestamp變量到C char*字符串。 ``` int dttoasc(timestamp *ts, char *output); ``` 這個函數接收一個指向timestamp變量轉換(`ts`) 的指針和保持操作`output`結果的字符串。 根據SQL標準,轉換`ts`到它的一個文本表示形式, 即`YYYY-MM-DD HH:MM:SS`。 成功函數返回0,如果產生錯誤則返回負數。 `dttofmtasc` 使用格式掩碼將timestamp變量轉換成C char*。 ``` int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr); ``` 這個函數接收一個指向作為第一個參數(`ts`)轉換的timestamp的指針,以及指向輸出緩存(`output`)的指針, 已經分配給輸出緩存(`str_len`)的 最大長度和用于轉換(`fmtstr`)的格式掩碼。 成功時函數返回0,如果產生錯誤則返回一個負數。 實質上,這個函數 使用[_`PGTYPEStimestamp_fmt_asc`_](#calibre_link-2080)函數。 請參閱有關格式掩碼說明的使用獲取更多信息。 `intoasc` 將區間變量轉換成C char*字符串。 ``` int intoasc(interval *i, char *str); ``` 這個函數接收一個指向區間 變量轉換(`i`)的指針和 保持操作(`str`)結果的字符串。 它依照SQL標準將`i`轉換成文本表示形式, 即`YYYY-MM-DD HH:MM:SS`。 成功時函數返回0,如果產生錯誤則返回負數。 `rfmtlong` 將長整型數值轉換成使用格式掩碼的文本表示形式。 ``` int rfmtlong(long lng_val, char *fmt, char *outbuf); ``` 這個函數接收長值`lng_val`, 格式掩碼`fmt`和指向輸出緩存`outbuf`的指針。 它依照格式掩碼將長值轉換成文本表示形式。 格式掩碼由下面格式指定字符組成。 * `*`(星號) – 如果這個位置是空白的,否則,用星號填充。 * `&`(&符號) -如果這個位置是空白的,否則,用零填充。 * `#` - 將前導零轉換成空格。 * `&lt;` -字符串中左對齊數字。 * `,`(逗號)–將四個或更多數字分成由逗號分隔的三個數字一組。 * `.`(句號) – 這個字符將從小數部分分離出數的整數部分。 * `-` (減號) – 如果數是負值,則出現負號。 * `+`(加號) -如果數是正值,則出現加號。 * `(` -這將替代負數前面的減號。減號將不會出現。 * `)` -這個字符替代減號,并且在負數后面輸出。 * `$` - 貨幣符號。 `rupshift` 將字符串轉換為大寫。 ``` void rupshift(char *str); ``` 這個函數接收一個指向字符串的指針,并且將每個小寫字符轉換成大寫字符。 `byleng` 返回沒有計算空格的字符串中字符的數量。 ``` int byleng(char *str, int len); ``` 這個函數期望固定長度字符串作為它第一個參數(`str`), 并且其長度作為第二個參數(`len`)。 它返回重要字符數,它是沒有空格的字符串的長度。 `ldchar` 復制一個固定長度字符串到空終止符字符串中。 ``` void ldchar(char *src, int len, char *dest); ``` 函數接收固定長度的字符串復制(`src`), 其長度(`len`)和一個指向目標內存(`dest`)的指針。 注意,你需要為`dest`指向的字符串至少儲備`len+1`字節。 函數復制最多`len`字節到新的位置(至少如果源字符串有尾隨空格) 和添加空終止符。 `rgetmsg` ``` int rgetmsg(int msgnum, char *s, int maxsize); ``` 這個函數存在但此刻不能實現。 `rtypalign` ``` int rtypalign(int offset, int type); ``` 這個函數存在但此刻不能實現。 `rtypmsize` ``` int rtypmsize(int type, int len); ``` 這個函數存在但此刻不能實現。 `rtypwidth` ``` int rtypwidth(int sqltype, int sqllen); ``` 這個函數存在但此刻不能實現。 `rsetnull` 設置一個變量為空。 ``` int rsetnull(int t, char *ptr); ``` 這個函數接收一個表明變量類型的整數和一個指向映射到C char*指針的變量自身的指針。 存在下面類型: * `CCHARTYPE` - 為了類型`char` 或者`char*`的變量 * `CSHORTTYPE` - 為了類型`short int`的變量 * `CINTTYPE` -為了類型為`int`的變量 * `CBOOLTYPE` -為了類型`boolean`的變量 * `CFLOATTYPE` - 為了類型`float`的變量 * `CLONGTYPE` - 為了類型`long`的變量 * `CDOUBLETYPE` - 為了類型`double`的變量 * `CDECIMALTYPE` - 為了類型`decimal`的變量 * `CDATETYPE` - 為了類型`date`的變量 * `CDTIMETYPE` - 為了類型`timestamp`的變量 下面是調用這個函數的一個例子: ``` $char c[] = "abc "; $short s = 17; $int i = -74874; rsetnull(CCHARTYPE, (char *) c); rsetnull(CSHORTTYPE, (char *) &s); rsetnull(CINTTYPE, (char *) &i); ``` `risnull` 如果變量是空,測試: ``` int risnull(int t, char *ptr); ``` 這個函數接收測試(`t`)變量的類型以及 一個指向這個變量(`ptr`)的指針。 注意后者需要映射到一個char*。 參見函數[_`rsetnull`_](#calibre_link-2081)獲取可能變量類型的列表。 這兒是如何使用這個函數的一個例子: ``` $char c[] = "abc "; $short s = 17; $int i = -74874; risnull(CCHARTYPE, (char *) c); risnull(CSHORTTYPE, (char *) &s); risnull(CINTTYPE, (char *) &i); ``` ## 33.15.5\. 附加常量 注意,這里所有的常量描述錯誤,他們都被定義為代表負數。 不同常量的描述中,你還可以發現,目前的應用中表示常量的值。 然而你不應該依賴于數量。但是你可以依靠它們被定義為表示負數的事實。 `ECPG_INFORMIX_NUM_OVERFLOW` 如果在計算中發生溢出,函數返回這個值。 實質上它被定義為-1200(Informix定義)。 `ECPG_INFORMIX_NUM_UNDERFLOW` 如果在計算中發生下溢,函數返回這個值。 實質上它被定義為-1201(Informix定義)。 `ECPG_INFORMIX_DIVIDE_ZERO` 如果觀察到嘗試除以零,函數返回這個值。實質上它被定義為 -1202(Informix定義)。 `ECPG_INFORMIX_BAD_YEAR` 如果當解析一個日期時,發現某年的一個錯誤值,函數返回這個值。實質上它被定義為-1204(Informix定義)。 `ECPG_INFORMIX_BAD_MONTH` 如果當解析一個日期時,發現某月的一個錯誤值,函數返回這個值。實質上它被定義為-1205(Informix定義)。 `ECPG_INFORMIX_BAD_DAY` 如果解析一個日期的時候,發現某天的錯誤值,函數返回這個值,實質上它被定義為-1206(Informix定義)。 `ECPG_INFORMIX_ENOSHORTDATE` 如果解析程序需要一個短日期表示形式而沒有獲得正確長度的日期字符串,函數則返回這個數值。 實質上它被定義為-1209(Informix定義)。 `ECPG_INFORMIX_DATE_CONVERT` 如果在日期格式之間發生錯誤,那么函數返回該值。 實質上它被定義為-1210(Informix定義)。 `ECPG_INFORMIX_OUT_OF_MEMORY` 如果在操作期間內存耗盡,那么函數返回該值。實質上 它被定義為-1211(Informix定義)。 `ECPG_INFORMIX_ENOTDMY` 如果解析程序應該得到一個掩碼格式 (如`mmddyy`)但不是所有的字段都被正確地列出來,函數返回該值。 實質上它被定義為-1212(Informix定義)。 `ECPG_INFORMIX_BAD_NUMERIC` 如果一個解析程序無法解析為數字值的文本表示, 因為它包含錯誤,或者如果程序不能完成涉及數值變量的計算, 因為至少這些數值變量之一是無效的。那么該函數返回這個值。 實質上它被定義為-1213(Informix定義)。 `ECPG_INFORMIX_BAD_EXPONENT` 如果解析程序無法解析指數,那么該函數返回此值。 實質地被定義為-1216 (Informix定義)。 `ECPG_INFORMIX_BAD_DATE` 如果解析程序不能解析日期,那么該函數返回此值。 實質上它被定義為-1218(Informix定義)。 `ECPG_INFORMIX_EXTRA_CHARS` 如果不能解析的多余字符被傳遞給解析程序,那么該函數返回這個值。 實質上它被定義為-1264(Informix定義)。
                  <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>

                              哎呀哎呀视频在线观看