- 这种方法可以执行包括查询语句在内的动态SQL语句, 但它要求在预编译时刻动态SQL语句内选择列表项数,输入宿主变量占位符数据以及输入宿主变量的数据类型必须确定。 方法三以游标方式执行动态SQL语句, 它对SQL语句的处理过程为:
- ①. 准执行PREPARE命令准备SQL语句;
- #实际就是把要执行的动态语句调入内存, 以
- 便以后对它进行操作。
- ②. 执行DECLARE命令声明游标;
- ③. 执行OPEN打开游标;
- ④. 调用FETCH语句提取游标;
- ⑤. 调用CLOSE语句关闭游标。
- 动态SQL语句中的数据库对象名称和列名可以在运行时刻指定, 便此时不能以宿主变量形式指定对象名称或列名.
- 其实就是多了一个游标的使用。
- 如下面程序:
- <连接数据库>;
- strcpy(sql_stmt, "SELECT name, address, sex FROM test001");
- EXEC SQL PREPARE select_stmt FROM :sql_stmt;
- EXEC SQL DECLARE c1 CURSOR FOR select_stmt;
- EXEC SQL OPEN c1;
- EXEC SQL WHENEVER NOT FOUND DO BREAK;
- while(1)
- Oracle Pro*C 编程入门
- {
- EXEC SQL FETCH c1 INTO :Name, :address, :sex;
- printf("The name is: %s, The Address is: %s, The sex is :%s\n", Name, address,
- sex);
- }
- EXEC SQL CLOSE c1;
-
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlca.h> void connect(); void sql_err(); void dynamic_sqlthree(); void main() { EXEC SQL WHENEVER SQLERROR DO sql_err(); connect(); dynamic_sqlthree(); EXEC SQL COMMIT RELEASE; } void sql_err() { //printf("%.*s\n",sqlca.sqlerrm.sqlerrml,,sqlca.sqlerrm.sqlerrmc); } void connect()/*数据库连接-本地数据库,不添加server*/ { EXEC SQL BEGIN DECLARE SECTION; VARCHAR oraCN[30]; EXEC SQL END DECLARE SECTION; strcpy(oraCN.arr,"scott/Tiger@TEST_dist"); EXEC SQL CONNECT :oraCN; } void dynamic_sqlthree() { EXEC SQL BEGIN DECLARE SECTION; char name[10]; int salary; int dno; EXEC SQL END DECLARE SECTION; printf("input deptno u want to view: "); scanf("%d",&dno); getchar(); EXEC SQL PREPARE stat FROM 'SELECT sal,ename from emp WHERE deptno=:a'; EXEC SQL DECLARE emp_cursor CURSOR FOR stat; EXEC SQL OPEN emp_cursor USING :dno; EXEC SQL WHENEVER NOT FOUND DO break; for(;;) { EXEC SQL FETCH emp_cursor INTO :salary,:name; printf("name: %s,salary: %d\n",name,salary); } EXEC SQL CLOSE emp_cursor; }
pro*c 动态sql三
最新推荐文章于 2023-05-10 19:19:28 发布