PostgreSQL Informix兼容模式

2021-09-02 15:31 更新
35.15.1. 附加類型
35.15.2. 附加的/缺少的 嵌入式 SQL 語句
35.15.3. Informix-兼容的 SQLDA 描述符區(qū)域
35.15.4. 附加函數(shù)
35.15.5. 額外的常量

ecpg可以運行在一種所謂的Informix 兼容模式中。如果這種模式被激活,它的行為就好像它是一個用于Informix E/SQL 的Informix預(yù)編譯器。一般而言,這將允許你使用美元符號替代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;

注意

$之間不能有任何空白以及下列之一的預(yù)處理器指令:includedefine、ifdef等。否則,預(yù)處理器將把記號解析成一個主變量。

有兩種兼容性模式:INFORMIXINFORMIX_SE

在鏈接使用這種兼容性模式的程序時,要記得鏈接上和 ECPG 一起發(fā)布的libcompat

除了之前解釋過的語法糖,Informix兼容性模式從 E/SQL 中移植了一些用于輸入、輸出和數(shù)據(jù)轉(zhuǎn)換的函數(shù)以及嵌入式 SQL 語句到 ECPG 中。

Informix兼容性模式與 ECPG 的 pgtypeslib 庫緊密連接。pgtypeslib 把 SQL 數(shù)據(jù)類型映射到 C 主程序中的數(shù)據(jù)類型并且大部分Informix兼容性模式的附加函數(shù)允許我們在那些 C 主程序類型上操作。不過注意兼容性的范圍被有所限制。它并不是想嘗試復(fù)制Informix的行為。它允許你做或多或少的相同操作并且給你具有相同名稱和相同基本行為的函數(shù),但是此刻如果你使用 Informix,其中并沒有唾手可得的替代品。此外,一些數(shù)據(jù)類型也不同。例如,PostgreSQL的日期時間和區(qū)間類型不理解范圍(例如YEAR TO MINUTE),因此你也無法在 ECPG 中找到支持。

35.15.1. 附加類型

用于存儲右切邊字符串?dāng)?shù)據(jù)的 Informix-特殊的 "string" 偽類型現(xiàn)在在 Informix 模式中不用typedef就能支持。事實上,在 Informix 模式中,ECPG 拒絕處理包含typedef sometype string;的源文件。

EXEC SQL BEGIN DECLARE SECTION;
string userid; /* 這個變量將包含切邊過的數(shù)據(jù) */
EXEC SQL END DECLARE SECTION;

EXEC SQL FETCH MYCUR INTO :userid;

35.15.2. 附加的/缺少的 嵌入式 SQL 語句

CLOSE DATABASE

這個語句關(guān)閉當(dāng)前連接。事實上,這是 ECPG 的DISCONNECT CURRENT語句的同義詞:

$CLOSE DATABASE;                /* 關(guān)閉當(dāng)前連接 */
EXEC SQL CLOSE DATABASE;

FREE cursor_name

由于 ECPG 和 Informix ESQL/C 在工作方式上的區(qū)別(一個是純語法轉(zhuǎn)換而另一個依賴于底層的運行時庫),在 ECPG 中沒有FREE cursor_name語句。這是因為在 ECPG 中,DECLARE CURSOR不會翻譯成一個運行時庫中使用游標(biāo)名的函數(shù)調(diào)用。這意味著在 ECPG 運行時庫中不會有 SQL 游標(biāo)的運行時登記,SQL 游標(biāo)只登記在 PostgreSQL 服務(wù)器中。

FREE statement_name

FREE statement_nameDEALLOCATE PREPARE statement_name的同義詞。

35.15.3. Informix-兼容的 SQLDA 描述符區(qū)域

Informix-兼容模式支持一種與第 35.7.2 節(jié)中所述不同的結(jié)構(gòu)。如下:

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描述符中域的數(shù)量。

sqlvar

每一個域?qū)傩缘闹羔槨?/p>

desc_name

未使用,用零字節(jié)填充。

desc_occ

已分配結(jié)構(gòu)的尺寸。

desc_next

如果結(jié)果集包含多于一個記錄,這個域是下一個 SQLDA 結(jié)構(gòu)的指針。

reserved

