Plsql PL/SQL:Cursor::检索每个部门的员工列表

Plsql PL/SQL:Cursor::检索每个部门的员工列表,plsql,cursor,Plsql,Cursor,如何将每个部门的员工列表从EMP表检索到逗号分隔的新表中 比如: [column x:ie deptno] [column y:ie ename] -------------------------- 7 Jesus, María, José 5 Staz, Przemek, Tomek 6 John, Jane, Bob 下表是我想把函数concatenate_列表编译的结果放在哪里 CREATE TA

如何将每个部门的员工列表从EMP表检索到逗号分隔的新表中 比如:

[column x:ie deptno]  [column y:ie ename]
--------------------------
    7           Jesus, María, José
    5           Staz, Przemek, Tomek 
    6           John, Jane, Bob 
下表是我想把函数concatenate_列表编译的结果放在哪里

CREATE TABLE Z
(
   x NUMBER(2)     NOT NULL,
   y VARCHAR2 (4000)     NOT NULL
);




SET SERVEROUTPUT ON

CREATE OR REPLACE FUNCTION concatenate_list (xy_cursor IN SYS_REFCURSOR)
  RETURN VARCHAR2
IS
  lret  VARCHAR2(30000);
  ltemp VARCHAR2(30000);
BEGIN
  LOOP
    FETCH xy_cursor
    INTO ltemp;
    EXIT WHEN xy_cursor%notfound;
    lret  := lret  || ',' || ltemp;
    END LOOP;
    RETURN LTRIM(lret, ',');
 END;
/
SHOW ERRORS
如何插入“函数连接编译”的结果并获得上述结果。 也许可以用这样的方法:

INSERT INTO Z( x, y) SELECT e1.x,
   concatenate_list(CURSOR(SELECT e2.y FROM EMP e2 WHERE e2.x= e1.x));
但是如何在PL/SQL块中设置它,这可能会对您有所帮助

declare
type cur_name is ref cursor;
emp_name cur_name;
v_ename emp.ename%type;
v_all_ename varchar2(1000);
v_deptno emp.deptno%type; 
cursor c is select deptno,cursor(select ename from emp e where e.deptno=f.deptno) from emp f group by deptno;
begin
open c;
loop
fetch c into v_deptno,emp_name;
exit when c%notfound;
loop
fetch emp_name into v_ename;
exit when emp_name%notfound;
v_all_ename:=v_all_ename||v_ename;
v_all_ename:=v_all_ename||',';
end loop;
dbms_output.put_line(v_deptno||' '||v_all_ename); 
v_all_ename:='';
end loop;
close c;
end;