PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

34.15. Informix 兼容模式 #

34.15.1. Additional Types
34.15.2. 额外/缺失的嵌入式 SQL 语句
34.15.3. Informix 兼容的 SQLDA 描述符区
34.15.4. Additional Functions
34.15.5. Additional Constants

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

在链接使用这种兼容模式的程序时,请记住与 ECPG 附带的 libcompat 链接。

除了前面讲解的语法糖之外,Informix 兼容模式还把一些用于数据输入、输出和转换的函数,以及 E/SQL 中已知的嵌入式 SQL 语句移植到了 ECPG。

Informix 兼容模式与 ECPG 的 pgtypeslib 库紧密相关。pgtypeslib 把 SQL 数据类型映射为 C 主程序中的数据类型,而 Informix 兼容模式的大多数附加函数允许你操作那些 C 主程序类型。但请注意,兼容的程度是有限的。它并不试图照搬 Informix 的行为;它让你能够执行大致 相同的操作,并提供名称相同、基本行为相同的函数,但如果你目前 正在使用 Informix,它并不是一个可以直接 替换的替代品。此外,某些数据类型是不同的。例如, PostgreSQL 的 datetime 和 interval 类型不了解诸如 YEAR TO MINUTE 这样的范围,因此你在 ECPG 中也找不到对它的支持。

34.15.1. Additional Types #

用于存储去除右侧空白后字符串数据的 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_name 是 DEALLOCATE PREPARE statement_name 的 同义词。

34.15.3. Informix 兼容的 SQLDA 描述符区 #

Informix 兼容模式支持一种与 Section 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 而保留。

The per-field properties are below, they are stored in the sqlvar array:

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。

Example:

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

For more information, see the sqlda.h header and the src/interfaces/ecpg/test/compat_informix/sqlda.pgc regression test.

34.15.4. Additional Functions #

decadd #

把两个 decimal 类型的值相加。

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

该函数的第一个参数(src)是指向要复制的 decimal 值的指针,第二个参数 (target)是指向 decimal 类型目标结构的指针。

deccvasc #

把一个值从它的 ASCII 表示转换为 decimal 类型。

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

该函数接收一个指向字符串的指针(cp), 其中包含要转换数字的字符串表示,以及它的长度 len。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。如果发现 试图除以零,该函数返回 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 指定的输出缓冲区长度不足以容纳包含 结尾零字节的文本表示,则结果中只存储一个 * 字符并返回 -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)和指向 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) 和一个指向 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 个短整数值组成的数组 mdy 的指针。变量名指示了顺序:mdy[0] 将被设置为月份的编号,mdy[1] 将被设置为日的值,而 mdy[2] 将包含年份。

目前该函数总是返回 0。

在内部,该函数使用 PGTYPESdate_julmdy 函数。

rdefmtdate #

使用格式掩码把一个字符串转换为 date 类型的值。

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

该函数接收一个指向应保存操作结果的日期值的指针 (d)、用于解析日期的格式掩码 (fmt),以及包含日期文本表示的 C char* 字符串(str)。文本表示应当与 格式掩码匹配。不过,你不需要让字符串与格式掩码一一对应。 该函数只分析顺序,并查找指示年份位置的 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 个短整数组成的数组(它们指定日期的日、月、年) 创建一个日期值。

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

该函数接收由 3 个短整数组成的数组 (mdy)和一个指向 date 类型变量的指针,后者应保存操作的结果。

目前该函数总是返回 0。

在内部,该函数被实现为使用函数 PGTYPESdate_mdyjul。

rdayofweek #

返回一个表示日期值是星期几的数字。

int rdayofweek(date d);

该函数把日期变量 d 作为它唯一的参数,并返回一个整数,指示该日期是星期几。

  • 0 - 星期日

  • 1 - 星期一

  • 2 - 星期二

  • 3 - 星期三

  • 4 - 星期四

  • 5 - 星期五

  • 6 - 星期六

在内部,该函数被实现为使用函数 PGTYPESdate_dayofweek。

dtcurrent #

检索当前时间戳。

void dtcurrent(timestamp *ts);

该函数检索当前时间戳,并把它保存到 ts 所指向的 timestamp 变量中。

dtcvasc #

把一个时间戳从它的文本表示解析到一个 timestamp 变量中。

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

该函数接收要解析的字符串(str)和指向 timestamp 变量的指针(ts),后者应保存 操作的结果。

该函数成功时返回 0,出错时返回一个负值。

在内部,该函数使用 PGTYPEStimestamp_from_asc 函数。示例输入表请参见 其参考文档。

dtcvfmtasc #

使用格式掩码把一个时间戳从它的文本表示解析到一个 timestamp 变量中。

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

该函数接收要解析的字符串(inbuf)、要 使用的格式掩码(fmtstr)和指向 timestamp 变量的指针(dtvalue),后者应 保存操作的结果。

该函数是通过 PGTYPEStimestamp_defmt_asc 函数实现的。 可以使用的格式说明符列表请参见其文档。

该函数成功时返回 0,出错时返回一个负值。

dtsub #

从一个时间戳中减去另一个,并返回一个 interval 类型的变量。

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

该函数将从 ts1 指向的 timestamp 变量中减去 ts2 指向的 timestamp 变量,并把结果存储到 iv 指向的 interval 变量中。

成功时该函数返回 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 函数。可以使用哪些格式 掩码说明符,请参见其参考文档。

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

该函数接收 long 值 lng_val、格式掩码 fmt 和指向输出缓冲区的指针 outbuf。它按照格式掩码把这个 long 值转换为它的文本表示。

格式掩码可以由以下格式说明字符组成:

  • *(星号)- 如果这个位置本来是空白, 则用星号填充。

  • &(& 符号)- 如果这个位置本来是 空白,则用零填充。

  • # - 把前导零变为空白。

  • < - 让数字在字符串中左对齐。

  • ,(逗号)- 把四位或更多位的数字分组, 每组三位,组之间用逗号分隔。

  • .(句点)- 这个字符把数字的整数部分 与小数部分分隔开。

  • -(负号)- 如果数字是负值, 则显示负号。

  • +(加号)- 如果数字是正值, 则显示加号。

  • ( - 它取代负数前面的负号。 负号将不会显示。

  • ) - 这个字符取代负号,并被打印在 负值之后。

  • $ - 货币符号。

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 #

把一个变量设置为 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);

34.15.5. Additional Constants #

注意,这里的所有常量都描述错误,并且它们都被定义为表示负值。 在各个常量的描述中,你还可以找到这些常量在当前实现中所表示的 值。不过你不应依赖这个数字。你可以依赖的是,它们全部都被定义 为表示负值。

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 的定义)。