Есть ли способ получить значение следующего элемента в течение l oop SQL Oracle - PullRequest
0 голосов
/ 17 января 2020

Это SQL, который я написал

SET SERVEROUTPUT ON
DECLARE
    CURSOR overview IS
        SELECT e.last_name, e.first_name, d.department_name, e.department_id
        FROM employees e, departments d
        where e.department_id = d.department_id
        ORDER BY e.department_id;
    lastdepartment employees.department_id%TYPE := 0;
BEGIN
    FOR i in overview LOOP
        IF lastdepartment != i.department_id THEN
            lastdepartment := i.department_id;
            DBMS_OUTPUT.PUT_LINE('-' || i.department_id||' '||i.department_name);        
        END IF;
    DBMS_OUTPUT.PUT_LINE('---'||i.last_name ||' '||i.first_name);
    END LOOP;
END;

Он выводит информацию так, что он показывает имя и фамилию всех сотрудников в определенном отделе с помощью a для l oop. Основная идея заключается в том, что в одном и том же отделе много сотрудников, и мне не нужно выводить отдел для каждого, а скорее сделать обзор. Пример выходных данных показан ниже:

-10 Administration
---Whalen Jennifer
-20 Marketing
---Fay Pat
---Hartstein Michael
-30 Purchasing
---Tobias Sigal
---Colmenares Karen
---Baida Shelli

Используемый мною метод хранит номер отдела элемента PREVIOUS и проверяет, соответствует ли он текущему элементу. Я хотел бы знать, есть ли способ проверить Department_id текущего элемента и Department_id элемента NEXT , поскольку это приведет к удалению созданной мной переменной.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Вы можете использовать ROW_NUMBER для нумерации сотрудников по отделам. При чтении первого сотрудника отдела вы отображаете отдел.

SET SERVEROUTPUT ON
DECLARE
  CURSOR overview IS
    SELECT
      e.last_name, e.first_name, d.department_name, e.department_id,
      ROW_NUMBER() OVER (PARTITION BY e.department_id ORDER BY e.employee_id) AS rn
    FROM employees e
    JOIN departments d ON d.department_id = e.department_id
    ORDER BY e.department_id, e.employee_id;
BEGIN
  FOR i in overview LOOP
    IF i.rn = 1 THEN
      DBMS_OUTPUT.PUT_LINE('-' || i.department_id || ' ' || i.department_name);    
    END IF;
    DBMS_OUTPUT.PUT_LINE('---' || i.last_name || ' ' || i.first_name);
  END LOOP;
END;
1 голос
/ 18 января 2020

Я бы предпочел использовать вложенные циклы: внешний для отделов, внутренний для сотрудников:

SQL> begin
  2    for cur_d in (select deptno, dname from dept order by deptno) loop
  3      dbms_output.put_line(cur_d.deptno ||' '|| cur_d.dname);
  4      for cur_e in (select ename from emp where deptno = cur_d.deptno) loop
  5        dbms_output.put_line('-- ' || cur_e.ename);
  6      end loop;
  7    end loop;
  8  end;
  9  /
10 ACCOUNTING
-- CLARK
-- KING
-- MILLER
20 RESEARCH
-- SMITH
-- JONES
-- SCOTT
-- ADAMS
-- FORD
30 SALES
-- ALLEN
-- WARD
-- MARTIN
-- BLAKE
-- TURNER
-- JAMES
40 OPERATIONS

PL/SQL procedure successfully completed.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...