2013-10-07 26 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