完全版 ESQL/C资料二


第三节 IBM DB2嵌入SQL语言
DB2支持SQL嵌入到C/C、JAVA、COBOL、FORTRAN和REXX等语言 。本节以SQL嵌入C/C为例子,讲解静态的嵌入SQL编程和动态的嵌入SQL编程 。
静态SQL嵌入C语言编程是指,应用程序在书写时,每个SQL语句的大部分都已确定下来(如:查询的表、列和语句的格式等),唯一不确定的是查询语句中某些特定变量的值,这些值可以在执行时由变量传进去,但是,值的类型要事先确定 。
3.1 一个简单示例
首先,我们来看一个嵌入静态SQL语句的C程序 。
例1、连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息 。
#include
#include
#include
#include "util.h"
#include
EXEC SQL INCLUDE SQLCA; (1)
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;
int check_error (char eString[], struct sqlca *caPointer) {
char eBuffer[1024];
char sBuffer[1024];
short rc, Erc;
if (caPointer->sqlcode != 0) {
printf ("--- error report ---n");
printf ("ERROR occured : %s.nSQLCODE : %ldn", eString,
caPointer->sqlcode);
}
return 0;
}
int main(int argc, char *argv[]) {
EXEC SQL BEGIN DECLARE SECTION; (2)
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
printf( "Sample C program: STATICn" );
if (argc == 1) {
EXEC SQL CONNECT TO sample;
CHECKERR ("CONNECT TO SAMPLE");
}
else if (argc == 3) {
strcpy (userid, argv[1]);
strcpy (passwd, argv[2]);
EXEC SQL CONNECT TO sample USER :userid USING :passwd; (3)
CHECKERR ("CONNECT TO SAMPLE");
}
else {
printf ("nUSAGE: static [userid passwd]nn");
return 1;
} /* endif */

EXEC SQL SELECT FIRSTNME INTO :firstname
FROM employee
WHERE LASTNAME = "JOHNSON";(4)
CHECKERR ("SELECT statement"); (5)
printf( "First name = %sn", firstname );
EXEC SQL CONNECT RESET; (6)
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : STATIC.SQC */上面是一个简单的静态嵌入SQL语句的应用程序 。它包括了静态嵌入SQL的主要部分 。
(1)中的include SQLCA语句定义并描述了SQLCA的结构 。SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态 。
(2)在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了主变量 。主变量可被SQL语句引用,也可以被C语言语句引用 。它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果 。在SQL语句中,主变量前均有“:”标志以示区别 。
(3)在每次访问数据库之前必须做CONNECT操作,以连接到某一个数据库上 。这时,应该保证数据库实例已经启动 。
(4)是一条选择语句 。它将表employee中的LASTNAME为“JOHNSON”的行数据的FIRSTNAME查出,并将它放在firstname变量中 。该语句返回一个结果 。可以通过游标返回多个结果 。
(5)在该程序中通过调用宏CHECKERR(即调用函数check_error)来返回SQL语句执行的结果 。Check_error函数在下面讲解 。
(6)最后断开数据库的连接 。
从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句 。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句 。如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“” 。
3.2 嵌入SQL语句
3.2.1宿主变量
1)、声明方法
宿主变量就是在嵌入式SQL语句中引用主语言说明的程序变量(如上例中的firstname变量) 。如:
………….
EXEC SQL SELECT FIRSTNME INTO :firstname (4)
FROM employee
WHERE LASTNAME = "JOHNSON";
………….
在嵌入式SQL语句中使用宿主变量前,必须采用BEGIN DECLARE SECTION 和END DECLARE SECTION之间给宿主变量说明 。这两条语句不是可执行语句,而是预编译程序的说明 。宿主变量是标准的C程序变量 。嵌入SQL语句使用宿主变量把数据库中查询到的值返回给应用程序(称为输出宿主变量),也用于将程序中给定的值传到SQL语句中(称为输入宿主变量) 。显然,C程序和嵌入SQL语句都可以访问宿主变量 。

推荐阅读