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

am46iovg  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(233)

我有一个EMP表,其中包含员工的姓名和他工作的部门。类似于说(显然它比我的例子大得多):

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

然后是第二张table:

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;
mdfafbf1

mdfafbf11#

检查函数LISTAGG(从Oracle 11.2开始可用),您几乎可以从文档中复制它。

uurv41yg

uurv41yg2#

你可以做的基本上是:

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

相关问题