【问题标题】:Updating a column in multiple tables with a loop使用循环更新多个表中的列
【发布时间】:2016-08-04 17:49:21
【问题描述】:

我的 Oracle 数据库的每个表中都有几个 QA 列,我想使用插入/更新对象的用户名的值每天更新这些列。我可以手动更新表中的列,如下所示:

UPDATE TEST.TABLE1 TB
SET TB.ADDED_BY2 = 
(
select IA.FULL_NAME
from ISM.APP_USER IA
where IA.NAME = UPPER(TB.ADDED_BY)
),
TB.CHANGED_BY2 = 
(
select IA.FULL_NAME
from ISM.APP_USER IA
where IA.NAME = UPPER(TB.CHANGED_BY)
)
where TO_CHAR(CREATION_DATUM, 'YYYY-MM-DD') = TO_CHAR(SYSDATE) AND ADDED_BY2 IS NULL;

但要更新 25 个表中的同一列是一项乏味(且无聊)的工作。问题是:是否有使用 LOOP(或任何其他方法)更新 25 个表中的列?

我的 ultimage 目标是做以下事情:

FOR I IN SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME IN ('TEST.TABLE1', 'TEST.TABLE2')

LOOP

UPDATE I.TABLE_NAME TB
SET TB.ADDED_BY2 = 
(
select IA.FULL_NAME
from ISM.APP_USER IA
where IA.NAME = UPPER(TB.ADDED_BY)
),
TB.CHANGED_BY2 = 
(
select IA.FULL_NAME
from ISM.APP_USER IA
where IA.NAME = UPPER(TB.CHANGED_BY)
)
where TO_CHAR(CREATION_DATUM, 'YYYY-MM-DD') = TO_CHAR(SYSDATE) AND ADDED_BY2 IS NULL;

END LOOP;

【问题讨论】:

    标签: sql oracle loops plsql auto-update


    【解决方案1】:

    你需要使用动态SQL:

    FOR I IN SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME IN ('TEST.TABLE1', 'TEST.TABLE2')
    
    LOOP
     execute immediate
      'UPDATE ' || I.TABLE_NAME || ' TB
       SET TB.ADDED_BY2 = 
       (
         select IA.FULL_NAME
         from ISM.APP_USER IA
         where IA.NAME = UPPER(TB.ADDED_BY)
       ),
       TB.CHANGED_BY2 = 
       (
         select IA.FULL_NAME
         from ISM.APP_USER IA
         where IA.NAME = UPPER(TB.CHANGED_BY)
       )
       where TO_CHAR(CREATION_DATUM, ''YYYY-MM-DD'') = TO_CHAR(SYSDATE)
         AND ADDED_BY2 IS NULL';
    
    END LOOP;
    

    这样,您可以根据不同的表名动态构建 SQL 语句并执行它;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2023-03-05
      • 2017-03-11
      相关资源
      最近更新 更多