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


请看下面这个例子 。这个例子的作用是删除用户指定的雇员信息 。
...
int emp_number INTEGER;
char delete_stmt[120], search_cond[40]
...
strcpy(delete_stmt, "DELETE FROM EMP WHERE EMPNO = :n AND ");
printf("Complete the following statement"s search condition--n");
printf("%sn", delete_stmt);
gets(search_cond);
strcat(delete_stmt, search_cond);

EXEC SQL PREPARE sql_stmt FROM :delete_stmt;
for (;;)
{printf("Enter employee number: ");
gets(temp);
emp_number = atoi(temp);
if (emp_number == 0)
break;
EXEC SQL EXECUTE sql_stmt USING :emp_number;
}
l方法三:是指查询的列数或输入宿主变量数在预编译时已经确定,但是数据库中的对象,如表、列名等信息未确定 。这些对象名不能是宿主变量 。这时,必须通过以下语句来完成:
PREPARE statement_name FROM { :host_string | string_literal };
DECLARE cursor_name CURSOR FOR statement_name;
OPEN cursor_name [USING host_variable_list];
FETCH cursor_name INTO host_variable_list;
CLOSE cursor_name;
如:下面这个例子演示用方法3完成动态查询:
char select_stmt[132] =
"SELECT MGR, JOB FROM EMP WHERE SAL < :salary";
EXEC SQL PREPARE sql_stmt FROM :select_stmt;
EXEC SQL DECLARE emp_cursor CURSOR FOR sql_stmt;
EXEC SQL OPEN emp_cursor USING :salary;
EXEC SQL FETCH emp_cursor INTO :mgr_number, :job_title;
EXEC SQL CLOSE emp_cursor;
l方法四:在预编译时,查询的列数或者宿主变量的个数不能确定,因为不知道具体的返回个数,所以不能使用输出宿主变量 。这是因为你不知道应该定义多少个宿主变量 。这时,就需要SQLDA结构和DESCRIBE命令 。SQLDA包含了动态查询的列描述信息 。对于输入宿主变量,也可以使用SQLDA来完成不确定的参数说明 。要完成方法四,必须通过以下语句来完成:
EXEC SQL PREPARE statement_name FROM { :host_string | string_literal };
EXEC SQL DECLARE cursor_name CURSOR FOR statement_name;
EXEC SQL DESCRIBE BIND VARIABLES FOR statement_name
INTO bind_descriptor_name;
EXEC SQL OPEN cursor_name
[USING DESCRIPTOR bind_descriptor_name];
EXEC SQL DESCRIBE [SELECT LIST FOR] statement_name
INTO select_descriptor_name;
EXEC SQL FETCH cursor_name USING DESCRIPTOR select_descriptor_name;
EXEC SQL CLOSE cursor_name;
在上述语句中,DESCRIBE SELECT LIST的作用是将PREPARE后的动态查询语句的列名、数据类型、长度等信息保存在SQLDA中 。DESCRIBE BIND VARIABLES的作用是,检查PREPARE后的动态查询语句的每个占位符的名字、数据类型、长度等信息 。并将它存放在SQLDA中,然后,使用SQLDA提示用户数据参数值 。
值得注意的是,方法之间可以混合使用 。如:在一个查询中,列的个数确定,但是查询中的占位符不确定,这时,你可以结合方法3和方法4,即使用方法3的FETCH语句和方法4的OPEN语句,如:EXEC SQL FETCH emp_cursor INTO host_variable_list; 反之,如果查询中占位符的个数确定,而列数不确定,则你可以使用方法3的OPEN语句,如:EXEC SQL OPEN cursor_name [USING host_variable_list];
这里,我们讲解的是嵌入SQL,对于嵌入PL/SQL,有一些区别 。简单来说,主要有两点:
l预编译器将PL/SQL块中的所有宿主变量都作为输入宿主变量 。
l不能对PL/SQL块使用FETCH命令 。
l占位符不用声明,可以是任何名字 。如:
INSERT INTO emp (empno, deptno) VALUES (:e, :d)
DELETE FROM dept WHERE deptno = :num OR loc = :loc
其中的e、d、num和loc就是占位符 。
4.3.3 SQLDA
SQLDA存放了输出数据的信息,或存放了输入数据的信息 。可以使用SQLSQLDAAlloc(runtime_context, size, name_length, ind_name_length)来分配空间 。
SQLDA结构的定义存放在sqlda.h文件中 。它的内容为:
struct SQLDA
{
long N; /* Descriptor size in number of entrIEs */

推荐阅读