未使用的指針,包含 NULL。為 Informix-兼容性而保留。

對每一個域的屬性如下,它們被存儲在sqlvar數(shù)組中:

sqltype

域的類型。可以使用的常量定義在sqltypes.h中。

sqllen

域數(shù)據(jù)的長度。

sqldata

域數(shù)據(jù)的指針。該指針是char *類型,它所指向的數(shù)據(jù)是二進制個事。例子:

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 的。否則必須正確地設(shè)置一個有效的指針和sqlitype。例子:

if (*(int2 *)sqldata->sqlvar[i].sqlind != 0)
    printf("value is NULL\n");

sqlname

域的名稱。以 0 終止的字符串。

sqlformat

在 Informix 中保留,是該域的PQfformat的值。

sqlitype

NULL 指示符數(shù)據(jù)的類型。當(dāng)從服務(wù)器返回數(shù)據(jù)時,它總是 SQLSMINT。當(dāng)SQLDA被用于一個參數(shù)化查詢時,數(shù)據(jù)要根據(jù)設(shè)置的類型對待。

sqlilen

NULL 指示符數(shù)據(jù)的長度。

sqlxid

該域的擴展類型,PQftype的結(jié)果。

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); /* 主結(jié)構(gòu)完全被 free(),sqlda 和 sqlda->sqlvar 在一個已分配區(qū)域中 */

更多信息可見sqlda.h頭部和src/interfaces/ecpg/test/compat_informix/sqlda.pgc回歸測試。

35.15.4. 附加函數(shù)

decadd

將兩個decimal類型值相加。

int decadd(decimal *arg1, decimal *arg2, decimal *sum);

該函數(shù)接收第一個類型為 decimal 的操作數(shù)的指針(arg1)、第二個類型為 decimal 的操作數(shù)的指針(arg2)以及將包含和的 decimal 值的指針(sum)。成功時該函數(shù)返回 0。溢出時返回ECPG_INFORMIX_NUM_OVERFLOW,下溢時返回 ECPG_INFORMIX_NUM_UNDERFLOW。其他失敗會返回 -1 并且errno會被設(shè)置為相應(yīng)的 pgtypeslib 中的errno編號。

deccmp

比較兩個 decimal 變量。

int deccmp(decimal *arg1, decimal *arg2);

該函數(shù)接收第一個 decimal 值的指針(arg1)、第二個 decimal 值的指針(arg2)并且返回一個整數(shù)值說明哪一個值更大。

  • 1,如果arg1指向的值大于var2指向的值

  • -1,如果arg1指向的值小于var2指向的值

  • 0,如果arg1指向的值與arg2指向的值相等

deccopy

拷貝一個 decimal 值。

void deccopy(decimal *src, decimal *target);

該函數(shù)接收要拷貝的 decimal 值的指針作為第一個參數(shù)(src)以及一個類型為 decimal 的目標(biāo)結(jié)構(gòu)的指針作為第二個參數(shù)(target)。

deccvasc

把一個值從 ASCII 表達轉(zhuǎn)換成一個 decimal 類型。

int deccvasc(char *cp, int len, decimal *np);

該函數(shù)接收一個包含要轉(zhuǎn)換的數(shù)字的字符串表達的字符串指針(cp)及其長度(len)。np是一個用來保存操作結(jié)果的 decimal 值的指針。

例如,可用的格式有: -2.794、 +3.44592.49E07或者 -32.84e-4。

成功時該函數(shù)返回 0。如果發(fā)生溢出或者下溢,分別返回 ECPG_INFORMIX_NUM_OVERFLOW或者 ECPG_INFORMIX_NUM_UNDERFLOW。如果 ASCII 表達無法被解析,將返回ECPG_INFORMIX_BAD_NUMERIC。如果解析指數(shù)時發(fā)生問題則返回ECPG_INFORMIX_BAD_EXPONENT。

deccvdbl

將一個 double 值轉(zhuǎn)換成一個 decimal 值。

int deccvdbl(double dbl, decimal *np);

該函數(shù)接收要被轉(zhuǎn)換的 double 變量作為第一個參數(shù)(dbl)。該函數(shù)接收一個 decimal 變量的指針作為第二個參數(shù)(np),它被用來保存操作的結(jié)果。

