2013-10-07 24 views
0

我試圖找到在Oracle 11g中是否有方法,我可以將結果列表從SELECT存儲到變量(對象)中,然後通過該列表循環執行第二個查詢結果?來自查詢的Oracle 11g臨時列表對象

基本上我正在嘗試做的是獲取列名的所有表的清單,然後從它們的表中刪除某些數據。

喜歡的東西:提前

var PRODUCTID_TABLE = SELECT table_name 
         FROM user_tab_columns 
         WHERE column_name = 'PRODUCT_ID' 
         AND table_name NOT LIKE 'BIN%'; 

FOR T IN PRODUCTID_TABLE LOOP 

    DELETE FROM T.TABLE_NAME WHERE PRODUCT_ID = {value}; 

END LOOP; 
COMMIT; 

感謝

KS

回答

2

您可以隨時生成的DELETE語句是這樣的:

SELECT 'DELETE FROM ' || table_name || 
     ' WHERE PRODUCT_ID = {value}; ' 
    FROM user_tab_columns 
WHERE column_name = 'PRODUCT_ID' AND table_name NOT LIKE 'BIN%'; 

或者,如果使用PL/SQL是一個選項,你可以在PL/SQL塊中使用EXECUTE IMMEDIATE:

BEGIN 
    FOR v_rec IN (SELECT table_name 
        FROM user_tab_columns 
       WHERE column_name = 'PRODUCT_ID' 
        AND table_name NOT LIKE 'BIN%') 
    LOOP 
    EXECUTE IMMEDIATE 'DELETE FROM ' || v_rec.table_name || 
         ' WHERE PRODUCT_ID = {value}; '; 
    END LOOP; 
END; 
+0

我喜歡選項一。是否有辦法立即運行那些生成的DELETE語句,反對複製它們並手動運行它們? – Casper

+0

除非您編寫一個將使用EXECUTE IMMEDIATE運行查詢的存儲函數,否則不要認爲這是可能的。然後你可以在第一個查詢中運行它,如:SELECT run_dynamic_delete(table_name) FROM user_tab_columns WHERE column_name ='PRODUCT_ID' AND table_name NOT LIKE'BIN%';' –

+0

乾杯,我把它變成了兩步工作到底。運行此腳本以構建DELETE腳本,然後將它們複製到.sql中並通過sqlplus運行 – Casper