我有一个包含文档ID的PL/SQL TABLE TYPE结果集。
我可以毫无问题地循环结果集,但问题是我必须从函数返回sys_refcursor,但我无法将循环中的值收集到游标中。
TYPE table_typ IS TABLE OF DOCUMENT_QUEUE.ENV_ID%TYPE INDEX BY PLS_INTEGER;
FUNCTION GET_DOCS()
RETURN SYS_REFCURSOR
IS
LS_CUR SYS_REFCURSOR;
LR_UPDATED_ROWS table_typ;
BEGIN
UPDATE DOCUMENT_QUEUE DQ
...
RETURNING DQ.ENV_ID BULK COLLECT INTO LR_UPDATED_ROWS;
-- Need to collect all of the following rows into the cursor
FOR indx IN NVL (LR_UPDATED_ROWS.FIRST, 0) .. NVL (LR_UPDATED_ROWS.LAST, -1)
LOOP
SELECT * FROM DOCUMENT_QUEUE DQ WHERE DQ.ENV_ID = LR_UPDATED_ROWS(indx);
END LOOP;
RETURN LS_CUR;
END GET_DOCS;
所有的帮助和提示都是受欢迎的。
2条答案
按热度按时间jvidinwx1#
不需要游标FOR LOOP。可以使用OPEN CURSOR FOR语句返回SYS_REFCURSOR。
比如说
或者,
但要做到这一点,必须在SQL级别而不是PL/SQL级别CREATE类型。否则,您将收到
PLS-00642: local collection types not allowed in SQL statements
。一个小demo:
创建SQL级别的类型:
使用refcursor获取SQL*Plus中的输出:
使用MEMBER OF语法:
使用TABLE函数:
qc6wkl3g2#
对于提到的要求,我在下面提到了一个片段,这将有助于为每个rowid将所有行提取到ref游标中。如果有帮助就告诉我。