Postgresql 中文操作指南

36.15. Informix Compatibility Mode #

_ecpg_可以在所谓的 _Informix compatibility mode_中运行。如果此模式处于活动状态,它将尝试表现得好像它是 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

$ 和后续预处理器指令(即 includedefineifdef 等)之间不能有任何空格。否则,预处理器会将令牌解析为主机变量。

有两种兼容模式:INFORMIXINFORMIX_SE

在链接使用此兼容模式的程序时,请记住,要链接到与 ECPG 一起提供的 libcompat

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

Informix 兼容模式与 ECPG 的 pgtypeslib 库密切相关。pgtypeslib 将 SQL 数据类型映射到 C 宿主机程序中的数据类型,并且 Informix 兼容模式的大多数附加函数允许你在那些 C 宿主机程序类型上进行操作。然而,请注意兼容性的范围是有限的。它不会尝试复制 Informix 行为;它允许你执行或多或少相同操作,并为你提供具有相同名称和相同基本行为的函数,但如果你当前正在使用 Informix,它不是一个直接替代品。此外,某些数据类型是不同的。例如,PostgreSQL 的 datetime 和 interval 类型不了解范围(例如 YEAR TO MINUTE),因此你也无法在 ECPG 中找到对它的支持。

36.15.1. Additional Types #

现在可以在没有使用 typedef 的情况下,在 Informix 模式下使用 Informix 特有的存储右对齐字符字符串数据的“string”伪类型。事实上,在 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;

36.15.2. Additional/Missing Embedded SQL Statements #

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

36.15.3. Informix-compatible SQLDA Descriptor Areas #

Informix 兼容模式支持与 Section 36.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 #

    • Unused, filled with zero-bytes.

  • 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 #

    • 空值指示器数据的长度。

  • sqlxid #

    • 字段的扩展类型, PQftype 的结果。

  • sqltypename_sqltypelen_sqlownerlen_sqlsourcetype_sqlownername_sqlsourceid_sqlflags__sqlreserved #

    • Unused.

  • 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 回归测试。

36.15.4. Additional Functions #

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

    • deccopy #

  • Copy a decimal value.

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);
  • 函数接收应作为第一个参数 (dbl) 转换的类型为 double 的变量。作为第二个参数 (np),函数接收一个指针,该指针指向应包含操作结果的十进制变量。

  • 函数在成功时返回 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/n2result 是应保存操作结果的变量的指针。

  • 成功返回 0,如果除法失败,则返回负值。如果发生了上溢或下溢,则函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW。如果检测到了除以零的尝试,则函数返回 ECPG_INFORMIX_DIVIDE_ZERO

    • decmul #

  • Multiply two decimal values.

int decmul(decimal *n1, decimal *n2, decimal *result);
  • 此函数接受第一个操作数 (n1) 和第二个操作数 (n2) 的变量指针,并计算 n1*n2result 是应保存操作结果的变量的指针。

  • 成功返回 0,如果相乘失败,则返回负值。如果发生了上溢或下溢,则函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW

    • decsub #

  • 从另一个 decimal 值中减去一个 decimal 值。

int decsub(decimal *n1, decimal *n2, decimal *result);
  • 此函数接受第一个操作数 (n1) 和第二个操作数 (n2) 的变量指针,并计算 n1-n2result 是应保存操作结果的变量的指针。

  • 成功返回 0,如果相减失败,则返回负值。如果发生了上溢或下溢,则函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW

    • dectoasc #

  • 将 decimal 类型的变量转换为在 C char* 字符串中的 ASCII 表示形式。

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

  • 如果缓冲区 cp 太小,则函数返回 -1,如果用尽了内存,则返回 ECPG_INFORMIX_OUT_OF_MEMORY

    • dectodbl #

  • 将 decimal 类型的变量转换为 double 类型的变量。

int dectodbl(decimal *np, double *dblp);
  • 此函数接受要转换的 decimal 值 (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),而另一个指针指向该长变量,它应保存操作的结果(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 #

  • Get the current date.

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);
  • 此函数接收以下内容的指针:日期值(应保存操作结果)(d)、用于解析日期的格式掩码(fmt)、以及包含日期文本表示的 C char* 字符串(str)。文本表示应匹配格式掩码。但是你不需要将字符串与格式掩码进行 1:1 映射。此函数仅分析顺序,并查找指示年份位置的文字 yyyyyy、指示月份位置的 mm,以及指示日期位置的 dd

  • 该函数返回以下值:

  • 内部此函数实现为使用 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 作为其唯一参数,并返回一个整数,表示此日期的星期几。

  • 函数内部实现为使用函数 PGTYPESdate_dayofweek

    • dtcurrent #

  • Retrieve the current timestamp.

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 #

  • 将间隔变量转换为 C char* 字符串。

int intoasc(interval *i, char *str);
  • 此函数接收要转换的区间变量的指针 (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 个字节复制到新位置(如果源字符串有尾部空格,则更少),并添加空结束符。

    • 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* 指针。

  • The following types exist:

  • 以下是调用此函数的一个示例:

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

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