oracle for循环 用在 游标中
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle for循环用在游标中
游标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;
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;
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)')
的一句语句。