該函數(shù)在成功時返回 0,在轉(zhuǎn)換失敗時返回一個負值。

deccvint

將一個 int 值轉(zhuǎn)換成 decimal 值。

int deccvint(int in, decimal *np);

該函數(shù)接收要被轉(zhuǎn)換的 int 變量作為第一個參數(shù)(in)。該函數(shù)接收一個 decimal 變量的指針作為第二個參數(shù)(np),它被用來保存操作的結(jié)果。

該函數(shù)在成功時返回 0,在轉(zhuǎn)換失敗時返回一個負值。

deccvlong

將一個 long 值轉(zhuǎn)換成 decimal 值。

int deccvlong(long lng, decimal *np);

該函數(shù)接收要被轉(zhuǎn)換的 long 變量作為第一個參數(shù)(lng)。該函數(shù)接收一個 decimal 變量的指針作為第二個參數(shù)(np),它被用來保存操作的結(jié)果。

該函數(shù)在成功時返回 0,在轉(zhuǎn)換失敗時返回一個負值。

decdiv

用兩個 decimal 類型的變量做除法。

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

該函數(shù)接收兩個變量的指針作為第一個(n1)和第二個(n2)操作數(shù)并且結(jié)算n1/n2。 result是一個指向保存操作結(jié)果的變量的指針。

成功時返回 0,如果除法失敗則返回一個負值。如果發(fā)生溢出或下溢,該函數(shù)分別返回 ECPG_INFORMIX_NUM_OVERFLOW或者 ECPG_INFORMIX_NUM_UNDERFLOW。如果發(fā)現(xiàn)一次除零嘗試,該函數(shù)返回 ECPG_INFORMIX_DIVIDE_ZERO

decmul

將兩個 decimal 值相乘。

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

該函數(shù)接收兩個變量的指針作為第一個(n1)和第二個(n2)操作數(shù)并且結(jié)算n1*n2。 result是一個指向保存操作結(jié)果的變量的指針。

成功時返回 0,如果乘法失敗則返回一個負值。如果發(fā)生溢出或下溢,該函數(shù)分別返回 ECPG_INFORMIX_NUM_OVERFLOW或者 ECPG_INFORMIX_NUM_UNDERFLOW

decsub

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

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

該函數(shù)接收兩個變量的指針作為第一個(n1)和第二個(n2)操作數(shù)并且結(jié)算n1-n2result是一個指向保存操作結(jié)果的變量的指針。

成功時返回 0,如果減法失敗則返回一個負值。如果發(fā)生溢出或下溢,該函數(shù)分別返回 ECPG_INFORMIX_NUM_OVERFLOW或者 ECPG_INFORMIX_NUM_UNDERFLOW。

dectoasc

將一個 decimal 變量轉(zhuǎn)換成它的 ASCII 表達放在一個 C char* 字符串中。

int dectoasc(decimal *np, char *cp, int len, int right)

該函數(shù)接收一個要被轉(zhuǎn)換成文本表達的 decimal 類型變量的指針(np)。cp是應(yīng)保存操作結(jié)果的緩沖區(qū)。參數(shù)right指定小數(shù)點右邊應(yīng)該有多少位保留在輸出中。結(jié)果將被圓整到所指定數(shù)量的十進制位。將right設(shè)置為 -1 表示輸出中應(yīng)該包括所有可用的十進制位。如果輸出緩沖區(qū)的長度(由 len指定)不足以保存包含拖尾零字節(jié)的文本表達,結(jié)果中將只保存一個單一的*字符并且返回 -1。

如果緩沖區(qū)cp太小該函數(shù)返回 -1;如果內(nèi)存耗盡,則返回ECPG_INFORMIX_OUT_OF_MEMORY。

dectodbl

將一個 decimal 類型變量轉(zhuǎn)換成一個 double 類型變量。

int dectodbl(decimal *np, double *dblp);

該函數(shù)接收一個要轉(zhuǎn)換的 decimal 值的指針(np)以及一個保存操作結(jié)果的 double 變量的指針(dblp)。

該函數(shù)在成功時返回 0,在轉(zhuǎn)換失敗時返回一個負值。

dectoint

