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 的 datetime 和 interval 类型不了解像 YEAR TO MINUTE 这样的范围,因此 ECPG 中也不会找到对此的支持。
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;
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 的同义词。
兼容 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;
全局属性是
每个字段的属性如下,它们存储在 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 的结果。
sqltypenamesqltypelensqlownerlensqlsourcetypesqlownernamesqlsourceldsqlflagssqlreserved #未使用。
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 回归测试。
decadd #将两个十进制类型的值相加。
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 值的指针,用于保存操作结果。 0 - 成功时,函数返回 0。如果发生溢出或下溢,则返回 ECPG_INFORMIX_NUM_OVERFLOW 或 ECPG_INFORMIX_NUM_UNDERFLOW。如果无法解析 ASCII 表示形式,则返回 ECPG_INFORMIX_BAD_NUMERIC;如果在解析指数时发生此问题,则返回 ECPG_INFORMIX_BAD_EXPONENT。
有效格式例如: -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)以及指向应保存操作结果的长变量的指针(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 int 值的数组的指针 mdy。变量名表示顺序:mdy[0] 将被设置为包含月份编号,mdy[1] 将被设置为日期值,mdy[2] 将包含年份。
目前该函数始终返回 0。
内部来说,该函数使用 PGTYPESdate_julmdy 函数。
rdefmtdate #使用格式掩码将字符字符串转换为 date 类型值。
int rdefmtdate(date *d, char *fmt, char *str);
该函数接收指向应保存操作结果的 date 值的指针(d),用于解析日期的格式掩码(fmt),以及包含日期文本表示的 C char* 字符串(str)。文本表示应与格式掩码匹配。但是,您不需要将字符串与格式掩码进行 1:1 映射。该函数仅分析顺序并查找表示年份位置的文字 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 数组创建 date 值。
int rmdyjul(short mdy[3], date *d);
该函数接收 3 个 short int 数组(mdy)以及指向应保存结果的 date 类型变量的指针。
目前函数始终返回 0。
内部来说,函数被实现为使用 PGTYPESdate_mdyjul 函数。
rdayofweek #返回一个数字,表示 date 值的星期几。
int rdayofweek(date d);
该函数接收 date 变量 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);
该函数将 ts2 指向的时间戳变量从 ts1 指向的时间戳变量中减去,并将结果存储在 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 个字节复制到新位置(如果源字符串有尾随空格,则复制的字节数会少于 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 - 用于 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);
请注意,此处的所有常量都描述了错误,并且所有常量都定义为表示负值。在不同常量的描述中,您还可以找到当前实现中常量代表的值。但是,您不应依赖此数字。但是,您可以依赖所有这些常量都被定义为表示负值这一事实。
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 定义)。