PL / SQL: основная деталь l oop с использованием курсоров - PullRequest
0 голосов
/ 21 февраля 2020

В настоящее время у меня есть основная деталь с использованием одного курсора

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

Я пытался выяснить, как l oop это поэтому результаты выглядят так:

10 ACCOUNTING
  CLARK
  MILLER
  KING
20 RESEARCH
  FORD
  SCOTT
  JONES
  SMITH
  ADAMS
30 SALES
  WARD
  MARTIN
  TURNER
  JAMES
  ALLEN
  BLAKE

По сути, напечатайте deptno и dname и назначенных сотрудников прямо ниже (без дубликатов). Извините, если это кажется элементарным. Просто начал пытаться изучать PL / SQL, и я не могу найти ответ от поисковых систем.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Создайте переменную v_dname, оцененную в конце l oop с ref.dname. В начале l oop сравните re c .dname с v_dname. Если значение одинаковое, вы находитесь в том же отделе и не определяете его.

0 голосов
/ 21 февраля 2020
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;
/
...