将Oracle查询应用于表列表

时间:2018-10-18 14:59:45

标签: sql oracle

我在Oracle实例中有一张表的列表,标记为'TableA_101818','TableB_101818'等,我想在一个查询中更新所有这些表。我知道我可以使用以下表格获取列表:

SELECT table_name FROM all_tables WHERE table_name LIKE 'Table%_101818'

但我不确定如何应用类似的内容:

UPDATE (SELECT table_name FROM all_tables WHERE table_name LIKE 'Table%_101818) 
SET COL1 = 'something' WHERE col2 = 'something else'

2 个答案:

答案 0 :(得分:1)

您可以使用动态SQL:

begin
  for r in (SELECT table_name FROM all_tables 
            WHERE table_name LIKE 'Table%_101818') 
  loop
    dbms_output.put_line('SELECT * FROM ' || r.table_name ||
                         q'{ WHERE col2 = 'something else';}');

    execute immediate 'UPDATE ' || r.table_name ||
                      q'{ SET COL1 = 'something' WHERE col2 = 'something else'}';
  end loop;
  commit;
end;
/

答案 1 :(得分:0)

如果所有表的更新字符串相同,则可以很容易地使用此SQL生成更新脚本。

select   
'UPDATE "'||TABLE_NAME||q'[" SET COL1 = 'something' WHERE col2 = 'something else';]' update_sql
from user_tables where table_name LIKE 'Table%_101818'; 

UPDATE "Table1_101818" SET COL1 = 'something' WHERE col2 = 'something else';
UPDATE "Table2_101818" SET COL1 = 'something' WHERE col2 = 'something else';

只需在使用的SQL工具中复制产生的行并运行它即可。

*请注意,如果您的Tabele名称为混合大小写,则必须在生成的查询中引用。

如果要检查previos值(在更新之前),只需在WHERE条件中添加谓词即可。

select   
'UPDATE "'||TABLE_NAME||q'[" SET COL1 = 'something' WHERE col2 = 'something else' and COL1 = 'previous value';]' update_sql
from user_tables where table_name LIKE 'Table%_101818';


UPDATE "Table1_101818" SET COL1 = 'something' WHERE col2 = 'something else' and COL1 = 'previous value';
UPDATE "Table2_101818" SET COL1 = 'something' WHERE col2 = 'something else' and COL1 = 'previous value';

如果COL1中存在不同的 previos值,您将看到0 records updated并且不会进行任何改动。

最普遍的情况是每个表的要更新的值都不同。

您可以建立一个包含表名和值的帮助器表,并在生成更新语句的查询中使用它:

TABLE_NAME                     COL1                           COL1_OLD                       COL2                         
------------------------------ ------------------------------ ------------------------------ ------------------------------
Table1_101818                  something                      previous value                 something else                 
Table2_101818                  z                              y                              x           

查询联接到助手表并获取每个表的正确值

select   
'UPDATE "'||a.TABLE_NAME||'" SET COL1 = '''||b.col1||''' WHERE COL2 = '''||
    b.col2||''' and COL1 = '''||b.col1_old||''';' update_sql
from user_tables a
join update_values b on a.table_name = b.table_name
where a.table_name LIKE 'Table%_101818';

UPDATE "Table1_101818" SET COL1 = 'something' WHERE COL2 = 'something else' and COL1 = 'previous value';
UPDATE "Table2_101818" SET COL1 = 'z' WHERE COL2 = 'x' and COL1 = 'y';

请注意,此方法适用于在单个步骤中处理的表数量有限的情况。如果您有大量的表,或者任务是定期的,则需要使用其他答案中说明的动态SQL 方法。