我在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'
答案 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 方法。