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;
在 $
和後續的預處理器指令(即 include
、define
、ifdef
等)之間,不得有任何空白。 否則,預處理器會將該 token 解析為主機變數。
有兩種相容模式:INFORMIX
、INFORMIX_SE
連結使用此相容模式的程式時,請記住連結 ECPG 隨附的 libcompat
。
除了先前解釋過的語法糖之外,Informix 相容模式還將一些用於資料輸入、輸出和轉換的函數,以及 E/SQL 已知的嵌入式 SQL 陳述式移植到 ECPG。
Informix 相容模式與 ECPG 的 pgtypeslib 函式庫密切相關。 pgtypeslib 將 SQL 資料類型對應到 C 主機程式中的資料類型,並且 Informix 相容模式的大多數額外函數都允許您對這些 C 主機程式類型進行操作。 但是請注意,相容性的範圍是有限的。 它不會嘗試複製 Informix 的行為; 它允許您執行大致相同的操作,並為您提供具有相同名稱和相同基本行為的函數,但如果您目前正在使用 Informix,它並不是一個直接替換方案。 此外,某些資料類型有所不同。 例如,PostgreSQL 的日期時間和間隔類型不知道像 YEAR TO MINUTE
這樣的範圍,因此您也不會在 ECPG 中找到對它的支援。
Informix 專用的 "string" 虛擬類型,用於儲存經過右側修剪的字元串資料,現在在 Informix 模式下受到支援,無需使用 typedef
。 事實上,在 Informix 模式下,ECPG 拒絕處理包含 typedef sometype string;
的原始檔。
EXEC SQL BEGIN DECLARE SECTION; string userid; /* this variable will contain trimmed data */ EXEC SQL END DECLARE SECTION; EXEC SQL FETCH MYCUR INTO :userid;
CLOSE DATABASE
#此陳述式會關閉目前的連線。 事實上,這是 ECPG 的 DISCONNECT CURRENT
的同義詞。
$CLOSE DATABASE; /* close the current connection */ 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
的同義詞。
Informix 相容模式支援與 第 34.7.2 節 中描述的結構不同的結構。 請參閱下文
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;
全域屬性為
每個欄位的屬性如下,它們儲存在 sqlvar
陣列中。
sqltype
#欄位的類型。常數位於 sqltypes.h
中。
sqllen
#欄位資料的長度。
sqldata
#指向欄位資料的指標。指標的類型為 char *
,它指向的資料採用二進位格式。範例
int intval; switch (sqldata->sqlvar[i].sqltype) { case SQLINTEGER: intval = *(int *)sqldata->sqlvar[i].sqldata; break; ... }
sqlind
#指向 NULL 指示器的指標。如果由 DESCRIBE 或 FETCH 回傳,則它始終是一個有效的指標。如果用作 EXECUTE ... USING sqlda;
的輸入,則 NULL 指標值表示此欄位的值不是 NULL。否則,它是一個有效的指標,並且 sqlitype
必須正確設定。範例
if (*(int2 *)sqldata->sqlvar[i].sqlind != 0) printf("value is NULL\n");
sqlname
#欄位的名稱。以 0 終止的字串。
sqlformat
#在 Informix 中保留,欄位的 PQfformat
的值。
sqlitype
#NULL 指示器資料的類型。從伺服器回傳資料時,它始終為 SQLSMINT。當 SQLDA
用於參數化查詢時,資料會根據設定的類型進行處理。
sqlilen
#NULL 指示器資料的長度。
sqlxid
#欄位的擴展類型,PQftype
的結果。
sqltypename
sqltypelen
sqlownerlen
sqlsourcetype
sqlownername
sqlsourceid
sqlflags
sqlreserved
#未使用。
sqlilongdata
#如果 sqllen
大於 32kB,則它等於 sqldata
。
範例
EXEC SQL INCLUDE sqlda.h; sqlda_t *sqlda; /* This doesn't need to be under embedded 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); /* The main structure is all to be free(), * sqlda and sqlda->sqlvar is in one allocated area */
有關更多信息,請參閱 sqlda.h
標頭和 src/interfaces/ecpg/test/compat_informix/sqlda.pgc
迴歸測試。
decadd
#將兩個十進制類型值相加。
int decadd(decimal *arg1, decimal *arg2, decimal *sum);
該函數接收一個指向十進制類型的第一個運算元的指標 (arg1
)、一個指向十進制類型的第二個運算元的指標 (arg2
) 和一個指向將包含總和的十進制類型值的指標 (sum
)。成功時,該函數回傳 0。如果發生溢位,則回傳 ECPG_INFORMIX_NUM_OVERFLOW
,如果發生下溢,則回傳 ECPG_INFORMIX_NUM_UNDERFLOW
。對於其他失敗情況,回傳 -1,並且 errno
設定為 pgtypeslib 的相應 errno
數字。
deccmp
#比較兩個十進制類型的變數。
int deccmp(decimal *arg1, decimal *arg2);
該函數接收一個指向第一個十進制值的指標 (arg1
)、一個指向第二個十進制值的指標 (arg2
),並回傳一個整數值,該值指示哪個值更大。
1,如果 arg1
指向的值大於 var2
指向的值
-1,如果 arg1
指向的值小於 arg2
指向的值
0,如果 arg1
指向的值和 arg2
指向的值相等
deccopy
#複製一個十進制值。
void deccopy(decimal *src, decimal *target);
該函數接收一個指向應複製的十進制值的指標作為第一個參數 (src
),並接收一個指向十進制類型目標結構的指標 (target
) 作為第二個參數。
deccvasc
#將值從其 ASCII 表示形式轉換為十進制類型。
int deccvasc(char *cp, int len, decimal *np);
該函數接收一個指向字串的指標,該字串包含要轉換的數字的字串表示形式 (cp
) 以及它的長度 len
。np
是一個指向十進制值的指標,該值保存運算的結果。
有效的格式例如:-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 類型的值轉換為十進制類型的值。
int deccvdbl(double dbl, decimal *np);
該函數接收應轉換的 double 類型的變數作為其第一個參數 (dbl
)。作為第二個參數 (np
),該函數接收一個指向十進制變數的指標,該變數應保存運算的結果。
成功時,該函數回傳 0,如果轉換失敗,則回傳負數值。
deccvint
#將 int 類型的值轉換為十進制類型的值。
int deccvint(int in, decimal *np);
此函式接收一個 int 型別的變數,該變數將作為第一個引數 (in
) 被轉換。作為第二個引數 (np
),此函式接收一個指向 decimal 變數的指標,該變數將保存操作的結果。
成功時,該函數回傳 0,如果轉換失敗,則回傳負數值。
deccvlong
#將 long 型別的值轉換為 decimal 型別的值。
int deccvlong(long lng, decimal *np);
此函式接收一個 long 型別的變數,該變數將作為第一個引數 (lng
) 被轉換。作為第二個引數 (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
。 如果嘗試除以零,則此函式返回 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 值中減去一個 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
指示)不足以保存包含尾隨零位元組的文字表示法,則只會在結果中儲存一個 *
字元,並返回 -1。
如果緩衝區 cp
太小,則此函式返回 -1;如果記憶體已耗盡,則返回 ECPG_INFORMIX_OUT_OF_MEMORY
。
dectodbl
#將 decimal 型別的變數轉換為 double 型別。
int dectodbl(decimal *np, double *dblp);
此函式接收一個指向要轉換的 decimal 值的指標 (np
) 和一個指向應該保存操作結果的 double 變數的指標 (dblp
)。
成功時,返回 0;如果轉換失敗,則返回一個負值。
dectoint
#將 decimal 型別的變數轉換為 integer 型別。
int dectoint(decimal *np, int *ip);
此函式接收一個指向要轉換的 decimal 值的指標 (np
) 和一個指向應該保存操作結果的 integer 變數的指標 (ip
)。
成功時,返回 0;如果轉換失敗,則返回一個負值。 如果發生溢位,則返回 ECPG_INFORMIX_NUM_OVERFLOW
。
請注意,ECPG 實作與 Informix 實作不同。 Informix 將整數限制為 -32767 到 32767 的範圍,而 ECPG 實作中的限制取決於架構 (INT_MIN .. INT_MAX
)。
dectolong
#將 decimal 型別的變數轉換為 long integer 型別。
int dectolong(decimal *np, long *lngp);
此函式接收一個指向要轉換的 decimal 值的指標 (np
) 和一個指向應該保存操作結果的 long 變數的指標 (lngp
)。
成功時,返回 0;如果轉換失敗,則返回一個負值。 如果發生溢位,則返回 ECPG_INFORMIX_NUM_OVERFLOW
。
請注意,ECPG 實作與 Informix 實作不同。 Informix 將長整數限制為 -2,147,483,647 到 2,147,483,647 的範圍,而 ECPG 實作中的限制取決於架構 (-LONG_MAX .. LONG_MAX
)。
rdatestr
#將日期轉換為 C char* 字串。
int rdatestr(date d, char *str);
此函式接收兩個引數,第一個是要轉換的日期 (d
),第二個是指向目標字串的指標。 輸出格式始終為 yyyy-mm-dd
,因此您需要為字串配置至少 11 個位元組(包括零位元組終止符)。
成功時,此函式返回 0;如果發生錯誤,則返回一個負值。
請注意,ECPG 的實作與 Informix 的實作不同。 在 Informix 中,格式可能會受到設定環境變數的影響。 但是,在 ECPG 中,您無法變更輸出格式。
rstrdate
#剖析日期的文字表示法。
int rstrdate(char *str, date *d);
此函式接收要轉換的日期文字表示法 (str
),以及指向日期類型變數的指標 (d
)。此函式不允許您指定格式遮罩。 它使用 Informix 的預設格式遮罩,即 mm/dd/yyyy
。 在內部,此函式透過 rdefmtdate
實現。 因此,rstrdate
並不更快,如果您可以選擇,應該選擇允許您明確指定格式遮罩的 rdefmtdate
。
此函式傳回與 rdefmtdate
相同的值。
rtoday
#取得目前日期。
void rtoday(date *d);
此函式接收指向日期變數的指標 (d
),並將其設定為目前日期。
在內部,此函式使用 PGTYPESdate_today
函式。
rjulmdy
#從日期類型變數中提取日、月和年的值。
int rjulmdy(date d, short mdy[3]);
此函式接收日期 d
以及指向 3 個 short integer 值陣列的指標 mdy
。 變數名稱表示順序:mdy[0]
將設定為包含月份的數字,mdy[1]
將設定為日期的值,mdy[2]
將包含年份。
目前,此函式總是傳回 0。
在內部,此函式使用 PGTYPESdate_julmdy
函式。
rdefmtdate
#使用格式遮罩將字元串轉換為日期類型的值。
int rdefmtdate(date *d, char *fmt, char *str);
此函式接收指向應保存操作結果的日期值的指標 (d
)、用於剖析日期的格式遮罩 (fmt
) 和包含日期文字表示法的 C char* 字串 (str
)。 文字表示法應符合格式遮罩。 但是,您不需要字串與格式遮罩之間存在 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
函式來實現。 有關範例輸入的表格,請參閱此處的參考文檔。
rfmtdate
#使用格式遮罩將日期類型變數轉換為其文字表示法。
int rfmtdate(date d, char *fmt, char *str);
此函式接收要轉換的日期 (d
)、格式遮罩 (fmt
) 以及將保存日期文字表示法的字串 (str
)。
成功時,傳回 0;如果發生錯誤,則傳回負值。
在內部,此函式使用 PGTYPESdate_fmt_asc
函式,有關範例,請參閱此處的參考文檔。
rmdyjul
#從指定日期、月和年的 3 個 short integer 陣列建立日期值。
int rmdyjul(short mdy[3], date *d);
此函式接收 3 個 short integer 的陣列 (mdy
),以及指向應保存操作結果的日期類型變數的指標。
目前,此函式總是傳回 0。
在內部,此函式使用函式 PGTYPESdate_mdyjul
來實現。
rdayofweek
#傳回表示日期值的星期幾的數字。
int rdayofweek(date d);
此函式接收日期變數 d
作為其唯一引數,並傳回一個整數,指示此日期的星期幾。
0 - 星期日
1 - 星期一
2 - 星期二
3 - 星期三
4 - 星期四
5 - 星期五
6 - 星期六
在內部,此函式使用函式 PGTYPESdate_dayofweek
來實現。
dtcurrent
#檢索目前時間戳記。
void dtcurrent(timestamp *ts);
此函式檢索目前時間戳記,並將其儲存到 ts
指向的時間戳記變數中。
dtcvasc
#將時間戳記從其文字表示法剖析到時間戳記變數中。
int dtcvasc(char *str, timestamp *ts);
此函式接收要剖析的字串 (str
),以及指向應保存操作結果的時間戳記變數的指標 (ts
)。
成功時,此函式返回 0;如果發生錯誤,則返回一個負值。
在內部,此函式使用 PGTYPEStimestamp_from_asc
函式。 有關範例輸入的表格,請參閱此處的參考文檔。
dtcvfmtasc
#使用格式遮罩將時間戳記從其文字表示法剖析到時間戳記變數中。
dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue)
此函式接收要剖析的字串 (inbuf
)、要使用的格式遮罩 (fmtstr
) 以及指向應保存操作結果的時間戳記變數的指標 (dtvalue
)。
此函式透過 PGTYPEStimestamp_defmt_asc
函式來實現。 有關可使用的格式指定符的清單,請參閱此處的文檔。
成功時,此函式返回 0;如果發生錯誤,則返回一個負值。
dtsub
#從另一個時間戳記中減去一個時間戳記,並傳回間隔類型變數。
int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);
此函式將從 ts1
指向的時間戳記變數中減去 ts2
指向的時間戳記變數,並將結果儲存在 iv
指向的間隔變數中。
成功時,此函式傳回 0;如果發生錯誤,則傳回負值。
dttoasc
#將時間戳記變數轉換為 C char* 字串。
int dttoasc(timestamp *ts, char *output);
此函式接收指向要轉換的時間戳記變數的指標 (ts
),以及應保存操作結果的字串 (output
)。 它會根據 SQL 標準將 ts
轉換為其文字表示法,該標準為 YYYY-MM-DD HH:MM:SS
。
成功時,此函式傳回 0;如果發生錯誤,則傳回負值。
dttofmtasc
#使用格式遮罩將時間戳記變數轉換為 C char*。
int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr);
此函式接收指向要轉換的時間戳記的指標作為其第一個引數 (ts
)、指向輸出緩衝區的指標 (output
)、已為輸出緩衝區配置的最大長度 (str_len
) 以及用於轉換的格式遮罩 (fmtstr
)。
成功時,此函式傳回 0;如果發生錯誤,則傳回負值。
在內部,此函式使用 PGTYPEStimestamp_fmt_asc
函式。請參閱該處的參考資料,以取得有關可以使用哪些格式遮罩指定符的資訊。
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
。它會根據格式遮罩將長整數值轉換為文字表示形式。
格式遮罩可以由以下格式指定字元組成
*
(星號) - 如果此位置原本是空白,則使用星號填寫。
&
(and 符號) - 如果此位置原本是空白,則使用零填寫。
#
- 將前導零轉換為空白。
<
- 在字串中靠左對齊數字。
,
(逗號) - 將四位或更多位的數字分成三位一組,並用逗號分隔。
.
(句點) - 此字元將數字的整數部分與小數部分分隔開。
-
(減號) - 如果數字是負值,則會出現減號。
+
(加號) - 如果數字是正值,則會出現加號。
(
- 這會取代負數前面的減號。減號不會出現。
)
- 此字元會取代減號,並印在負值的後面。
$
- 貨幣符號。
rupshift
#將字串轉換為大寫。
void rupshift(char *str);
此函式接收字串的指標,並將每個小寫字元轉換為大寫。
byleng
#傳回字串中的字元數,而不計算尾隨的空白。
int byleng(char *str, int len);
此函式預期一個固定長度的字串作為其第一個參數 (str
),其長度作為其第二個參數 (len
)。它傳回有效字元數,也就是字串的長度,不包括尾隨的空白。
ldchar
#將固定長度的字串複製到以 null 結尾的字串中。
void ldchar(char *src, int len, char *dest);
此函式接收要複製的固定長度字串 (src
)、其長度 (len
) 和目標記憶體的指標 (dest
)。請注意,您需要為 dest
指向的字串保留至少 len+1
個位元組。此函式最多將 len
個位元組複製到新位置(如果來源字串有尾隨空白,則更少),並新增 null 終止符。
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
#將變數設定為 NULL。
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
#測試變數是否為 NULL。
int risnull(int t, char *ptr);
此函式接收要測試的變數類型 (t
) 以及指向此變數的指標 (ptr
)。請注意,後者需要強制轉換為 char*。有關可能的變數類型列表,請參閱函式 rsetnull
。
以下是如何使用此函式的範例
$char c[] = "abc "; $short s = 17; $int i = -74874; risnull(CCHARTYPE, (char *) c); risnull(CSHORTTYPE, (char *) &s); risnull(CINTTYPE, (char *) &i);
請注意,此處的所有常數都描述錯誤,並且所有常數都定義為表示負值。在不同常數的描述中,您還可以找到常數在目前實作中代表的值。但是,您不應依賴此數字。但是,您可以依賴所有這些常數都定義為表示負值的事實。
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 定義)。
如果您在文件中發現任何不正確、與您的特定功能體驗不符或需要進一步說明的地方,請使用此表單來報告文件問題。