將一個 decimal 類型變量轉(zhuǎn)換成一個整數(shù)類型變量。

int dectoint(decimal *np, int *ip);

該函數(shù)接收一個要轉(zhuǎn)換的 decimal 值的指針(np)以及一個保存操作結(jié)果的整數(shù)變量的指針(ip)。

該函數(shù)在成功時返回 0,在轉(zhuǎn)換失敗時返回一個負值。如果發(fā)生溢出,會返回ECPG_INFORMIX_NUM_OVERFLOW

注意 ECPG 實現(xiàn)與Informix實現(xiàn)不同。Informix限制一個整數(shù)的范圍是從 -32767 到 32767,而 ECPG 實現(xiàn)中的限制取決于架構(gòu)(-INT_MAX .. INT_MAX)。

dectolong

將一個 decimal 類型變量轉(zhuǎn)換成一個長整型變量。

int dectolong(decimal *np, long *lngp);

該函數(shù)接收一個要轉(zhuǎn)換的 decimal 值的指針(np)以及一個保存操作結(jié)果的長整型變量的指針(lngp)。

該函數(shù)在成功時返回 0,在轉(zhuǎn)換失敗時返回一個負值。如果發(fā)生溢出,會返回ECPG_INFORMIX_NUM_OVERFLOW

注意 ECPG 實現(xiàn)與Informix實現(xiàn)不同。Informix限制一個整數(shù)的范圍是從 -2,147,483,647 到 2,147,483,647,而 ECPG 實現(xiàn)中的限制取決于架構(gòu)(-LONG_MAX .. LONG_MAX)。

rdatestr

將一個日期轉(zhuǎn)換成一個 C char* 字符串。

int rdatestr(date d, char *str);

該函數(shù)接收兩個參數(shù),第一個是要轉(zhuǎn)換的日期(d),第二個是目標(biāo)字符串的指針。輸出格式總是yyyy-mm-dd,因此你需要為該字符串分配至少 11 個字節(jié)(包括零字節(jié)終止符)。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

注意 ECPG 實現(xiàn)與Informix實現(xiàn)不同。在Informix中,該格式可能受到環(huán)境變量設(shè)置的影響。而在 ECPG 中,你不能改變輸出格式。

rstrdate

解析一個日期的文本表達。

int rstrdate(char *str, date *d);

該函數(shù)接收要轉(zhuǎn)換的日期的文本表達(str)以及一個日期類型變量的指針(d)。這個函數(shù)不允許你指定一個格式掩碼。它使用Informix的默認格式掩碼mm/dd/yyyy。在內(nèi)部,這個函數(shù)用rdefmtdate的方式實現(xiàn)。因此, rstrdate不會更快,并且如果可以選擇,你應(yīng)該選用允許你顯式指定格式掩碼的rdefmtdate。

該返回與rdefmtdate相同的值。

rtoday

得到當(dāng)前日期。

void rtoday(date *d);

該函數(shù)接收一個日期變量的指針(d),它會把該變量設(shè)置為當(dāng)前日期。

在內(nèi)部這個函數(shù)使用PGTYPESdate_today函數(shù)。

rjulmdy

從一個日期類型變量中抽取日、月、年的值。

int rjulmdy(date d, short mdy[3]);

該函數(shù)接收日期d和由 3 個短整型值構(gòu)成的數(shù)組的指針mdy。該變量名指定了順序:mdy[0]將被設(shè)置為包含月的編號,mdy[1]將被設(shè)置為日的值,而mdy[2]將包含年。

當(dāng)前該函數(shù)總是返回 0。

在內(nèi)部該函數(shù)使用PGTYPESdate_julmdy函數(shù)。

rdefmtdate

使用一個格式掩碼把一個字符串轉(zhuǎn)換成一個日期類型的值。

int rdefmtdate(date *d, char *fmt, char *str);

該函數(shù)接收一個用于保存操作結(jié)果的日期值的指針(d)、要用來解析日期的格式掩碼(fmt)以及包含日期文本表達的 C char* 字符串(str)。該文本表達應(yīng)該匹配格式掩碼。不過,你不需要具有從該字符串到格式掩碼的 一一映射。該函數(shù)將分析順序并且尋找表示年的位置的文字yyyyyy、表示月的位置的mm以及表示日的位置的dd

