首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Oracle查询应用于表列表

将Oracle查询应用于表列表
EN

Stack Overflow用户
提问于 2018-10-18 14:59:45
回答 2查看 45关注 0票数 1

我有一个在Oracle实例中标记为'TableA_101818‘、'TableB_101818’等的表列表,我想在一个查询中更新所有这些表。我知道我可以通过以下方法获得表的列表:

代码语言:javascript
运行
复制
SELECT table_name FROM all_tables WHERE table_name LIKE 'Table%_101818'

但我不知道如何应用这样的东西:

代码语言:javascript
运行
复制
UPDATE (SELECT table_name FROM all_tables WHERE table_name LIKE 'Table%_101818) 
SET COL1 = 'something' WHERE col2 = 'something else'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-18 16:11:04

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

代码语言:javascript
运行
复制
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条件中添加谓词即可。

代码语言:javascript
运行
复制
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语句的查询中使用它:

代码语言:javascript
运行
复制
TABLE_NAME                     COL1                           COL1_OLD                       COL2                         
------------------------------ ------------------------------ ------------------------------ ------------------------------
Table1_101818                  something                      previous value                 something else                 
Table2_101818                  z                              y                              x           

查询连接到助手表,并为每个表获取适当的值。

代码语言:javascript
运行
复制
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方法。

票数 0
EN

Stack Overflow用户

发布于 2018-10-18 15:02:37

您可以使用动态SQL:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52876971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档