在Oracle PL/SQL中,如何迭代/访问包含Listag函数结果的集合

在Oracle PL/SQL中,如何迭代/访问包含Listag函数结果的集合,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,假设EMP表有三列deptno、ename和salary。 我如何编写一个类似这样的for循环,并能够访问listag函数中的项 BEGIN FOR rec IN (SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees FROM emp WHERE deptNo = 'XYZ' G

假设EMP表有三列deptno、ename和salary。 我如何编写一个类似这样的for循环,并能够访问listag函数中的项

BEGIN

    FOR rec IN (SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
                 FROM   emp
                 WHERE deptNo = 'XYZ'
                 GROUP BY deptno)
    LOOP

        Update EMP
        set salary = 10000
        WHERE ename in (THE ITEMS IN THE LISTAGG)

        FOR EACH (ITEM RETURNED IN THE LISTAGG)
           DO SOMETHING
        END;

    END LOOP;
END;
基本上我想知道两件事

如何引用listagg函数See UPDATE语句返回的for循环中的所有项 如何遍历listag函数返回的每个项。请参见内部循环。 上述语法是否也适用于WM_CONCAT和COLLECT函数。 提前谢谢

使用PL/SQL ListAGG函数会导致过程循环 以下是OP请求的示例应用程序:

BEGIN

FOR rec IN (SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
             FROM  emp
             WHERE deptNo = 'XYZ'
             GROUP BY deptno)
 LOOP

    Update EMP
    set salary = 10000
    WHERE ename in

    ( select regexp_substr(rec.employees,'[^,]+',1,level)
        from dual
     connect by level <= length(regexp_replace(rec.employees,'[^,]+')) + 1
        )

    AND deptNo=rec.deptNo; --not to miss this filter condition

    FOR EACH (ITEM RETURNED IN THE LISTAGG)
       DO SOMETHING
    END;

 END LOOP;
END;
若要查看解析分隔字符串列表的另一个工作示例,请参阅堆栈溢出以了解涉及。

listagg不返回集合的类似问题。它返回单个字符串值。