2017-01-02 47 views
1

我在使用Oracle SQL循環兩次結果集時遇到了問題。使用遊標將結果集保存在變量中

問題

我有一個遊標,讓我所有的外鍵給定的表名。使用這個遊標的結果,我遍歷所有約束並禁用它們。然後我執行數據導入,然後我需要遍歷相同的結果集並啓用它們。

CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
    SELECT table_name,constraint_name, status 
    FROM user_constraints 
    WHERE (r_constraint_name,r_owner) IN 
    (SELECT constraint_name, owner 
    FROM user_constraints 
    WHERE owner ='POP' 
    AND table_name=upper(tabellnavn) 
) 
    AND STATUS = 'ENABLED'; 

我想這樣做

我的大腦直接跳轉到一個變量。我想只執行一次遊標,然後將遊標的結果保存到變量中。

這是可能的,或者是有什麼我做保存從遊標和循環事半功倍的效果?

回答

2

請嘗試此代碼。我已經修改了你的代碼,只顯示約束的表名。您可以根據需要修改plsql的結束部分。如果您遇到任何錯誤或問題,請發表評論,謝謝。

CREATE or replace PROCEDURE a_proc(name_table varchar) 
AS 
CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
SELECT table_name,constraint_name, status 
FROM user_constraints 
WHERE STATUS = 'ENABLED' 
AND TABLE_NAME=tabellnavn; 

names_t c_fkeys_inn%ROWTYPE; 
TYPE c_fkeys IS TABLE OF names_t%TYPE; 
fkeys c_fkeys; 
BEGIN 
OPEN c_fkeys_inn(name_table); 
FETCH c_fkeys_inn BULK COLLECT INTO fkeys; 
CLOSE c_fkeys_inn; 

FOR indx IN 1..fkeys.COUNT LOOP 
DBMS_OUTPUT.PUT_LINE(fkeys(indx).table_name); 
END LOOP; 
END a_proc; 

要運行代碼,請運行一個單獨的plsql塊。請在下面找到一個簡單的示例plsql塊。

begin 
a_proc('SUPPLIER'); 
END; 
+0

是。這工作正常。你介意解釋你如何創建變量? – Stene

+1

您需要創建一個與上面提到的遊標對應的表類型。一旦你創建了類型,你需要一次性將所有的光標記錄存儲到類型中,這可以使用批量收集來實現。批量收集檢索所有行並將它們加載到集合中並切換回PL/SQL引擎。一旦存儲了所有的行,我們可以使用循環概念在類型和顯示內進行遍歷或者執行必要的操作。對於遲到的回覆(由於時間差距:),抱歉) –

相關問題