2015-12-31 57 views
0

我想知道在执行SELECT值到CURSOR时是否有任何选项来迭代表。执行CURSOR时PLSQL FOR循环

例如: 我有一个表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是二进制整数索引号的表。 但我得到“ORA-22905:无法访问非嵌套表项的行”

在此先感谢。

+1

是否有可能加入保存的数字到sec_user_role表的临时表? – Nick

回答

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; 
+0

试过这个解决方案,但我得到: ** ora-22905无法访问非嵌套表项中的行** –

+0

试试这个我已经添加了一个强制转换函数来确保我们不会出现这个错误。 –