該函數(shù)返回下列值:

  • 0 - 該函數(shù)成功終止。

  • ECPG_INFORMIX_ENOSHORTDATE - 該日期不包含日、月、年之間的定界符。在這種情況下,輸入字符串必須是正好 6 個或 8 個字節(jié),但實際上卻不是。

  • ECPG_INFORMIX_ENOTDMY - 格式字符串沒有正確地指示年、月、日的順序。

  • ECPG_INFORMIX_BAD_DAY - 輸入字符串不含一個合法的日。

  • ECPG_INFORMIX_BAD_MONTH - 輸入字符串不含一個合法的月。

  • ECPG_INFORMIX_BAD_YEAR - 輸入字符串不含一個合法的年。

在內(nèi)部這個函數(shù)被實現(xiàn)為使用PGTYPESdate_defmt_asc函數(shù)。示例輸入表可以在那里找到。

rfmtdate

使用一個格式掩碼將一個日期類型變量轉(zhuǎn)換成它的文本表達。

int rfmtdate(date d, char *fmt, char *str);

該函數(shù)接收要轉(zhuǎn)換的日期(d)、格式掩碼(fmt)以及將保存日期的文本表達的字符串(str)。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

在內(nèi)部這個函數(shù)使用PGTYPESdate_fmt_asc函數(shù),例子請參考該函數(shù)。

rmdyjul

從由 3 個短整型組成的數(shù)組創(chuàng)建一個日期值,它指定了該日期的日、月、年。

int rmdyjul(short mdy[3], date *d);

該函數(shù)接收一個由 3 個短整型構(gòu)成的數(shù)組(mdy)以及一個用來保存操作結(jié)構(gòu)的日期類型變量的指針。

當(dāng)前該函數(shù)總是返回 0。

在內(nèi)部這個函數(shù)被實現(xiàn)為使用PGTYPESdate_mdyjul。

rdayofweek

為一個日期值返回一個表示它是星期幾的數(shù)字。

int rdayofweek(date d);

該函數(shù)接收日期變量d作為它的唯一參數(shù)并且返回一個整數(shù)指示這一天是星期幾。

  • 0 - 周日

  • 1 - 周一

  • 2 - 周二

  • 3 - 周三

  • 4 - 周四

  • 5 - 周五

  • 6 - 周六

在內(nèi)部這個函數(shù)被實現(xiàn)為使用函數(shù)PGTYPESdate_dayofweek。

dtcurrent

檢索當(dāng)前的時間戳。

void dtcurrent(timestamp *ts);

該函數(shù)檢索當(dāng)前時間戳并且把它保存在ts指向的時間戳變量中。

dtcvasc

把一個時間戳從它的文本表達解析到一個時間戳變量中。

int dtcvasc(char *str, timestamp *ts);

該函數(shù)接收要解析的字符串(str)以及一個指向保存操作結(jié)果的時間戳變量的指針(ts)。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

在內(nèi)部這個函數(shù)使用PGTYPEStimestamp_from_asc函數(shù)。一個輸入示例的表格可以參考該函數(shù)的文檔。

dtcvfmtasc

使用一個格式掩碼把一個時間戳從它的文本表達解析到一個時間戳變量中。

dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue)

該函數(shù)接收要解析的字符串(inbuf)、要使用的格式掩碼(fmtstr)以及一個指向保存操作結(jié)果的時間戳變量的指針(dtvalue)。

這個函數(shù)通過PGTYPEStimestamp_defmt_asc函數(shù)實現(xiàn)??梢允褂玫母袷秸f明符的列表可以參考該函數(shù)的文檔。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

dtsub

從一個時間戳中減去另一個并且返回一個區(qū)間類型變量。

int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);

該函數(shù)將從ts1指向的時間戳變量中減去ts2指向的時間戳變量,并且將把結(jié)果存儲在iv指向的區(qū)間變量中。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

dttoasc

將一個時間戳變量轉(zhuǎn)換成一個 C char* 字符串。

int dttoasc(timestamp *ts, char *output);

