支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

34.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;

注意

$ 和後續的預處理器指令(即 includedefineifdef 等)之間,不得有任何空白。 否則,預處理器會將該 token 解析為主機變數。

有兩種相容模式:INFORMIXINFORMIX_SE

連結使用此相容模式的程式時,請記住連結 ECPG 隨附的 libcompat

除了先前解釋過的語法糖之外,Informix 相容模式還將一些用於資料輸入、輸出和轉換的函數,以及 E/SQL 已知的嵌入式 SQL 陳述式移植到 ECPG。

Informix 相容模式與 ECPG 的 pgtypeslib 函式庫密切相關。 pgtypeslib 將 SQL 資料類型對應到 C 主機程式中的資料類型,並且 Informix 相容模式的大多數額外函數都允許您對這些 C 主機程式類型進行操作。 但是請注意,相容性的範圍是有限的。 它不會嘗試複製 Informix 的行為; 它允許您執行大致相同的操作,並為您提供具有相同名稱和相同基本行為的函數,但如果您目前正在使用 Informix,它並不是一個直接替換方案。 此外,某些資料類型有所不同。 例如,PostgreSQL 的日期時間和間隔類型不知道像 YEAR TO MINUTE 這樣的範圍,因此您也不會在 ECPG 中找到對它的支援。

34.15.1. 額外的類型 #

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;

34.15.2. 額外/遺失的嵌入式 SQL 陳述式 #

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_nameDEALLOCATE PREPARE statement_name 的同義詞。

34.15.3. 與 Informix 相容的 SQLDA 描述器區域 #

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;

全域屬性為

sqld #

SQLDA 描述器中的欄位數。

sqlvar #

指向每個欄位屬性的指標。

desc_name #

未使用,以零位元組填滿。

desc_occ #

已配置結構的大小。

desc_next #

如果結果集包含多個記錄,則指向下一個SQLDA結構的指標。

reserved #

未使用的指標,包含NULL。為了與Informix相容而保留。

每個欄位的屬性如下,它們儲存在 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 迴歸測試。

34.15.4. 其他函式 #

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) 以及它的長度 lennp 是一個指向十進制值的指標,該值保存運算的結果。

有效的格式例如:-2.794+3.44592.49E07-32.84e-4

成功時,該函數回傳 0。如果發生溢位或下溢,則回傳 ECPG_INFORMIX_NUM_OVERFLOWECPG_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/n2result 是一個指向應該保存操作結果的變數的指標。

成功時,返回 0;如果除法失敗,則返回一個負值。 如果發生溢位或下溢,則此函式分別返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW。 如果嘗試除以零,則此函式返回 ECPG_INFORMIX_DIVIDE_ZERO

decmul #

將兩個 decimal 值相乘。

int decmul(decimal *n1, decimal *n2, decimal *result);

此函式接收指向作為第一個 (n1) 和第二個 (n2) 運算元的變數的指標,並計算 n1*n2result 是一個指向應該保存操作結果的變數的指標。

成功時,返回 0;如果乘法失敗,則返回一個負值。 如果發生溢位或下溢,則此函式分別返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW

decsub #

從另一個 decimal 值中減去一個 decimal 值。

int decsub(decimal *n1, decimal *n2, decimal *result);

此函式接收指向作為第一個 (n1) 和第二個 (n2) 運算元的變數的指標,並計算 n1-n2result 是一個指向應該保存操作結果的變數的指標。

成功時,返回 0;如果減法失敗,則返回一個負值。 如果發生溢位或下溢,則此函式分別返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_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 的對應關係。 此函式僅分析順序,並尋找指示年份位置的字面量 yyyyyy、指示月份位置的 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 - 對於 charchar* 類型的變數

  • 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);

34.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 定義)。

提交更正

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