↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2
历史版本。 PostgreSQL 10 已结束支持。 2022-11-10. 请参阅 当前版本手册.

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

注意

$与后面的预处理器指令(如 include、define、ifdef 等)之间不能有任何空白。否则,预处理器会将该词元解析为主变量。

有两种兼容性模式:INFORMIX、INFORMIX_SE

在链接使用这种兼容性模式的程序时,要记得链接上和 ECPG 一起发布的 libcompat。

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

Informix 兼容模式与 ECPG 的 pgtypeslib 库密切相关。pgtypeslib 将 SQL 数据类型映射到 C 主程序中的数据类型,Informix 兼容模式中的大多数附加函数用于操作这些 C 主程序类型。但兼容范围有限。它并不试图复制 Informix 的行为,而是允许执行大致相同的操作,并提供名称和基本行为相同的函数;如果目前使用的是 Informix,则不能用它直接替代。此外,有些数据类型也有差异。例如,PostgreSQL 的日期时间和 interval 类型不支持 YEAR TO MINUTE 这样的范围,ECPG 也不支持。

35.15.1. 附加类型 #

Informix 模式现在支持 Informix 特有的“string”伪类型,用于存储去除尾随空格的字符串数据,无需使用 typedef。事实上,在 Informix 模式中,ECPG 拒绝处理包含 typedef sometype string;的源文件。

EXEC SQL BEGIN DECLARE SECTION;
string userid; /* 此变量将包含去除尾随空格的数据 */
EXEC SQL END DECLARE SECTION;

EXEC SQL FETCH MYCUR INTO :userid;

35.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 的同义词。

35.15.3. Informix 兼容的 SQLDA 描述符区域 #

Informix 兼容模式支持的结构体与第 35.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; /* 这不需要在嵌入式 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); /* 只需 free() 主结构;sqlda 和 sqlda->sqlvar 位于同一块已分配区域中 */

更多信息参见 sqlda.h 头文件和 src/interfaces/ecpg/test/compat_informix/sqlda.pgc 回归测试。

35.15.4. 附加函数 #

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

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

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

该函数接收应该被转换的 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),以及指向用于保存操作结果的 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 个 short 整数值的数组 mdy 的指针。变量名表明了顺序:mdy[0] 设为月份数,mdy[1] 设为日,mdy[2] 包含年份。

这个函数目前总是返回 0。

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

rdefmtdate

使用格式掩码将字符串转换为日期类型的值。

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

该函数接收一个指向用于保存操作结果的 date 值的指针(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 个 short 整数的数组创建日期值,这些整数指定日期的日、月和年。

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

该函数接收包含 3 个 short 整数的数组(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 指向的时间戳变量中。

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 指向的时间戳变量中减去 ts2 指向的时间戳变量,并将结果存入 iv 指向的 interval 变量中。

成功时返回 0,发生错误时返回负值。

dttoasc

将 timestamp 变量转换为 C char* 字符串。

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

该函数接收指向待转换 timestamp 变量的指针(ts),以及用于保存操作结果的字符串(output)。它将 ts 转换为符合 SQL 标准的文本表示,格式为 YYYY-MM-DD HH:MM:SS。

成功时返回 0,发生错误时返回负值。

dttofmtasc

使用格式掩码将 timestamp 变量转换为 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)。它将 i 转换为符合 SQL 标准的文本表示,格式为 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

将固定长度的字符串复制到以空字符结尾的字符串中。

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

35.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

如果解析例程因 numeric 值的文本表示有误而无法解析,或者例程因至少一个 numeric 变量无效而无法完成涉及 numeric 变量的计算,函数返回此值。其内部定义为 -1213(Informix 的定义)。

ECPG_INFORMIX_BAD_EXPONENT

如果一个解析例程不能解析一个指数,函数会返回这个值。在内部它被定义为 -1216(Informix 定义)。

ECPG_INFORMIX_BAD_DATE

如果一个解析例程不能解析一个日期,函数会返回这个值。在内部它被定义为 -1218(Informix 定义)。

ECPG_INFORMIX_EXTRA_CHARS

如果一个解析例程被传递了它不能解析的额外字符,函数会返回这个值。在内部它被定义为 -1264(Informix 定义)。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.