使用Oracle显式游标及for循环
2016-09-12 20:22
441 查看
转载地址: http://blog.csdn.net/wanghuan220323/article/details/7792669
使用隐式游标和显式游标:
1.查询返回单行记录时→隐式游标;
2.查询返回多行记录并逐行进行处理时→显式游标
--显示游标属性
declare
CURSOR cur_emp IS SELECT * FROM emp;
row_emp cur_emp%ROWTYPE;
BEGIN
OPEN cur_emp;
FETCH cur_emp INTO row_emp;
WHILE cur_emp%FOUND
LOOP
dbms_output.put_line(row_emp.empno||'----'||row_emp.ename);
FETCH cur_emp INTO row_emp;
END LOOP;
close cur_emp;
END;
--使用显式游标修改数据(给所有的部门经理加薪1000)
DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
emp_row emp_cur%ROWTYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_row;
IF emp_cur%NOTFOUND THEN
EXIT;
ELSE
UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
END IF;
END LOOP;
COMMIT;
CLOSE emp_cur;
END;
·注意:1、如果游标打开之前或关闭之后,使用游标属性,Oracle会抛出一个INVALID_CURSOR错误(ORA-01001);
2、如果在第一次fetch后结果集是空的,%found=false,%NotFound=true,%ROWCOUNT=0;
3、如果使用了BULK COLLECT,那么%ROWCOUNT的值可能不是0或1,实际上他返回的是提取到相关集合的行数。
--游标for循环(给所有的部门经理减薪1000)
DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
BEGIN
FOR emp_row IN emp_cur
LOOP
UPDATE emp SET sal=sal-1000 WHERE CURRENT OF emp_cur;
END LOOP;
COMMIT;
END;
--我们可以看到游标FOR循环确实很好的简化了游标的开发,我们不在需要open、fetch和close语句,不在需要用%FOUND属性检测是否到最后一条记录,这一切Oracle隐式的帮我们完成了。
--给经理加薪5000,其他加薪1000
DECLARE
CURSOR emp_cur IS
SELECT * FROM emp FOR UPDATE;
BEGIN
FOR emp_row IN emp_cur
LOOP
IF emp_row.job='MANAGER' THEN
UPDATE emp SET sal=sal+5000 WHERE CURRENT OF emp_cur;
ELSE
UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
END IF;
END LOOP;
END;
使用隐式游标和显式游标:
1.查询返回单行记录时→隐式游标;
2.查询返回多行记录并逐行进行处理时→显式游标
--显示游标属性
declare
CURSOR cur_emp IS SELECT * FROM emp;
row_emp cur_emp%ROWTYPE;
BEGIN
OPEN cur_emp;
FETCH cur_emp INTO row_emp;
WHILE cur_emp%FOUND
LOOP
dbms_output.put_line(row_emp.empno||'----'||row_emp.ename);
FETCH cur_emp INTO row_emp;
END LOOP;
close cur_emp;
END;
--使用显式游标修改数据(给所有的部门经理加薪1000)
DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
emp_row emp_cur%ROWTYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_row;
IF emp_cur%NOTFOUND THEN
EXIT;
ELSE
UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
END IF;
END LOOP;
COMMIT;
CLOSE emp_cur;
END;
·注意:1、如果游标打开之前或关闭之后,使用游标属性,Oracle会抛出一个INVALID_CURSOR错误(ORA-01001);
2、如果在第一次fetch后结果集是空的,%found=false,%NotFound=true,%ROWCOUNT=0;
3、如果使用了BULK COLLECT,那么%ROWCOUNT的值可能不是0或1,实际上他返回的是提取到相关集合的行数。
--游标for循环(给所有的部门经理减薪1000)
DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
BEGIN
FOR emp_row IN emp_cur
LOOP
UPDATE emp SET sal=sal-1000 WHERE CURRENT OF emp_cur;
END LOOP;
COMMIT;
END;
--我们可以看到游标FOR循环确实很好的简化了游标的开发,我们不在需要open、fetch和close语句,不在需要用%FOUND属性检测是否到最后一条记录,这一切Oracle隐式的帮我们完成了。
--给经理加薪5000,其他加薪1000
DECLARE
CURSOR emp_cur IS
SELECT * FROM emp FOR UPDATE;
BEGIN
FOR emp_row IN emp_cur
LOOP
IF emp_row.job='MANAGER' THEN
UPDATE emp SET sal=sal+5000 WHERE CURRENT OF emp_cur;
ELSE
UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
END IF;
END LOOP;
END;
相关文章推荐
- 对300万一张表数据,用游标进行循环,不同写法的效率比较
- oracle游标的简单学习
- oracle 带参数的游标
- Oracle游标(下)
- oracle游标详解与应用
- DB2与oracle游标定义的区别
- Oracle笔记:循环及游标
- Oracle高级显式游标的使用
- ORACLE 游标的用法
- Oracle游标创建和使用的语法和举例(显示和隐式游标)
- Java连接Oracle数据库开发银行管理系统【一、需求篇】
- Oracle 一次 锁表 处理小记
- oracle linux 5.8安装oracle 11g rac环境之grid安装
- Oracle百万记录sql语句优化技巧
- oracle数据处理需求02
- oracle SCN问题详解
- Oracle数据库的impdp导入操作以及dba_directories使用方法
- 如何彻底卸载Oracle?
- 手工生成段顾问建议
- Oracle错误:ORA-01843:无效月份的问题