完全版 ESQL/C资料三( 十 )


方法2:在每个变量的数据类型前加上“$” 。如:
$int hostint;
$double hostdbl;
ESQL/C对宿主变量的大小写敏感 。但是,ESQL/C的关键字、语句标志符、游标名大小写不敏感 。在SQL语句中,除了使用“:”来标志宿主变量外,还可以使用“$” 。当然,“:”是ANSI标准 。如:EXEC SQL connect to $hostvar 。对于注释,可以使用“--”,也可以使用标准的“/*…*/” 。
2)、宿主变量和NULL
方法1:使用指示符变量 。
方法2:使用函数risnull()和rsetnull() 。
3)、指示符变量
大多数程序设计语言(如C)都不支持NULL 。所以对NULL的处理,一定要在SQL中完成 。我们可以使用主机指示符变量来解决这个问题 。在嵌入式SQL语句中,宿主变量和指示符变量共同规定一个单独的SQL类型值 。指示变量和前面宿主变量之间用一个空格相分隔 。如:
EXEC SQL select lname, company
into :name INDICATOR :nameind, :comp INDICATOR :compind
nameind是name变量的指示符,而compind是comp变量的指示符 。
可以通过以下三种方法使用指示符变量:
方法1、使用INDICATOR关键字 。
:hostvar INDICATOR :indvar
方法2、
:hostvar :indvar
方法3、使用$符号 。
$hostvar $indvar 。
无论采用哪种方法,都是实现指示符变量的作用 。即:当宿主变量hostvar应该返回NULL时,指示符变量为-1 。当宿主变量hostvar应该返回不是NULL而且无需截断时,指示符变量为0 。当返回值太大而需要截断时,指示符变量是截断前数据的长度 。SQLSTATE会返回01004错误信息 。请看下面这个例子:
EXEC SQL BEGIN DECLARE SECTION;
char name[16];
char comp[20];
short nameind;
short compind;
EXEC SQL END DECLARE SECTION;
EXEC SQL select lname, company
into :name INDICATOR :nameind, :comp INDICATOR :compind
from customer
where customer_num = 105;
如果对应105的company为NULL,则compind小于0,如果lname的结果大于15个字节,那么name包含前15个字符 。
4)、宿主变量的数据类型
INFROMIX ESQ/C的宿主变量数据类型除了标准C的数据类型外,可以是它自己定义的数据类型 。如:
lvarchar数据类型
EXEC SQL BEGIN DECLARE SECTION;
varchar varc_name[n1];
EXEC SQL END DECLARE SECTION;
lint8数据类型
EXEC SQL BEGIN DECLARE SECTION;
int8 int8_var1;
ifx_int8_t int8_var2;
EXEC SQL BEGIN DECLARE SECTION;
lfixchar数据类型
EXEC SQL BEGIN DECLARE SECTION;
boolean flag;
fixchar my_boolflag;
int id;
EXEC SQL END DECLARE SECTION;
lDecimal数据类型
#define DECSIZE 16
struct decimal
{
short dec_exp;
short dec_pos;
short dec_ndgts;
char dec_dgts[DECSIZE];
};
typedef struct decimal dec_t;
lDatetime数据类型
EXEC SQL include datetime;
EXEC SQL BEGIN DECLARE SECTION;
datetime year; /* will cause an error */
datetime year to day year, today; /* ambiguous */
EXEC SQL END DECLARE SECTION;
lInterval hour等数据类型
EXEC SQL BEGIN DECLARE SECTION;
interval day(3) to day accrued_leave, leave_taken;
interval hour to second race_length;
interval scheduled;
EXEC SQL END DECLARE SECTION;
l其他数据类型
EXEC SQL BEGIN DECLARE SECTION;
loc_t my_simple_lo;
EXEC SQL END DECLARE SECTION;
my_simole_lo.loc_loctype = LOCMEMORY;
l在INFORMIX数据库中,""表示为NULL 。如:
id = 1;
flag = ""; /* valid boolean assignment to FALSE */
EXEC SQL insert into table2 values (:id, :flag); /* inserts FALSE */
在以SQL为基础的DBMS支持的数据类型与程序设计语言支持的数据类型之间有很大差别 。如果你通过宿主变量从数据库取值,或者通过宿主变量向数据库插入值,都存在数据类型转换的问题 。
下表列出了C的数据类型、ESQL/C定义的数据类型和SQL数据类型的兼容关系:SQL数据类型 ESQL/C定义的数据类型 C的数据类型BOOLEAN boolean

推荐阅读