穿越画圣:oracle for循环 用在 游标中

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 01:50:43
游标FOR循环
在大多数时候我们在设计程序的时候都遵循下面的步骤:
1、打开游标
2、开始循环
3、从游标中取值
4、检查那一行被返回
5、处理
6、关闭循环
7、关闭游标
可以简单的把这一类代码称为游标用于循环。但还有一种循环与这种类型不相同,这就是FOR循环,用于FOR循环的游标按照正常的声明方式声明,它的优点在于不需要显式的打开、关闭、取数据,测试数据的存在、定义存放数据的变量等等。游标FOR 循环的语法如下:

--游标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;

--还有一种是语句嵌套:
--统计年级四个班级学生早退,迟到,请假 数量
--LB字段为“类别”就是指早退,迟到,请假;LBB“类别表”不同类别对应的表;LB,LBB这两个字段又在 t_kq_lbb表中
--t_port_kqtj 为统计的数据放在 这张表中

create or replace procedure sp_kqtj as
ls_truncate varchar(100);
ls_sql varchar(1000);
begin
ls_truncate := 'TRUNCATE TABLE t_port_kqtj';
EXECUTE IMMEDIATE ls_truncate;
FOR ls_sj in (select ' INSERT INTO t_port_kqtj VALUES(' || '''' ||
trim(LB) || '''' || ', ( SELECT COUNT(*) FROM ' ||
trim(LBB) || ') , ' || '''' || trim(LBB) || '''' || ')' LS
from t_kq_lbb ) LOOP
begin
ls_sql := ls_sj.ls;
EXECUTE IMMEDIATE ls_sql;
EXCEPTION
WHEN OTHERS THEN
ls_truncate := '1';
end;
end loop;
commit;
end;
其中 || 为联接符,‘’‘’ 为一个单引号,
' INSERT INTO t_port_kqtj VALUES(' || '''' ||
trim(LB) || '''' || ', ( SELECT COUNT(*) FROM ' ||
trim(LBB) || ') , ' || '''' || trim(LBB) || '''' || ')'

就可以看成:
INSERT INTO t_port_kqtj VALUES(' trim(LB) ', ( SELECT COUNT(*) FROM trim(LBB) ) , ' trim(LBB)')
的一句语句。