支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: 开发版
不支持的版本: 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 等。否则,预处理器会将该标记解析为主机变量。

有两种兼容模式:INFORMIXINFORMIX_SE

在链接使用此兼容模式的程序时,请记住链接到 ECPG 附带的 libcompat

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

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),并返回一个整数值,指示哪个值更大。

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

  • 如果 arg1 指向的值小于 arg2 指向的值,则返回 -1

  • 如果 arg1 指向的值与 arg2 指向的值相等,则返回 0

deccopy #

复制十进制值。

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

该函数接收一个指向要复制的十进制值的指针作为第一个参数 (src),以及一个指向目标十进制类型结构的指针 (target) 作为第二个参数。

deccvasc #

将值从其 ASCII 表示形式转换为十进制类型。

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

该函数接收一个指向包含要转换的数字的字符串表示形式的字符串指针 (cp) 以及其长度 lennp 是一个指向十进制值的指针,该值保存操作的结果。

有效的格式示例包括:-2, .794, +3.44, 592.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),该函数接收一个指向十进制变量的指针,该变量应该保存操作的结果。

该函数在成功时返回 0,如果转换失败则返回负值。

deccvlong #

将 long 类型的值转换为十进制类型的值。

int deccvlong(long lng, decimal *np);

该函数接收应该转换的 long 类型变量作为其第一个参数 (lng)。作为第二个参数 (np),该函数接收一个指向十进制变量的指针,该变量应该保存操作的结果。

该函数在成功时返回 0,如果转换失败则返回负值。

decdiv #

将两个十进制类型的变量相除。

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 #

将两个十进制值相乘。

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

该函数接收指向作为第一个操作数 (n1) 和第二个操作数 (n2) 的变量的指针,并计算 n1*n2result 是一个指向应该保存操作结果的变量的指针。

成功时,返回 0;如果乘法失败,则返回负值。如果发生溢出或下溢,该函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW

decsub #

从另一个十进制值中减去一个十进制值。

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

该函数接收指向作为第一个操作数 (n1) 和第二个操作数 (n2) 的变量的指针,并计算 n1-n2result 是一个指向应该保存操作结果的变量的指针。

成功时,返回 0;如果减法失败,则返回负值。如果发生溢出或下溢,该函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW

dectoasc #

将十进制类型的变量转换为 C char* 字符串中的 ASCII 表示形式。

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

该函数接收一个指向十进制类型变量 (np) 的指针,并将其转换为文本表示形式。cp 是应该保存操作结果的缓冲区。参数 right 指定输出中应包含的小数点右侧的位数。结果将四舍五入到此小数位数。将 right 设置为 -1 表示输出中应包含所有可用的小数位数。如果输出缓冲区的长度(由 len 指示)不足以保存包括尾随零字节的文本表示形式,则结果中仅存储单个 * 字符,并返回 -1。

如果缓冲区 cp 太小,则该函数返回 -1;如果内存耗尽,则返回 ECPG_INFORMIX_OUT_OF_MEMORY

dectodbl #

将十进制类型的变量转换为 double 类型。

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

该函数接收一个指向要转换的十进制值的指针 (np) 和一个指向应该保存操作结果的 double 类型变量的指针 (dblp)。

成功时,返回 0;如果转换失败,则返回负值。

dectoint #

将十进制类型的变量转换为整数。

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

该函数接收一个指向要转换的十进制值的指针 (np) 和一个指向应该保存操作结果的整数变量的指针 (ip)。

成功时,返回 0;如果转换失败,则返回负值。如果发生溢出,则返回 ECPG_INFORMIX_NUM_OVERFLOW

请注意,ECPG 的实现与 Informix 的实现不同。Informix 将整数限制在 -32767 到 32767 的范围内,而 ECPG 实现中的限制取决于架构 (INT_MIN .. INT_MAX)。

dectolong #

将十进制类型的变量转换为长整数。

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

该函数接收一个指向要转换的十进制值的指针 (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 个短整数值数组的指针 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 个短整型数组创建一个日期值。

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 指向的时间戳变量中。

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

该函数将从 ts1 指向的时间戳变量中减去 ts2 指向的时间戳变量,并将结果存储在 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 个字节复制到新位置(如果源字符串有尾随空格,则会更少),并添加 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 的定义)。

提交更正

如果您发现文档中任何不正确、与您的特定功能体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。