您可以尝试使用 EXECUTE IMMEDIATE 使用动态 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';
END LOOP;
END;
如果需要设置动态更新的值,可以通过动态sql绑定参数的方式。我只是不记得该怎么做。不过如果你需要的话,在 cmets 里问,我会找的。p>
编辑
我认为如果你要绑定这些值,它看起来像这样:
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;
...您可以使用变量而不是硬编码常量值来代替USING 1, 2。
欲了解更多信息:EXECUTE IMMEDIATE。
编辑 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;
您可能需要稍微调整一下,因为我面前没有 Oracle 数据库。我可能拼错了一些东西。