来自查询的Oracle 11g临时列表对象

来自查询的Oracle 11g临时列表对象,oracle,oracle11g,Oracle,Oracle11g,我试图找到在Oracle11g中是否有一种方法,我可以将SELECT生成的列表存储到变量(对象)中,然后在该列表中循环,对结果执行第二次查询 基本上,我要做的是获取一个列名称为的所有表的列表,然后从这些表中删除某些数据 比如: var PRODUCTID_TABLE = SELECT table_name FROM user_tab_columns WHERE column_name = 'PROD

我试图找到在Oracle11g中是否有一种方法,我可以将SELECT生成的列表存储到变量(对象)中,然后在该列表中循环,对结果执行第二次查询

基本上,我要做的是获取一个列名称为的所有表的列表,然后从这些表中删除某些数据

比如:

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

您始终可以生成如下所示的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;

我喜欢选项一。是否有一种方法可以在之后立即运行这些生成的DELETE语句,而不是复制它们并手动运行它们?除非您编写一个存储函数,使用EXECUTE IMMEDIATE运行查询,否则不要认为这是可能的。然后在第一个查询中运行它,如下所示:
SELECT run_dynamic_delete(table_name)FROM user_tab_columns,其中column_name='PRODUCT_ID'和table_name不象'BIN%'为此干杯,最后我把它变成了一个两步工作。运行此脚本以生成删除脚本,然后将其复制到.sql并通过sqlplus运行