更新Oracle中所有表中的所有行

Ica*_*aro 3 oracle oracle11g sql-update

我有一个在大多数表中重复的字段 (clientID)(大约 100 个左右),我尝试使用 oracle 11g 一次性更新它。我能够获取表的名称,但无法使用它。从下面的代码来看:

BEGIN
   FOR Name IN ( SELECT TABLE_NAME FROM SYS.all_tables where TABLESPACE_NAME='MyTableSpace') LOOP
        DBMS_OUTPUT.PUT_LINE(Name.TABLE_NAME); --I can't see any logs on DBMS Output for some reason
        -- Update Name.TABLE_NAME set ClientID = 1 Where ClientID = 2; --This line does not work message "Table or view does not exist"
   END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

sst*_*tan 5

您可以尝试使用动态 SQL EXECUTE IMMEDIATE

像这样的东西:

BEGIN
   FOR Name IN ( SELECT TABLE_NAME FROM SYS.all_tables where TABLESPACE_NAME='MyTableSpace') LOOP
        DBMS_OUTPUT.PUT_LINE(Name.TABLE_NAME); --I can't see any logs on DBMS Output for some reason
        EXECUTE IMMEDIATE 'Update ' || Name.TABLE_NAME || ' set ClientID = 1 Where ClientID = 2';
   END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

如果需要设置动态更新的值,可以通过动态sql绑定参数的方法。我只是不记得该怎么做。但如果你需要的话,只需在评论中询问,我会寻找它。

编辑

我想如果你要绑定这些值,它会看起来像这样:

BEGIN
   FOR Name IN ( SELECT TABLE_NAME FROM SYS.all_tables where TABLESPACE_NAME='MyTableSpace') LOOP
        DBMS_OUTPUT.PUT_LINE(Name.TABLE_NAME); --I can't see any logs on DBMS Output for some reason
        EXECUTE IMMEDIATE 'Update ' || Name.TABLE_NAME || ' set ClientID = :1 Where ClientID = :2'
                          USING 1, 2;
   END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

...USING 1, 2您可以使用变量而不是硬编码常量值来代替 。

有关更多信息:立即执行

编辑2

如果您需要跳过没有相关列的表,下面是应该完成该工作的调整后的查询:

BEGIN
   FOR Name IN (
     SELECT t.TABLE_NAME 
     FROM all_tables t
     where t.TABLESPACE_NAME='MyTableSpace'
     and exists (
       select null
       from all_tab_columns c
       where c.table_name = t.table_name
       and c.column_name = 'CLIENTID' -- put the right column name here
     )
   ) LOOP
        DBMS_OUTPUT.PUT_LINE(Name.TABLE_NAME); --I can't see any logs on DBMS Output for some reason
        EXECUTE IMMEDIATE 'Update ' || Name.TABLE_NAME || ' set ClientID = 1 Where ClientID = 2';
   END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

您可能需要稍微调整一下,因为我面前没有 Oracle 数据库。我可能拼错了一些东西。