EXEC SQL DELETE FROM emp
WHERE deptno = :dept_number;
4.1.4 游标
用嵌入式SQL语句查询数据分成两类情况 。一类是单行结果,一类是多行结果 。对于单行结果,可以使用SELECT INTO语句;对于多行结果,你必须使用游标来完成 。游标是一个与SELECT语句相关联的符号名,它使用户可逐行访问由ORACLE返回的结果集 。使用游标,应该包含以下四个步骤 。
1)、定义游标
使用DECLARE语句完成 。如:
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename FROM emp WHERE deptno = :dept_number;
值得注意的是,不能在同一个文件中定义两个相同名字的游标 。游标的作用范围是全局的 。
2)、打开游标
使用OPEN语句完成 。如:
EXEC SQL OPEN emp_cursor;
3)、取一行值
使用FETCH语句完成 。如:
EXEC SQL FETCH emp_cursor INTO :emp_name;
4)、关闭游标
使用CLOSE语句完成 。它完成的功能是:释放资源,如占用内存,锁等 。如:EXEC SQL CLOSE emp_cursor;
5)、使用游标修改数据
我们可以使用CURRENT OF子句来完成修改数据 。如:
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename, sal FROM emp WHERE job = "CLERK"
FOR UPDATE OF sal;
...
EXEC SQL OPEN emp_cursor;
EXEC SQL WHENEVER NOT FOUND GOTO ...
for (;;) {
EXEC SQL FETCH emp_cursor INTO :emp_name, :salary;
...
EXEC SQL UPDATE emp SET sal = :new_salary
WHERE CURRENT OF emp_cursor;
}
值得注意的是,在使用CURRENT OF子句来完成修改数据时,在OPEN时会对数据加上排它锁 。这个锁直到有COMMIT或ROLLBACK语句时才释放 。
以下是使用游标修改数据的一个完整例子:
...
/* 定义游标 */
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename, job
FROM emp
WHERE empno = :emp_number
FOR UPDATE OF job;
/* 打开游标 */
EXEC SQL OPEN emp_cursor;
/* break if the last row was already fetched */
EXEC SQL WHENEVER NOT FOUND DO break;
/* 循环取值*/
for (;;)
{
EXEC SQL FETCH emp_cursor INTO :emp_name, :job_title;
/* 更新当前游标所在的行的数据*/
EXEC SQL UPDATE emp
SET job = :new_job_title
WHERE CURRENT OF emp_cursor;
}
...
/* 关闭游标 */
EXEC SQL CLOSE emp_cursor;
EXEC SQL COMMIT WORK RELEASE;
...下面这个例子完整演示了静态游标的使用方法 。这个例子的作用是,获得部门编号,通过游标来显示这个部门中的所有雇员信息 。#include
/* 声明宿主变量 */
char userid[12] = "SCOTT/TIGER";
char emp_name[10];
int emp_number;
int dept_number;
char temp[32];
void sql_error();
/*包含SQLCA */
#include
main()
{ emp_number = 7499;
/* 处理错误*/
EXEC SQL WHENEVER SQLERROR do sql_error("Oracle error");
/* 连接到Oracle数据库*/
EXEC SQL CONNECT :userid;
printf("Connected.n");
/* 声明游标 */
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename FROM emp WHERE deptno = :dept_number;
printf("Department number? ");
gets(temp);
dept_number = atoi(temp);
/* 打开游标*/
EXEC SQL OPEN emp_cursor;
printf("Employee Namen");
printf("-------------n");
/* 循环处理每一行数据,如果无数据,则退出*/
EXEC SQL WHENEVER NOT FOUND DO break;
while (1)
{
EXEC SQL FETCH emp_cursor INTO :emp_name;
printf("%sn", emp_name);
}
EXEC SQL CLOSE emp_cursor;
EXEC SQL COMMIT WORK RELEASE;
exit(0);
}
/错误处理程序*/
void sql_error(msg)
char *msg;
{
char buf[500];
int buflen, msglen;
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
buflen = sizeof (buf);
sqlglm(buf, &buflen, &msglen);
printf("%sn", msg);
printf("%*.sn", msglen, buf);
exit(1);
}
4.2 嵌入PL/SQL
嵌入PL/SQL和嵌入SQL不同 。嵌入PL/SQL提供了很多嵌入SQL不具有的优点,如:更好的性能、更灵活的表达方式 。能够自己定义过程和函数 。如:
推荐阅读
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门
- 小米MIX2黑色陶瓷版上手怎么样?小米黑色陶瓷版多少钱?
- 小米全陶瓷尊享版有哪些颜色?小米全陶瓷尊享版哪个颜色更好看?
- K700新版软件R2AY004试用手记
- 小米Note3吴亦凡限量版什么时候发布?
- ESQL编程使用说明
