[英]PL/SQL: master detail loop using cursors
我目前有一个使用单个光标的主细节
DECLARE
CURSOR emps_cur (department_id_in IN INTEGER)
IS
select ENAME,DNAME,d.DEPTNO
from scott.EMP e, scott.DEPT d
where d.DEPTNO = e.DEPTNO;
BEGIN
FOR rec IN emps_cur (1700)
LOOP
DBMS_OUTPUT.put_line (rec.DEPTNO||' '||rec.DNAME);
DBMS_OUTPUT.put_line (rec.ENAME);
END LOOP;
END;
/
结果是:
Statement processed.
10 ACCOUNTING
CLARK
10 ACCOUNTING
MILLER
10 ACCOUNTING
KING
20 RESEARCH
FORD
20 RESEARCH
SCOTT
20 RESEARCH
JONES
20 RESEARCH
SMITH
20 RESEARCH
ADAMS
30 SALES
WARD
30 SALES
MARTIN
30 SALES
TURNER
30 SALES
JAMES
30 SALES
ALLEN
30 SALES
BLAKE
我一直试图弄清楚如何循环它,因此结果如下所示:
10 ACCOUNTING
CLARK
MILLER
KING
20 RESEARCH
FORD
SCOTT
JONES
SMITH
ADAMS
30 SALES
WARD
MARTIN
TURNER
JAMES
ALLEN
BLAKE
本质上,在下方打印 deptno 和 dname 以及指定的员工(没有重复)。 对不起,如果这看起来很初级。 刚开始尝试学习 PL/SQL,我无法从搜索引擎中找到答案。
在循环结束时使用 ref.dname 创建一个变量 v_dname。 在循环开始时,将 rec.dname 与 v_dname 进行比较。 如果值相同,则说明您在同一部门,并且不会对其进行 dbms。
DECLARE
vCurrentDeptName dept.DNAME%type := 'impossible name';
CURSOR emps_cur (department_id_in IN INTEGER)
IS
select ENAME,DNAME,JOB
from scott.EMP e, scott.DEPT d
where d.DEPTNO = e.DEPTNO;
BEGIN
FOR rec IN emps_cur (1700)
LOOP
if vCurrentDeptName != rec.DNAME then DBMS_OUTPUT.put_line (rec.DNAME); vCurrentDeptName := rec.DNAME; end if;
DBMS_OUTPUT.put_line (rec.ENAME);
END LOOP;
END;
/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.