## 36.15.Informix兼容模式 [36.15.1. 其他类型](ecpg-informix-compat.html#ECPG-INFORMIX-TYPES) [36.15.2. 附加/缺少嵌入式SQL语句](ecpg-informix-compat.html#ECPG-INFORMIX-STATEMENTS) [36.15.3. Informix兼容的SQLDA描述符区域](ecpg-informix-compat.html#ECPG-INFORMIX-SQLDA) [36.15.4. 附加功能](ecpg-informix-compat.html#ECPG-INFORMIX-FUNCTIONS) [36.15.5. 附加常数](ecpg-informix-compat.html#ECPG-INFORMIX-CONSTANTS) `ecpg`可以在所谓的*Informix兼容模式*。如果此模式处于活动状态,它会尝试将其作为Informix E/SQL的Informix预编译器。一般来说,这将允许你使用美元符号,而不是美元符号`执行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; ``` ### 笔记 两个选项之间不得有任何空白`$`下面是一个预处理器指令,`包括`,`定义`,`条件编译`否则,预处理器将把令牌解析为主机变量。 有两种兼容模式:`INFORMIX`,`INFORMIX_SE` 链接使用此兼容模式的程序时,请记住链接到`利比卡特`这是ECPG附带的。 除了前面解释的语法糖之外,Informix兼容模式还移植了一些用于数据输入、输出和转换的函数,以及从E/SQL到ECPG的嵌入式SQL语句。 Informix兼容模式与ECPG的pgtypeslib库紧密相连。pgtypeslib将SQL数据类型映射到C主机程序内的数据类型,Informix兼容模式的大多数附加功能允许您在这些C主机程序类型上操作。但是请注意,兼容性的范围是有限的。它不试图复制Informix行为;它允许您执行或多或少相同的操作,并为您提供具有相同名称和相同基本行为的函数,但如果您目前正在使用Informix,它不是替代品。此外,有些数据类型是不同的。例如,PostgreSQL的datetime和interval类型不知道范围,例如`年复一年`所以你也不会在ECPG中找到支持。 ### 36.15.1.其他类型 在Informix模式下,现在支持存储右修剪字符串数据的Informix特殊“string”伪类型,而无需使用`类型定义`事实上,在Informix模式下,ECPG拒绝处理包含`typedef sometype字符串;` ``` 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.附加/缺少嵌入式SQL语句 `关闭数据库` 此语句关闭当前连接。事实上,这是ECPG的同义词`断开电流`: ``` $CLOSE DATABASE; /* close the current connection */ EXEC SQL CLOSE DATABASE; ``` `自由游标名称` 由于ECPG的工作方式与Informix的ESQL/C(即,哪些步骤纯粹是语法转换,哪些步骤依赖于底层的运行时库)不同,因此没有任何区别`自由游标名称`ECPG中的声明。这是因为在ECPG中,`声明游标`不会转换为对运行时库的函数调用,该库使用游标名称。这意味着ECPG运行时库中没有SQL游标的运行时簿记,只有在PostgreSQL server中。 `自由声明` `自由声明`是的同义词`取消分配准备语句\u名称`. ### 36.15.3.Informix兼容的SQLDA描述符区域 Informix兼容模式支持与中描述的不同的结构[第36.7.2节](ecpg-descriptors.html#ECPG-SQLDA-DESCRIPTORS).见下文: ``` 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` 指向每个字段属性的指针。 `描述你的名字` 未使用,填充了零字节。 `描述` 分配结构的大小。 `下一步` 如果结果集包含多条记录,则指向下一个SQLDA结构的指针。 `含蓄的` 未使用的指针,包含NULL。保持Informix兼容性。 每个字段的属性如下所示,它们存储在`sqlvar`数组: `sqltype` 字段的类型。常数在`sqltypes。H` `sqllen` 字段数据的长度。 `sqldata` 指向字段数据的指针。指针是`炭*`类型,它所指向的数据是二进制格式的。例子: ``` int intval; switch (sqldata->sqlvar[i].sqltype) { case SQLINTEGER: intval = *(int *)sqldata->sqlvar[i].sqldata; break; ... } ``` `sqlind` 指向空指示器的指针。如果由descripe或FETCH返回,则它始终是有效指针。如果用作`处决使用sqlda;`空指针值意味着这个字段的值不是空的。否则为有效指针和`sqlitype`必须正确设置。例子: ``` if (*(int2 *)sqldata->sqlvar[i].sqlind != 0) printf("value is NULL\n"); ``` `sqlname` 字段的名称。以0结尾的字符串。 `sqlformat` 保留在Informix中,值[`PQfformat`](libpq-exec.html#LIBPQ-PQFFORMAT)在球场上。 `sqlitype` 空指示符数据的类型。从服务器返回数据时总是使用SQLSMINT。当`SQLDA`用于参数化查询,根据集合类型处理数据。 `sqlilen` 空指示符数据的长度。 `sqlxid` 字段的扩展类型,结果为[`PQftype`](libpq-exec.html#LIBPQ-PQFTYPE). `sqltypename`\ `sqltypelen`\ `sqlownerlen`\ `sqlsourcetype`\ `sqlownername`\ `sqlsourceid`\ `sqlflags`\ `sqlreserved` 没用过。 `sqlilongdata` 等于`sqldata`如果`sqllen`大于32kB。 例子: ``` 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.附加功能 `脱卡` 添加两个十进制类型的值。 ``` int decadd(decimal *arg1, decimal *arg2, decimal *sum); ``` 该函数接收指向decimal类型的第一个操作数的指针(`arg1`),指向十进制类型的第二个操作数的指针(`arg2`)以及一个指向将包含总和的十进制类型值的指针(`总和`).成功后,函数返回0.`ECPG_INFORMIX_NUM_溢出`在溢出和`ECPG_INFORMIX_NUM_下溢`以防下溢-对于其他故障和故障,返回1`呃不`设置为相应的`呃不`pgtypeslib的编号。 `deccmp` 比较decimal类型的两个变量。 ``` int deccmp(decimal *arg1, decimal *arg2); ``` 函数接收指向第一个十进制值的指针(`arg1`),指向第二个十进制值的指针(`arg2`)并返回一个整数值,该整数值指示哪个值更大。 - 1.如果该值`arg1`指向的值大于`var2`指向 - \-1.如果该值`arg1`指向的值小于`arg2`指向 - 0,如果该值`arg1`指的是`arg2`分数相等 `decopy` 复制一个十进制值。 ``` void deccopy(decimal *src, decimal *target); ``` 该函数接收一个指向应作为第一个参数复制的十进制值的指针(`src`)以及指向decimal类型的目标结构的指针(`目标`)作为第二个论点。 `deccvasc` 将ASCII表示形式的值转换为十进制类型。 ``` int deccvasc(char *cp, int len, decimal *np); ``` 函数接收一个指向字符串的指针,该字符串包含要转换的数字的字符串表示形式(`内容提供商`)以及它的长度`伦恩`. `np`是指向保存操作结果的十进制值的指针。 有效的格式包括:`-2`, `.794`, `+3.44`, `592.49E07`或`-32.84e-4`. 函数在成功时返回0.如果发生溢流或下溢,`ECPG_INFORMIX_NUM_溢出`或`ECPG_INFORMIX_NUM_下溢`被退回。如果无法解析ASCII表示形式,`ECPG_INFORMIX_BAD_NUMERIC`被退回或`ECPG_INFORMIX_BAD_指数`如果在分析指数时出现此问题。 `deccvdbl` 将double类型的值转换为decimal类型的值。 ``` int deccvdbl(double dbl, decimal *np); ``` 函数接收应该转换为其第一个参数的double类型的变量(`dbl`).作为第二个论点(`np`),该函数接收一个指向十进制变量的指针,该变量应保存操作结果。 函数在成功时返回0,如果转换失败则返回负值。 `deccvint` 将int类型的值转换为decimal类型的值。 ``` int deccvint(int in, decimal *np); ``` 函数接收int类型的变量,该变量应转换为其第一个参数(`在里面`).作为第二个论点(`np`),该函数接收一个指向十进制变量的指针,该变量应保存操作结果。 函数在成功时返回0,如果转换失败则返回负值。 `德克夫隆` 将long类型的值转换为decimal类型的值。 ``` int deccvlong(long lng, decimal *np); ``` 函数接收long类型的变量,该变量应作为其第一个参数进行转换(`液化天然气`).作为第二个论点(`np`),该函数接收一个指向十进制变量的指针,该变量应保存操作结果。 函数在成功时返回0,如果转换失败则返回负值。 `德克迪夫` 除以两个十进制类型的变量。 ``` int decdiv(decimal *n1, decimal *n2, decimal *result); ``` 函数接收指向第一个变量的指针(`n1`)第二个呢(`n2`)操作数和计算`n1`/`n2`. `后果`是指向应保存操作结果的变量的指针。 成功时,返回0,如果除法失败,则返回负值。如果发生溢出或下溢,函数返回`ECPG_INFORMIX_NUM_溢出`或`ECPG_INFORMIX_NUM_下溢`分别地如果观察到被零除的尝试,函数将返回`ECPG_INFORMIX_DIVIDE_ZERO`. `德克穆尔` 将两个十进制值相乘。 ``` int decmul(decimal *n1, decimal *n2, decimal *result); ``` 函数接收指向第一个变量的指针(`n1`)第二个呢(`n2`)操作数和计算`n1`\*`n2`. `后果`是指向应保存操作结果的变量的指针。 成功时,返回0,如果乘法失败,则返回负值。如果发生溢出或下溢,函数返回`ECPG_INFORMIX_NUM_溢出`或`ECPG_INFORMIX_NUM_下溢`分别地 `德克苏布` 用一个十进制值减去另一个十进制值。 ``` int decsub(decimal *n1, decimal *n2, decimal *result); ``` 函数接收指向第一个变量的指针(`n1`)第二个呢(`n2`)操作数和计算`n1`-`n2`. `后果`是指向应保存操作结果的变量的指针。 成功时,返回0,如果减法失败,则返回负值。如果发生溢出或下溢,函数返回`ECPG_INFORMIX_NUM_溢出`或`ECPG_INFORMIX_NUM_下溢`分别地 `十二月` 将十进制类型的变量转换为C字符中的ASCII表示形式\*一串 ``` int dectoasc(decimal *np, char *cp, int len, int right) ``` 函数接收指向decimal类型变量的指针(`np`)它转换为文本表示。`内容提供商`应该保存操作结果的缓冲区。参数`正当`指定输出中小数点右侧的位数。结果将四舍五入到这个小数位数。背景`正当`to-1表示输出中应包含所有可用的十进制数字。如果输出缓冲区的长度由`伦恩`不足以保存文本表示,包括尾随的零字节,只有一个`*`字符存储在结果中,并返回-1. 如果缓冲区`内容提供商`太小或太小`ECPG_INFORMIX_内存不足`如果记忆耗尽。 `十二月` 将decimal类型的变量转换为double。 ``` int dectodbl(decimal *np, double *dblp); ``` 函数接收指向要转换的十进制值的指针(`np`)以及一个指向应该保存操作结果的双变量的指针(`dblp`). 如果转换成功,则返回0,如果转换失败,则返回负值。 `十进位` 将变量转换为十进制类型,并将其转换为整数。 ``` int dectoint(decimal *np, int *ip); ``` 函数接收指向要转换的十进制值的指针(`np`)以及一个指向整数变量的指针,该整数变量应包含运算结果(`知识产权`). 如果转换成功,则返回0,如果转换失败,则返回负值。如果发生溢出,`ECPG_INFORMIX_NUM_溢出`被退回。 请注意,ECPG实现与Informix实现不同。Informix将整数限制在-32767到32767之间,而ECPG实现中的限制取决于体系结构(`INT_MIN。。INT_MAX`). `十点钟` 将decimal类型的变量转换为长整数。 ``` int dectolong(decimal *np, long *lngp); ``` 函数接收指向要转换的十进制值的指针(`np`)以及一个指向长变量的指针,该变量应该保存操作的结果(`lngp`). 如果转换成功,则返回0,如果转换失败,则返回负值。如果发生溢出,`ECPG_INFORMIX_NUM_溢出`被退回。 请注意,ECPG实现与Informix实现不同。Informix将长整数限制在-2147483647到2147483647之间,而ECPG实现中的限制取决于体系结构(`-朗·麦克斯。。朗普马克斯`). `rdatestr` 将日期转换为C字符\*一串 ``` int rdatestr(date d, char *str); ``` 该函数接收两个参数,第一个是要转换的日期(`d`)第二个是指向目标字符串的指针。输出格式始终为`日期格式`,因此需要为字符串分配至少11个字节(包括零字节终止符)。 函数成功时返回0,错误时返回负值。 请注意,ECPG的实现与Informix实现不同。在Informix中,设置环境变量会影响格式。但是,在ECPG中,不能更改输出格式。 `rstrdate` 解析日期的文本表示。 ``` int rstrdate(char *str, date *d); ``` 函数接收要转换的日期的文本表示(`str`)以及指向日期类型变量的指针(`d`).此函数不允许您指定格式掩码。它使用Informix的默认格式掩码,即`年月日`.在内部,该功能通过`rdefmtdate`因此`rstrdate`不是更快,如果你有选择,你应该选择`rdefmtdate`它允许您明确指定格式掩码。 该函数返回的值与`rdefmtdate`. `今天` 获取当前日期。 ``` void rtoday(date *d); ``` 函数接收指向日期变量的指针(`d`)将其设置为当前日期。 在内部,该函数使用[`今天是你的生日`](ecpg-pgtypes.html#PGTYPESDATETODAY)作用 `鲁姆迪` 从日期类型的变量中提取日期、月份和年份的值。 ``` int rjulmdy(date d, short mdy[3]); ``` 函数接收日期`d`以及指向3个短整数值数组的指针`麦迪`.变量名表示顺序:`mdy[0]`将设置为包含月份的编号,`mdy[1]`将设置为当天的值`mdy[2]`将包含全年。 函数此时总是返回0. 函数在内部使用[`PGTYPESdate_julmdy`](ecpg-pgtypes.html#PGTYPESDATEJULMDY)作用 `rdefmtdate` 使用格式掩码将字符串转换为日期类型的值。 ``` int rdefmtdate(date *d, char *fmt, char *str); ``` 该函数接收一个指向应该保存操作结果的日期值的指针(`d`),用于解析日期的格式掩码(`fmt`)还有C字符\*包含日期文本表示形式的字符串(`str`).文本表示形式应与格式掩码匹配。但是,不需要将字符串与格式掩码进行1:1映射。该函数只分析顺序并查找文字`yy`或`年份`这表明了今年的形势,`嗯`表示月份的位置,以及`dd`指示当天的位置。 该函数返回以下值: - 0-函数已成功终止。 - `ECPG_INFORMIX_ENOSHORTDATE`-日期不包含日期、月份和年份之间的分隔符。在这种情况下,输入字符串的长度必须正好为6或8字节,但不是。 - `ECPG_INFORMIX_enotdmay`-格式字符串未正确指示年、月和日的顺序。 - `ECPG_INFORMIX_BAD_DAY`-输入字符串不包含有效的日期。 - `ECPG_INFORMIX_BAD_MONTH`-输入字符串不包含有效的月份。 - `ECPG_INFORMIX_BAD_YEAR`-输入字符串不包含有效的年份。 在内部,该功能的实现是为了使用[`PGTYPESdate_defmt_asc`](ecpg-pgtypes.html#PGTYPESDATEDEFMTASC)作用有关示例输入的表格,请参见此处的参考资料。 `rfmtdate` 使用格式掩码将日期类型的变量转换为其文本表示形式。 ``` int rfmtdate(date d, char *fmt, char *str); ``` 函数接收要转换的日期(`d`),格式掩码(`fmt`)以及保存日期文本表示形式的字符串(`str`). 成功时,将返回0,如果发生错误,则返回负值。 在内部,该函数使用[`PGTYPESdate_fmt_asc`](ecpg-pgtypes.html#PGTYPESDATEFMTASC)函数,请参见此处的参考以获取示例。 `rmdyjul` 从指定日期的日期、月份和年份的3个短整数数组中创建日期值。 ``` int rmdyjul(short mdy[3], date *d); ``` 函数接收3个短整数的数组(`麦迪`)以及一个指向date类型的变量的指针,该变量应保存操作的结果。 当前,该函数始终返回0. 在内部实现该函数以使用该函数[`PGTYPESdate_mdyjul`](ecpg-pgtypes.html#PGTYPESDATEMDYJUL). `星期五` 为日期值返回一个代表一周中某一天的数字。 ``` int rdayofweek(date d); ``` 函数接收日期变量`d`作为其唯一参数,并返回一个整数,该整数指示该日期的星期几。 - 0-周日 - 1-星期一 - 2-星期二 - 3-星期三 - 4-周四 - 5-周五 - 6-周六 在内部实现该函数以使用该函数[`PGTYPESdate_dayofweek`](ecpg-pgtypes.html#PGTYPESDATEDAYOFWEEK). `数据流` 检索当前时间戳。 ``` void dtcurrent(timestamp *ts); ``` 函数检索当前时间戳并将其保存到`ts`指向。 `dtcvasc` 将时间戳从其文本表示形式解析为时间戳变量。 ``` int dtcvasc(char *str, timestamp *ts); ``` 函数接收要分析的字符串(`str`)以及指向应该保存操作结果的时间戳变量的指针(`ts`). 函数成功时返回0,错误时返回负值。 在内部,该函数使用[`PGTYPEStimestamp_来自asc`](ecpg-pgtypes.html#PGTYPESTIMESTAMPFROMASC)作用有关输入示例的表格,请参见此处的参考资料。 `dtcvfmtasc` 使用格式掩码将时间戳从其文本表示形式解析为时间戳变量。 ``` dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue) ``` 函数接收要分析的字符串(`输入存储器`),要使用的格式掩码(`fmtstr`)以及指向应该保存操作结果的时间戳变量的指针(`dtvalue`). 此功能通过[`PGTYPEStimestamp_defmt_asc`](ecpg-pgtypes.html#PGTYPESTIMESTAMPDEFMTASC)作用有关可使用的格式说明符的列表,请参阅文档。 函数成功时返回0,错误时返回负值。 `dtsub` 从另一个时间戳中减去一个时间戳,并返回一个interval类型的变量。 ``` int dtsub(timestamp *ts1, timestamp *ts2, interval *iv); ``` 该函数将减去`ts2`从timestamp变量中指向`ts1`指向并将结果存储在`四、`指向。 成功后,如果发生错误,函数将返回0和负值。 `dttoasc` 将时间戳变量转换为C字符\*一串 ``` int dttoasc(timestamp *ts, char *output); ``` 函数接收指向要转换的时间戳变量的指针(`ts`)以及应该保存操作结果的字符串(`输出`).它改变了信仰`ts`根据SQL标准对其进行文本表示,即`YYYY-MM-DD HH:MM:SS`. 成功后,如果发生错误,函数将返回0和负值。 `dttofmtasc` 将时间戳变量转换为C字符\*使用格式掩码。 ``` int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr); ``` 函数接收指向要转换的时间戳的指针作为其第一个参数(`ts`),指向输出缓冲区的指针(`输出`),为输出缓冲区分配的最大长度(`斯特鲁伦`)以及用于转换的格式掩码(`fmtstr`). 成功后,如果发生错误,函数将返回0和负值。 在内部,此函数使用[`PGTYPEStimestamp_fmt_asc`](ecpg-pgtypes.html#PGTYPESTIMESTAMPFMTASC)作用有关可以使用何种格式掩码说明符的信息,请参阅参考资料。 `英托阿斯克` 将区间变量转换为C字符\*一串 ``` int intoasc(interval *i, char *str); ``` 函数接收指向要转换的间隔变量的指针(`我`)以及应该保存操作结果的字符串(`str`).它改变了信仰`我`根据SQL标准对其进行文本表示,即`YYYY-MM-DD HH:MM:SS`. 成功后,如果发生错误,函数将返回0和负值。 `rfmtlong` 使用格式掩码将长整数值转换为其文本表示形式。 ``` int rfmtlong(long lng_val, char *fmt, char *outbuf); ``` 函数接收长值`液化天然气`,格式掩码`fmt`以及指向输出缓冲区的指针`爆发`。它根据格式掩码将长值转换为其文本表示形式。 格式掩码可以由以下指定字符的格式组成: - `*`(星号)-如果该位置为空,则用星号填充。 - `&`(符号)-如果此位置为空,则用零填充。 - `#`-将前导零变成空格。 - `<`-左对齐字符串中的数字。 - `,`(逗号)-将四位或四位以上的数字分组为三位数字,并用逗号分隔。 - `.`(句号)-此字符将数字的整数部分与小数部分分开。 - `-`(减号)-如果数字为负值,则会出现减号。 - `+`(加号)-如果数字为正值,则会显示加号。 - `(`-这将替换负数前面的减号。减号不会出现。 - `)`-此字符替换负号,并打印在负值后面。 - `$`-货币符号。 `rupshift` 将字符串转换为大写。 ``` void rupshift(char *str); ``` 该函数接收指向字符串的指针,并将每个小写字符转换为大写字符。 `拜伦` 返回字符串中的字符数,不计算尾随空格。 ``` int byleng(char *str, int len); ``` 函数需要一个固定长度的字符串作为其第一个参数(`str`)它的长度是它的第二个参数(`伦恩`)。它返回有效字符数,即不带尾随空格的字符串长度。 `ldchar` 将固定长度的字符串复制到以null结尾的字符串中。 ``` void ldchar(char *src, int len, char *dest); ``` 函数接收要复制的固定长度字符串(`src`),它的长度(`伦恩`)以及指向目标内存的指针(`目的地`).请注意,您至少需要预订`len+1`字节的字符串`目的地`指向。函数最多只能复制`伦恩`字节添加到新位置(如果源字符串有尾随空格,则减少),并添加空终止符。 `味精` ``` 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); ``` 此功能存在,但目前尚未实现! `塞特努尔` 将变量设置为NULL。 ``` int rsetnull(int t, char *ptr); ``` 该函数接收一个指示变量类型的整数和一个指向变量本身的指针,该指针被转换为C字符\*指针。 存在以下类型: - `CCHARTYPE`-对于类型为`烧焦`或`炭*` - `CSHORTTYPE`-对于类型为`短整型` - `CINTTYPE`- 对于类型的变量`整数` - `CBOOLTYPE`- 对于类型的变量`布尔值` - `CFLOATTYPE`- 对于类型的变量`漂浮` - `克隆型`- 对于类型的变量`长` - `CDOUBLETYPE`- 对于类型的变量`双倍的` - `CDECIMALTYPE`- 对于类型的变量`十进制` - `CDATETYPE`- 对于类型的变量`日期` - `CDTIMETYPE`- 对于类型的变量`时间戳` 下面是一个调用这个函数的例子: ``` $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); ``` 该函数接收要测试的变量的类型 (`吨`) 以及指向该变量的指针 (`指针`).请注意,后者需要转换为char\*.查看函数[`塞特努尔`](ecpg-informix-compat.html#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.附加常数 请注意,这里的所有常量都描述了错误,所有这些常量都被定义为表示负值。在不同常量的描述中,您还可以找到这些常量在当前实现中表示的值。然而,你不应该依赖这个数字。然而,你可以依赖这样一个事实:它们都被定义为代表负值。 `ECPG_INFORMIX_NUM_溢出` 如果计算中发生溢出,函数将返回此值。在内部,它被定义为-1200(Informix定义)。 `ECPG_INFORMIX_NUM_下溢` 如果计算中出现下溢,函数将返回此值。内部定义为-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_内存不足` 如果操作期间内存耗尽,函数将返回此值。内部定义为-1211(Informix定义)。 `ECPG_INFORMIX_enotdmay` 如果解析例程应该获得格式掩码(如`嗯`)但并非所有字段都正确列出。内部定义为-1212(Informix定义)。 `ECPG_INFORMIX_BAD_NUMERIC` 如果解析例程因包含错误而无法解析数值的文本表示形式,或者例程因至少一个数值变量无效而无法完成涉及数值变量的计算,则函数返回此值。内部定义为-1213(Informix定义)。 `ECPG_INFORMIX_BAD_指数` 如果解析例程无法解析指数,函数将返回此值。内部定义为-1216(Informix定义)。 `ECPG_INFORMIX_BAD_DATE` 如果解析例程无法解析日期,函数将返回此值。内部定义为-1218(Informix定义)。 `ECPG_INFORMIX_额外_CHARS` 如果解析例程被传递了无法解析的额外字符,函数将返回此值。内部定义为-1264(Informix定义)。