35.15. Informix 兼容模式

ecpg可以在* Informix 兼容模式*下运行。如果此模式处于活动状态,它将尝试表现为 Informix E/SQL 的 Informix 预编译器。通常来说,这将允许您使用美元符号代替EXEC SQLPrimitives 来引入嵌入式 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

$和后面的预处理程序指令之间没有空格,即includedefineifdef等。否则,预处理程序会将令牌解析为主机变量。

有两种兼容模式:INFORMIXINFORMIX_SE

链接使用此兼容模式的程序时,切记要针对 ECPG 随附的libcompat进行链接。

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

Informix 兼容性模式与 ECPG 的 pgtypeslib 库紧密相连。 pgtypeslib 将 SQL 数据类型 Map 到 C 主机程序内的数据类型,并且 Informix 兼容模式的大多数附加功能允许您对这些 C 主机程序类型进行操作。但是请注意,兼容性的程度受到限制。它不会尝试复制 Informix 行为;它允许您执行或多或少的相同操作,并为您提供具有相同名称和相同基本行为的功能,但是如果您当前使用的是 Informix,则不能直接替换。此外,某些数据类型是不同的。例如,PostgreSQL 的日期时间和间隔类型不知道诸如YEAR TO MINUTE之类的范围,因此您也不会在 ECPG 中找到对此的支持。

35 .15.1. 附加类型

现在,在 Informix 模式下无需使用typedef即可支持用于存储右修剪的字符串数据的 Informix 特殊“字符串”伪类型。实际上,在 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;

35 .15.2. 附加/缺少嵌入式 SQL 语句

  • CLOSE DATABASE

    • 该语句关闭当前连接。实际上,这是 ECPG 的DISCONNECT CURRENT的同义词:
$CLOSE DATABASE;                /* close the current connection */
EXEC SQL CLOSE DATABASE;
  • FREE cursor_name

    • 由于与 Informix 的 ESQL/C 相比 ECPG 的工作方式不同(即,哪些步骤纯粹是语法转换,哪些步骤依赖于基础运行时库),因此 ECPG 中没有FREE cursor_name语句。这是因为在 ECPG 中,DECLARE CURSOR不会转换为对用于游标名称的运行时库的函数调用。这意味着 ECPG 运行时库中没有 SQL 游标的运行时簿记,仅在 PostgreSQL 服务器中。
  • FREE statement_name

    • FREE statement_nameDEALLOCATE PREPARE statement_name的同义词。

35 .15.3. 与 Informix 兼容的 SQLDADescriptors 区域

Informix 兼容模式支持的结构与Section 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

    • SQLDADescriptors 中的字段数。
  • 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;的 Importing,则 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

    • Unused.
  • 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 */

有关更多信息,请参见sqlda.hHeaders 和src/interfaces/ecpg/test/compat_informix/sqlda.pgc回归测试。

35 .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),该函数接收一个指向十进制变量的指针,该指针应保存操作的结果。

如果成功,函数将返回 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

    • 将类型为十进制的变量转换为双精度型。
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_MAX .. 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的数组的指针。变量名称指示 Sequences:mdy[0]将设置为包含月份的数字,mdy[1]将被设置为 day 的值,mdy[2]将包含年份。

该函数此刻始终返回 0.

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

  • rdefmtdate

    • 使用格式掩码将字符串转换为日期类型的值。
int rdefmtdate(date *d, char *fmt, char *str);

该函数接收一个指向日期值的指针,该日期值应保存操作的结果(d),用于解析日期的格式掩码(fmt)和包含日期的文本表示形式的 C char *字符串(str)。文本表示应与格式掩码匹配。但是,您无需将字符串与格式掩码进行 1:1Map。该函数仅分析 Sequences,并寻找表示年份位置的 Literalsyyyyyymm指示月份的位置和dd指示日期的位置。

该函数返回以下值:

  • 0 -功能已成功终止。

  • ECPG_INFORMIX_ENOSHORTDATE-日期不包含日,月和年之间的分隔符。在这种情况下,Importing 字符串必须恰好是 6 或 8 个字节长,但不是。

  • ECPG_INFORMIX_ENOTDMY-格式字符串未正确指示年,月和日的 Sequences。

  • ECPG_INFORMIX_BAD_DAY-Importing 的字符串不包含有效的日期。

  • ECPG_INFORMIX_BAD_MONTH-Importing 的字符串不包含有效的月份。

  • ECPG_INFORMIX_BAD_YEAR-Importing 的字符串不包含有效的年份。

在内部,此函数被实现为使用PGTYPESdate_defmt_asc函数。请参阅参考资料中的示例 Importing 表。

  • 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)的 timestamp 变量的指针。

如果成功,该函数将返回 0,如果出错则返回负值。

在内部,此函数使用PGTYPEStimestamp_from_asc函数。有关 Importing 示例的表格,请参见此处的参考。

  • dtcvfmtasc

    • 使用格式掩码将时间戳从其文本表示形式解析为时间戳变量。
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

    • 将时间戳变量转换为 C char *字符串。
int dttoasc(timestamp *ts, char *output);

该函数接收指向要转换的时间戳变量的指针(ts)和应保存操作结果的字符串(output)。它将根据 SQL 标准YYYY-MM-DD HH:MM:SSts转换为其文本表示形式。

成功后,函数将返回 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 标准YYYY-MM-DD HH:MM:SSi转换为其文本表示形式。

成功后,函数将返回 0,如果发生错误,则返回负值。

  • rfmtlong

    • 使用格式掩码将长整数值转换为其文本表示形式。
int rfmtlong(long lng_val, char *fmt, char *outbuf);

该函数接收长值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-对于类型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);

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

    • 如果解析例程由于包含错误而无法解析文本表示形式的数字值,或者例程由于至少一个数字变量无效而无法完成涉及数字变量的计算,则函数将返回该值。在内部将其定义为-1213(Informix 定义)。
  • ECPG_INFORMIX_BAD_EXPONENT

    • 如果解析例程无法解析指数,则函数将返回此值。在内部将其定义为-1216(Informix 定义)。
  • ECPG_INFORMIX_BAD_DATE

    • 如果解析例程无法解析日期,则函数将返回此值。在内部将其定义为-1218(Informix 定义)。
  • ECPG_INFORMIX_EXTRA_CHARS

    • 如果向解析例程传递了无法解析的额外字符,则函数将返回此值。在内部将其定义为-1264(Informix 定义)。