我想知道是否有任何选项在将SELECT值执行到CURSOR时迭代表。
例如: 我有一个表 TEMP_NUMBERS ,它只包含数字(单列)。 我必须从表中的每个数字执行SELECT(我不知道事先在表中的行数)。
这基本上是我试图做的事情。显然这不起作用,但我可以做一些解决方法吗? 我需要将数据选择到 p_cv_PermsNotifs 这是一个RETURN REF CURSOR。
IF NOT p_cv_PermsNotifs%ISOPEN THEN OPEN p_cv_PermsNotifs FOR
FOR i IN 1..TEMP_NUMBERS.NUMBER.COUNT LOOP
SELECT DISTINCT
SEC_USER_ROLE.ENTITY_TYP_CODE,
SEC_USER_ROLE.ENTITY_ID
FROM
SEC_USER_ROLE
WHERE
SEC_USER_ROLE.ENTITY_ID = i
END LOOP;
END IF;
还试过这个:
IF NOT p_cv_PermsNotifs%ISOPEN THEN OPEN p_cv_PermsNotifs FOR
SELECT DISTINCT
SEC_USER_ROLE.ENTITY_TYP_CODE,
SEC_USER_ROLE.ENTITY_ID
FROM
SEC_USER_ROLE
WHERE
SEC_USER_ROLE.ENTITY_ID IN
(SELECT * FROM TABLE (lv_ListOfEntities))
END IF;
其中lv_ListOfEntities是由BINARY INTEGER索引的NUMBER表。 但我得到" ORA-22905:无法访问非嵌套表格项目中的行"
提前致谢。
答案 0 :(得分:0)
在>嘿,如果你一次传递一个数字,每次都是refcursor
将被下一个值覆盖。所以最后你只会得到 refcursor中最后一个数字的值。更好的方法是使用 一些基本的PL / SQL Bulk COLLECT逻辑,它将为您提供所需的 输出。 希望这有帮助
--Creating sql type
CREATE OR REPLACE TYPE lv_num_tab IS TABLE OF NUMBER;
--plsql block
var p_lst refcursor;
DECLARE
lv_num lv_num_tab;
BEGIN
SELECT COL1 BULK COLLECT INTO lv_num FROM TEMP_NUMBERS;
OPEN p_lst FOR
SELECT DISTINCT SEC_USER_ROLE.ENTITY_TYP_CODE,
SEC_USER_ROLE.ENTITY_ID
FROM SEC_USER_ROLE
WHERE SEC_USER_ROLE.ENTITY_ID IN
(SELECT * FROM TABLE(cast(lv_num as lv_num_tab))
);
END;