pro*c 动态sql三
[*]这种方法可以执行包括查询语句在内的动态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 SQLERRORDO 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;
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;
intsalary;
intdno;
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 empWHERE 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;
}
页:
[1]