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,但我无法从搜索引擎中找到答案。
创建一个变量 v_dname 在循环结束时用 ref.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;
/
我目前有一个使用单个光标的主详细信息
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,但我无法从搜索引擎中找到答案。
创建一个变量 v_dname 在循环结束时用 ref.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;
/