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
等)之間不得有任何空格。否則,預處理器會將該令牌解析為主變數。
有兩種相容模式: INFORMIX
, INFORMIX_SE
連結使用此相容模式的程式時,請記住連結 ECPG 附帶的 libcompat
。
除了前面解釋的語法糖,Informix 相容模式還將一些用於資料輸入、輸出和轉換的函式以及 E/SQL 中已知的嵌入式 SQL 語句移植到了 ECPG。
Informix 相容模式與 ECPG 的 pgtypeslib 庫緊密相關。pgtypeslib 將 SQL 資料型別對映到 C 主程式中的資料型別,並且 Informix 相容模式的大部分附加函式都允許您操作這些 C 主程式型別。但請注意,相容性是有限的。它不試圖複製 Informix 的行為;它允許您執行多多少少相同的操作,並提供名稱相同、行為基本相同的函式,但如果您目前正在使用 Informix,它並不是一個即插即用的替代品。此外,一些資料型別是不同的。例如,PostgreSQL 的 datetime 和 interval 型別不瞭解像 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
sqlsourceld
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);
該函式接收第一個運算元(型別為 decimal)的指標(arg1
),第二個運算元(型別為 decimal)的指標(arg2
)以及將儲存和的 decimal 型別值的指標(sum
)。成功時,函式返回 0。如果發生溢位,則返回 ECPG_INFORMIX_NUM_OVERFLOW
;如果發生下溢,則返回 ECPG_INFORMIX_NUM_UNDERFLOW
。對於其他失敗,返回 -1,並將 errno
設定為 pgtypeslib 的相應 errno
號。
deccmp
#比較兩個 decimal 型別變數。
int deccmp(decimal *arg1, decimal *arg2);
該函式接收第一個 decimal 值的指標(arg1
),第二個 decimal 值的指標(arg2
),並返回一個整數值,指示哪個值更大。
1,如果 arg1
指向的值大於 var2
指向的值。
-1,如果 arg1
指向的值小於 arg2
指向的值。
0,如果 arg1
指向的值和 arg2
指向的值相等。
deccopy
#複製 decimal 值。
void deccopy(decimal *src, decimal *target);
該函式接收應複製的 decimal 值的指標作為第一個引數(src
),並接收目標結構(型別為 decimal)的指標作為第二個引數(target
)。
deccvasc
#將值從其 ASCII 表示形式轉換為 decimal 型別。
int deccvasc(char *cp, int len, decimal *np);
該函式接收包含要轉換的數字的字串表示的指標(cp
)及其長度 len
。np
是一個指向 decimal 值的指標,用於儲存操作結果。 0 - 成功時,函式返回 0。如果發生溢位或下溢,則返回 ECPG_INFORMIX_NUM_OVERFLOW
或 ECPG_INFORMIX_NUM_UNDERFLOW
。如果無法解析 ASCII 表示形式,則返回 ECPG_INFORMIX_BAD_NUMERIC
;如果在解析指數時發生此問題,則返回 ECPG_INFORMIX_BAD_EXPONENT
。
有效格式例如: -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);
該函式接收應轉換為的 double 型別變數作為其第一個引數(dbl
)。作為第二個引數(np
),函式接收一個指向應儲存操作結果的 decimal 變數的指標。
成功時,函式返回 0,如果轉換失敗,則返回負值。
deccvint
#將 int 型別的值轉換為 decimal 型別的值。
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 型別變數轉換為整數。
int dectoint(decimal *np, int *ip);
該函式接收指向要轉換的 decimal 值的指標(np
)以及指向應儲存操作結果的整數變數的指標(ip
)。
成功時,返回 0,如果轉換失敗,則返回負值。如果發生溢位,則返回 ECPG_INFORMIX_NUM_OVERFLOW
。
請注意,ECPG 的實現與 Informix 的實現不同。Informix 將整數限制在 -32767 到 32767 的範圍內,而 ECPG 實現中的限制取決於體系結構(INT_MIN .. INT_MAX
)。
dectolong
#將 decimal 型別變數轉換為長整數。
int dectolong(decimal *np, long *lngp);
該函式接收指向要轉換的 decimal 值的指標(np
)以及指向應儲存操作結果的長變數的指標(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
)以及指向 date 型別變數的指標(d
)。此函式不允許您指定格式掩碼。它使用 Informix 的預設格式掩碼 mm/dd/yyyy
。內部來說,此函式是透過 rdefmtdate
實現的。因此,rstrdate
並不更快,如果您有選擇,應該選擇 rdefmtdate
,它允許您顯式指定格式掩碼。
該函式返回與 rdefmtdate
相同的值。
rtoday
#獲取當前日期。
void rtoday(date *d);
該函式接收一個指向 date 變數的指標(d
),並將其設定為當前日期。
內部來說,此函式使用 PGTYPESdate_today
函式。
rjulmdy
#從 date 型別變數中提取日、月、年的值。
int rjulmdy(date d, short mdy[3]);
該函式接收日期 d
和一個指向包含 3 個 short int 值的陣列的指標 mdy
。變數名錶示順序:mdy[0]
將被設定為包含月份編號,mdy[1]
將被設定為日期值,mdy[2]
將包含年份。
目前該函式始終返回 0。
內部來說,該函式使用 PGTYPESdate_julmdy
函式。
rdefmtdate
#使用格式掩碼將字元字串轉換為 date 型別值。
int rdefmtdate(date *d, char *fmt, char *str);
該函式接收指向應儲存操作結果的 date 值的指標(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
#使用格式掩碼將 date 型別變數轉換為其文字表示。
int rfmtdate(date d, char *fmt, char *str);
該函式接收要轉換的日期(d
),格式掩碼(fmt
),以及將儲存日期文字表示的字串(str
)。
成功時,返回 0,如果發生錯誤,則返回負值。
內部來說,此函式使用 PGTYPESdate_fmt_asc
函式,有關示例,請參閱該處的參考。
rmdyjul
#從包含日期日、月、年的 3 個 short int 陣列建立 date 值。
int rmdyjul(short mdy[3], date *d);
該函式接收 3 個 short int 陣列(mdy
)以及指向應儲存結果的 date 型別變數的指標。
目前函式始終返回 0。
內部來說,函式被實現為使用 PGTYPESdate_mdyjul
函式。
rdayofweek
#返回一個數字,表示 date 值的星期幾。
int rdayofweek(date d);
該函式接收 date 變數 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
#將一個時間戳減去另一個時間戳,並返回一個 interval 型別變數。
int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);
該函式將 ts2
指向的時間戳變數從 ts1
指向的時間戳變數中減去,並將結果儲存在 iv
指向的 interval 變數中。
成功時,函式返回 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
#將 interval 變數轉換為 C char* 字串。
int intoasc(interval *i, char *str);
該函式接收指向要轉換的 interval 變數的指標(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
。它根據格式掩碼將長整數值轉換為其文字表示。
格式掩碼可以由以下格式說明字元組成:
*
(星號) - 如果此位置否則為空白,則用星號填充。
&
(與號) - 如果此位置否則為空白,則用零填充。
#
- 將前導零轉換為空白。
<
- 將數字左對齊到字串中。
,
(逗號) - 將四位或更多位數字分組,每三位用逗號分隔。
.
(句點) - 此字元分隔數字的整數部分和小數部分。
-
(減號) - 如果數字是負值,則顯示減號。
+
(加號) - 如果數字是正值,則顯示加號。
(
- 這會替換負數前面的減號。減號不會顯示。
)
- 此字元替換減號,並列印在負值後面。
$
- 貨幣符號。
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
個位元組複製到新位置(如果源字串有尾隨空格,則複製的位元組數會少於 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 定義)。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。