2015-12-31 55 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

試試這個我已經添加了一個強制轉換函數來確保我們不會出現這個錯誤。 –