我有一个在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'发布于 2018-10-18 16:11:04
如果对于所有表,更新的字符串是相同的,则可以非常容易地使用此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工具中生成的行并运行它。
*注意,如果您的表格名称是混合大小写,则必须在生成的查询中引用。
如果要检查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,并且不会执行任何会话。
最常见的情况是要更新的值因每个表的不同而不同。
您可以设置一个包含表名和值的助手表,并在生成update语句的查询中使用它:
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方法。
发布于 2018-10-18 15:02:37
您可以使用动态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;
/https://stackoverflow.com/questions/52876971
复制相似问题