該函數(shù)接收一個要轉(zhuǎn)換的時間戳變量的指針(ts)以及用于保存操作結(jié)果的字符串(output)。它根據(jù) SQL 標(biāo)準(zhǔn)把ts轉(zhuǎn)換成它的文本表達,形式為YYYY-MM-DD HH:MM:SS。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

dttofmtasc

使用一個格式掩碼將一個時間戳變量轉(zhuǎn)換成一個 C char*。

int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr);

該函數(shù)接收一個要轉(zhuǎn)換的時間戳的指針(ts)、一個輸出緩沖區(qū)的指針(output)、已經(jīng)為輸出緩沖區(qū)分配的最大長度(str_len)以及用于轉(zhuǎn)換的格式掩碼(fmtstr)。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

在內(nèi)部,這個函數(shù)使用PGTYPEStimestamp_fmt_asc函數(shù)??梢允褂玫母袷秸f明符的列表可以參考該函數(shù)的文檔。

intoasc

將一個區(qū)間變量轉(zhuǎn)換成一個 C char* 字符串。

int intoasc(interval *i, char *str);

該函數(shù)接收一個要轉(zhuǎn)換的區(qū)間變量的指針(i)以及要保持該操作結(jié)果的字符串(str)。它根據(jù) SQL 標(biāo)準(zhǔn)把i轉(zhuǎn)換成它的文本表達,形式為YYYY-MM-DD HH:MM:SS。

成功時該函數(shù)返回 0,如果發(fā)生錯誤則返回一個負值。

rfmtlong

用一個格式掩碼將一個長整型值轉(zhuǎn)換成它的文本表達。

int rfmtlong(long lng_val, char *fmt, char *outbuf);

該函數(shù)接收長整型值lng_val、格式掩碼fmt以及輸出緩沖區(qū)的指針outbuf。它根據(jù)格式掩碼將長整型值轉(zhuǎn)換成文本表達。

格式掩碼可以由下列格式說明字符構(gòu)成:

  • * (星) - 如果這個位置可以為空白,否則用一個星號填充。

  • & (花號) -如果這個位置可以為空白,否則用一個零填充。

  • # - 把前導(dǎo)零轉(zhuǎn)變成空白。

  • < - 左對齊字符串中的數(shù)字。

  • , (逗號) - 將有四個或者更多數(shù)位的數(shù)字份組成用逗號分隔的 3 數(shù)位組。

  • . (點) - 這個字符分隔數(shù)字的整數(shù)部分和小數(shù)部分。

  • - (負) - 如果該數(shù)字是一個負值則負號會出現(xiàn)。

  • + (加) - 如果該數(shù)字是一個正值則加號會出現(xiàn)。

  • ( - 這會替換負數(shù)前面的負號。負號將不會出現(xiàn)。

  • ) - 這個字符替換負號并且被打印在負值的后面。

  • $ - 貨幣符號。

rupshift

把一個字符串轉(zhuǎn)換成大寫形式。

void rupshift(char *str);

該函數(shù)接收一個字符串的指針并且把每一個小寫形式的字符變成大寫形式。

byleng

返回一個字符串的字符數(shù),其中不含拖尾的空白。

int byleng(char *str, int len);

該函數(shù)期待一個定長字符串作為它的第一個參數(shù)(str)并且把它的長度作為第二個參數(shù)(len)。該函數(shù)會返回有效字符的數(shù)量,也就是字符串不含拖尾空白的長度。

ldchar

復(fù)制一個定長字符串到一個空終止的字符串。

void ldchar(char *src, int len, char *dest);

該函數(shù)接收要被復(fù)制的定長字符串(src)、它的長度(len)以及目標(biāo)內(nèi)存的指針(dest)。注意你需要為dest指向的字符串保留至少len+1個字節(jié)。該函數(shù)復(fù)制至多len個字節(jié)到新的位置(如果源字符串有拖尾的空格)并且增加空終止符。

rgetmsg

int rgetmsg(int msgnum, char *s, int maxsize);

這個函數(shù)存在,但是目前還沒有實現(xiàn)!

rtypalign

int rtypalign(int offset, int type);

這個函數(shù)存在,但是目前還沒有實現(xiàn)!

rtypmsize

int rtypmsize(int type, int len);

這個函數(shù)存在,但是目前還沒有實現(xiàn)!

rtypwidth

