繁体   English   中英

PL/SQL:使用游标的主细节循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM