簡體   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