int rtypwidth(int sqltype, int sqllen);

這個函數(shù)存在,但是目前還沒有實現(xiàn)!

rsetnull

設(shè)置一個變量為 NULL。

int rsetnull(int t, char *ptr);

該函數(shù)接收一個表示變量類型的整數(shù)以及一個被造型成 C char* 指針的變量本身的指針。

存在下列類型:

  • CCHARTYPE - 用于類型char或者char*的一個變量

  • CSHORTTYPE - 用于類型short int的一個變量

  • CINTTYPE - 用于類型int的一個變量

  • CBOOLTYPE - 用于類型boolean的一個變量

  • CFLOATTYPE - 用于類型float的一個變量

  • CLONGTYPE - 用于類型long的一個變量

  • CDOUBLETYPE - 用于類型double的一個變量

  • CDECIMALTYPE - 用于類型decimal的一個變量

  • CDATETYPE - 用于類型date的一個變量

  • CDTIMETYPE - 用于類型timestamp的一個變量

這里是一個調(diào)用這個函數(shù)的例子:

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

該函數(shù)接收要測試的變量的類型(t)以及一個指向該變量的指針(ptr)。注意后者需要被造型為一個 char*??赡艿淖兞款愋驼堃姾瘮?shù)rsetnull。

這里是一個如何使用這個函數(shù)的例子:

$char c[] = "abc       ";
$short s = 17;
$int i = -74874;

risnull(CCHARTYPE, (char *) c);
risnull(CSHORTTYPE, (char *) &s);
risnull(CINTTYPE, (char *) &i);

35.15.5. 額外的常量

注意這里所有的常量都描述錯誤并且它們都被定義為表示負值。在每一種不同常量的描述中,你還可以找到在當(dāng)前實現(xiàn)中該常量表示的值。不過你不應(yīng)該依賴于這個數(shù)字。但是你可以相信所有的這些常量都是被定義為表示負值。

ECPG_INFORMIX_NUM_OVERFLOW

如果在一次計算中發(fā)生了溢出,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1200(Informix定義)。

ECPG_INFORMIX_NUM_UNDERFLOW

如果在一次計算中發(fā)生了下溢,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1201(Informix定義)。

ECPG_INFORMIX_DIVIDE_ZERO

如果發(fā)現(xiàn)嘗試除零,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1202(Informix定義)。

ECPG_INFORMIX_BAD_YEAR

如果在解析一個日期時為年找到了一個壞的值,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1204(Informix定義)。

ECPG_INFORMIX_BAD_MONTH

如果在解析一個日期時為月找到了一個壞的值,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1205(Informix定義)。

ECPG_INFORMIX_BAD_DAY

如果在解析一個日期時為日找到了一個壞的值,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1206(Informix定義)。

ECPG_INFORMIX_ENOSHORTDATE

如果一個解析例程需要一個短日期表示但是卻沒有得到正確長度的日期自如穿,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1209(Informix定義)。

ECPG_INFORMIX_DATE_CONVERT

如果在日期格式化時產(chǎn)生了一個錯誤,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1210(Informix定義)。

ECPG_INFORMIX_OUT_OF_MEMORY

如果在操作時內(nèi)存被耗盡,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1211(Informix定義)。

ECPG_INFORMIX_ENOTDMY

如果一個解析例程被假定為得到一個格式掩碼(如mmddyy)但是列出的域并不是全部正確,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1212(Informix定義)。

ECPG_INFORMIX_BAD_NUMERIC

如果一個解析例程因為一個numeric值的文本表達包含錯誤而不能解析它或者一個例程因為至少一個numeric變量非法而無法完成一次涉及numeric變量的計算,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1213(Informix定義)。

ECPG_INFORMIX_BAD_EXPONENT

如果一個解析例程不能解析一個指數(shù),函數(shù)會返回這個值。在內(nèi)部它被定義為 -1216(Informix定義)。

ECPG_INFORMIX_BAD_DATE

如果一個解析例程不能解析一個日期,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1218(Informix定義)。

ECPG_INFORMIX_EXTRA_CHARS

如果一個解析例程被傳遞了它不能解析的額外字符,函數(shù)會返回這個值。在內(nèi)部它被定義為 -1264(Informix定義)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號