oracle for循环 用在 游标中

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)')

的一句语句。

相关文档
最新文档