游标合并多行中的值。 PL / SQL

时间:2013-12-06 18:26:54

标签: oracle plsql cursor

我有表EMP,其中包含他所在的员工姓名和部门。 像说的那样(显然它比我的例子大):

dept name
10   Clark
10   King
20   Jacob
30   Michael
10   Miller 
30   John
40   Leonardo

然后是第二张表:

Emps_in_Depts (Deptno NUMBER(2), Employees VARCHAR2(4000))

我的任务是编写PL / SQL代码,以这种方式将数据插入第二个表:

(10,CLARK$KING$MILLER$)
(30,Michael$John)
每个部门都有

等等。

我有在光标内部使用光标的基本思路,但我不知道如何将多行的值合并为一个。

  DECLARE
     CURSOR kursor
     IS
       SELECT DISTINCT deptno
       FROM emp;

       departament  
            emp.deptno%TYPE;
  BEGIN
     OPEN kursor;

    LOOP
       FETCH kursor INTO departament;
       EXIT WHEN kursor%NOTFOUND;

       --HERE SHOULD BE SECOND CURSOR 
       --which I'm not sure how to code so that it fetches from  
       --SELECT ename FROM emp WHERE deptno = departament
       --
       --and it should insert values into Emps_in_depts here I guess.

     END LOOP;

     CLOSE kursor;
  END; 

我真的很感动任何帮助! 提前致谢

诚恳 的roff

2 个答案:

答案 0 :(得分:2)

检查函数LISTAGG(自Oracle 11.2起可用),您可以从文档中复制它。

答案 1 :(得分:1)

我目前不在工作,所以我没有oracle数据库来输入它并进行语法检查。但你所做的基本上是:

DECLARE
    TYPE EmpCurTyp IS REF CURSOR; 
    empname   EmpCurTyp;
    nameList varchar2(4000);
    name varchar2(200);
BEGIN
    OPEN empname FOR  -- open cursor variable
        'SELECT name FROM emp WHERE dept = :s' USING departament;
    LOOP
        FETCH empname INTO name
        EXIT WHEN empname%NOTFOUND
        nameList:=nameList||'$'||name
    END LOOP;
    CLOSE empname;
    INSERT INTO emps_in_deps VALUES (departament, nameList)
END