ecpg
可以在所谓的Informix 兼容模式下运行。如果该模式处于活动状态,它将尝试表现为 Informix Informix E/SQL 的预编译器。一般来说,这将允许您使用美元符号代替 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 专用“字符串”伪类型现在在 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
的结果。
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
回归测试。
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
)以及其长度 len
。 np
是指向十进制值的指针,用于保存操作的结果。
例如,有效格式有:-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
。若检测到尝试除以 0,则函数返回 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 类型的值执行减法运算。
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 的变量转换成 integer。
int dectoint(decimal *np, int *ip);
该函数接收要转换的 decimal 值 (np
) 的指针和应该保存操作结果的 integer 变量 (ip
) 的指针。
成功时,返回 0,如果转换失败,返回负值。如果发生上溢,则返回 ECPG_INFORMIX_NUM_OVERFLOW
。
请注意,ECPG 实现与 Informix 实现不同。 Informix 将整数限制在 -32767 到 32767 的范围内,而 ECPG 实现中的限制取决于架构(INT_MIN .. INT_MAX
)。
dectolong
#将 variable of type decimal 转换为 long integer。
int dectolong(decimal *np, long *lngp);
该函数接收指向要转换的 decimal 值的指针 (np
) 和指向应保存运算结果的 long variable 的指针 (lngp
)。
成功时,返回 0,如果转换失败,返回负值。如果发生上溢,则返回 ECPG_INFORMIX_NUM_OVERFLOW
。
请注意,ECPG 实现与 Informix 实现不同。 Informix 将 long integer 限制在 -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 variable (d
) 的指针,将其设置为当前日期。
在内部,此函数会使用 PGTYPESdate_today
函数。
rjulmdy
#从 date 类型变量中提取天、月和年的值。
int rjulmdy(date d, short mdy[3]);
此函数会收到日期 d
,以及一个指向 3 个 short integer 值数组 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
)。预计文本表示形式将与格式掩码匹配。不过,您不需要让字符串与格式掩码严格一一对应。此函数仅会分析顺序,然后查找 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 个短整数数组创建一个日期值。
int rmdyjul(short mdy[3], date *d);
此功能接收 3 个短整数 (mdy
) 的数组和指向应保存操作结果的日期类型变量的指针。
目前,函数始终返回 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
#从一个时间戳中减去另一个时间戳,并返回类型为间隔的变量。
int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);
该函数将减去 ts2
指向的时间戳变量,从 ts1
指向的时间戳变量中减去结果,并将结果存储在 iv
指向的间隔变量中。
如果成功,该函数则返回 0,如果发生错误,则返回负值。
dttoasc
#将时间戳变量转换为 C char* 字符串。
int dttoasc(timestamp *ts, char *output);
该函数接收要转换的时间戳变量的指针 (ts
) 和应保存操作结果的字符串 (output
)。它将 ts
转换为其文本表示形式,该形式符合 SQL 标准,即 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
)。它将 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
#将一个定长字符串复制到一个以 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
- 对于类型为 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 定义)。