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


*/
{
#line 44 "demodb2.sqc"
sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca);
#line 44 "demodb2.sqc"
sqlaaloc(3,1,3,0L);
{
struct sqla_setd_list sql_setdlist[1];
#line 44 "demodb2.sqc"
sql_setdlist[0].sqltype = 460; sql_setdlist[0].sqllen = 13;
#line 44 "demodb2.sqc"
sql_setdlist[0].sqldata = https://www.rkxy.com.cn/dnjc/(void*)firstname;
#line 44 "demodb2.sqc"
sql_setdlist[0].sqlind = 0L;
#line 44 "demodb2.sqc"
sqlasetd(3,0,1,sql_setdlist,0L);
}
#line 44 "demodb2.sqc"
sqlacall((unsigned short)24,1,0,3,0L);
#line 44 "demodb2.sqc"
sqlastop(0L);
}#line 44 "demodb2.sqc"CHECKERR ("SELECT statement");
printf( "First name = %sn", firstname );

/*
EXEC SQL CONNECT RESET;
*/
{
#line 47 "demodb2.sqc"
sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca);
#line 47 "demodb2.sqc"
sqlacall((unsigned short)29,3,0,0,0L);
#line 47 "demodb2.sqc"
sqlastop(0L);
}
#line 47 "demodb2.sqc"
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : STATIC.SQC */
生成的BIND文件为demodb2.bnd 。
3.4 DB2的动态SQL嵌入语句
所谓静态SQL的编程方法,就是指在预编译时SQL语句已经基本确定,即访问的表或视图名、访问的列等信息已经确定 。但是,有时整个SQL语句要到执行的时候才能确定下来,而且SQL语句所访问的对象也要到执行时才能确定 。这就需要通过动态SQL语句完成 。
3.4.1 基本方法
执行动态SQL语句的程序,主要有三条语句来完成:
1)、PREPARE语句 。由于动态SQL语句在执行时才能确定,所以DB2中使用一个字符型的宿主变量来存放相应的SQL语句 。但是,这条语句在预编译时不存在,因而在预编译时无法编译这个SQL语句 。但是,存放在宿主变量中的语句必须转化为可执行的格式后才能执行 。PREPARE命令的作用是完成编译的工作 。即相当于静态SQL中的BIND操作,在数据库管理器中生成PACKAGE,并给出一个语句的名字 。在后面的DESCRIBE、EXECUTE和OPEN等命令都使用这个名字来访问相应的SQL语句 。SQL语句在做PREPARE操作时,不可使用宿主变量来表示参数,但可以在相应的位置上使用“?”来表示该位置上应该有一个参数 。PREPARE还将生成相应的SQLDA结构 。
2)、EXECUTE语句 。该语句的作用是执行已经做过PREPARE操作的SQL语句 。在EXECUTE语句中,将针对PREPARE语句中的每个参数标志给出相应的参数值,这些参数值可以有宿主变量传递,他们的类型应该匹配 。EXECUTE命令不能做SELECT操作,这是因为EXECUTE语句无法返回结果,要执行SELECT操作,应该通过游标完成 。
EXECUTE IMMEDIATE语句是PERPARE语句和EXECUTE语句的综合,它对语句做PREPARE,生成可执行模式,在执行 。
3)、DESCRIBE语句 。将执行过的PREPARE的SQL语句结果信息存放在SQLDA结构 。
例、查询表名不是STAFF的表信息 。
#include
#include
#include
#include "util.h"
EXEC SQL INCLUDE SQLCA;
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;
int main(int argc, char *argv[]) {
EXEC SQL BEGIN DECLARE SECTION;
char table_name[19];
/*st[80]宿主变量存放SQL语句*/
char st[80];
char parm_var[19];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
printf( "Sample C program: DYNAMICn" );
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;
CHECKERR ("CONNECT TO SAMPLE");
}
else {
printf ("nUSAGE: dynamic [userid passwd]nn");
return 1;
} /* endif */
strcpy( st, "SELECT tabname FROM syscat.tables" );
strcat( st, " WHERE tabname <> ?" );
/*对st做PREPARE操作,st中的“?”表示参数*/
EXEC SQL PREPARE s1 FROM :st;
CHECKERR ("PREPARE");

推荐阅读