完全版 ESQL/C资料二( 二 )


在使用宿主变量前,请注意以下几点:
l宿主变量的长度不能超过30字节 。开始的字母不能是EXEC和SQL 。
l宿主变量必须在被引用之前定义 。
l一个源程序文件中可以有多个SQL说明段 。
l宿主变量名在整个程序中必须是唯一的 。
2)、宿主变量的数据类型
宿主变量是一个用程序设计语言的数据类型说明并用程序设计语言处理的程序变量;另外,在嵌入SQL语句中用宿主变量保存数据库数据 。所以,在嵌入SQL语句中,必须映射C数据类型为合适的DB2数据类型 。必须慎重选择宿主变量的数据类型 。请看下面这个例子:
EXEC SQL BEGIN DECLARE SECTION;
short hostvar1 = 39;
char *hostvar2 = "telescope";
EXEC SQL END DECLARE SECTION;EXEC SQL UPDATE inventory
SET department = :hostvar1
WHERE part_num = "4572-3";EXEC SQL UPDATE inventory
SET prod_descrip = :hostvar2
WHERE part_num = "4572-3";
在第一个update语句中,department列为smallint数据类型,所以应该把hostvar1定义为short数据类型 。这样的话,从C到DB2的hostvar1可以直接映射 。在第二个update语句中,prod_descip列为varchar数据类型,所以应该把hostvar2定义为字符数组 。这样的话,从C到DB2的hostvar2可以从字符数组映射为varchar数据类型 。
下表列出了C的数据类型和DB2的数据类型的一些转换关系:
DB2数据类型C数据类型
Smallintshort
IntegerLong
Decimal(p,s)无
DoubleDouble
DateChar[11]
TimeChar[9]
TimestampChar[27]
Char(X)Char[X 1]
Varchar(X)Char[X 1]
Graphic(X)Wchar_t[X 1]
Vargraphic(X)Wchar_t[X 1]
因为C没有date或time数据类型,所以DB2的date或time列将被转换为字符 。缺省情况下,使用以下转换格式:mm dd yyyy hh:mm:ss[am | pm] 。你也可以使用字符数据格式将C的字符数据存放到DB2的date列上 。对于DECIMAL数据类型,在C语言中也没有对应的数据类型 。但可以使用char数据类型实现 。
3)、宿主变量和NULL
大多数程序设计语言(如C)都不支持NULL 。所以对NULL的处理,一定要在SQL中完成 。我们可以使用主机指示符变量来解决这个问题 。在嵌入式SQL语句中,宿主变量和指示符变量共同规定一个单独的SQL类型值 。指示变量和前面宿主变量之间用一个空格相分隔 。如:
EXEC SQL SELECT price INTO :price :price_nullflag FROM titles
WHERE au_id = "mc3026"
其中,price是宿主变量,price_nullflag是指示符变量 。指示符变量的值为:
l-1 。表示宿主变量应该假设为NULL 。(注意:宿主变量的实际值是一个无关值,不予考虑) 。
l=0 。表示宿主变量不是NULL 。
l>0 。表示宿主变量不是NULL 。而且宿主变量对返回值作了截断,指示变量存放了截断数据的长度 。
所以,上面这个例子的含义是:如果不存在mc3026写的书,那么price_nullflag为-1,表示price为NULL;如果存在,则price为实际的价格 。
指示变量也是一种宿主变量,也需要在程序中定义,它对应数据库系统中的数据类型为SMALLINT 。为了便于识别宿主变量,当嵌入式SQL语句中出现宿主变量时,必须在变量名称前标上冒号(:) 。冒号的作用是,告诉预编译器,这是个宿主变量而不是表名或列名 。
3.2.2单行查询
单行查询是通过SELECT INTO语句完成 。当这条语句执行时,查询的结果送入INTO所标志的变量中 。如果SQLCODE是100,或者SQLSTATE是02000,则说明没有查询到结果或返回结果为NULL,这时,宿主变量不改变,否则,宿主变量中将包含查询的结果 。如:
………….
EXEC SQL SELECT FIRSTNME INTO :firstname
FROM employee
WHERE LASTNAME = "JOHNSON";
………….3.2.3多行查询
对于多行结果,必须使用游标来完成 。游标是一个与SELECT语句相关联的符号名,它使用户可逐行访问由DB2返回的结果集 。下面这个例子演示了游标的使用方法 。这个例子的作用是,逐行打印出每个经理的名字和部门 。

推荐阅读