PLSQL入门与精通(第11章:游标双循环处理)

一般情况下,数据要以一栏和明细的形式在画面上显示。这种程序相对会复杂一些。

例如,首先有一行是部门的数据,在部门下方需要显示多行该部门的员工的信息。然后,再显示下一个部门的数据,再显示部门所属的员工信息;然后。。
重复同样的处理。

这样的表示在简单的SELECT语句中很难,即使是编程,也必须在标题(部门)的循环处理中记述细节(社员)的循环处理。

也就是说,需要双重循环构造,所以编程会变得复杂。

但是,如果使用游标FOR循环句,即使是双重循环结构,也很简单。

请看下面的例子。仅8行执行双循环处理。

SQL>SET serveroutput ON
1 BEGIN
2 FOR REC1 IN (SELECT * FROM DEPT) LOOP
3 DBMS_OUTPUT.PUT_LINE(CHR(10)||’###部门名 称:’|REC1.DNAME||’####’);
4 FOR REC2 IN (SELECT * FROM EMP WHERE DEPTNO = REC1.DEPTNO) LOOP
5 DBMS_OUTPUT.PUT_LINE(REC2.ENAME||‘的入职日期是’||
REC2.HIREDATE |’;
6 END LOOP;
7 END LOOP;
8* END;
SQL> /

###部门名称:ACCOUNTING###
CLARK的入社日是81-06-09
KING的入社日是81-11-17
MILLER的入社日是82-01-23

###部门名称:RESEARCH####
SMITH的入社日是80-12-17
JONES的入社日是81-04-02
SCOTT的入社日是87-04-19
ADAMS的入社日是87-05-23
FORD的入社日是81-12-03

###部门名称:SALES####
ALLEN的入社日是81-02-20
WARD的入社日是81-02-22
MARTIN的入社日是81-09-28
BLAKE的入社日是81-05-01
TURNER的入社日是81-09-08
JAMES的入社日是81-12-03

###部门名称:OPRATIONS####

PL/SQL过程成功完成。
SQL>

这里,重点是外侧的循环(第2-7行)是部门表(DEPT)的游标FOR循环句,其中一行存储在REC1变量中。内侧的循环(第4-6行)是员工表(EMP)的游标FOR循环句,其1行被保存在REC2变量中。并且非常重要的是内侧的游标FOR循环文的SELECT文的WHERE句的条件承继着外侧的行(REC1)的值。(第4行WHERE DEPTNO=REC1.DEPTNO)

这样,在内侧的循环中,可以使用外部循环部门所属的员工。

像这样使用游标FOR循环句的话,即使是双循环处理也能用非常少的步数简单地记述。

另外,第3行有CHR(10)的记述,这表示换行。
在更换部门的时候,可以加入空行,容易阅读。

这就是稍微复杂一点的游标循环处理。希望大家理解。

猜你喜欢

转载自blog.csdn.net/niusr_1980_01/article/details/113973431