有没有一种方法可以获取for循环SQL Oracle中下一个元素的值

时间:2020-01-17 20:54:17

标签: sql oracle

这是我编写的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;

它输出信息,以便借助for循环显示某个部门中所有雇员的名字和姓氏。主要思想是,同一部门中有很多员工,我不需要为每个部门输出部门,而只是做一些概述。输出示例如下:

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

我正在使用的方法是存储 PREVIOUS 元素的部门编号,并检查它是否与当前元素匹配。我想知道是否有一种方法可以检查当前元素的department_id和 NEXT 元素的department_id,因为这将删除我创建的变量。

2 个答案:

答案 0 :(得分:1)

我宁愿使用嵌套循环:外部用于部门,内部用于员工:

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>

答案 1 :(得分:1)

您可以使用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;