您可以尝试使用
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);
EXECUTE IMMEDIATE 'Update ' || Name.TABLE_NAME || ' set ClientID = 1 Where ClientID = 2';
END LOOP;
END;
如果您需要动态设置要更新的值,则可以使用动态SQL绑定参数的方式。我只是一时想不起来如何做。但如果您需要,请在评论中提出,我会找到相关信息。
编辑
我认为如果您要绑定这些值,它可能看起来像这样:
BEGIN
FOR Name IN ( SELECT TABLE_NAME FROM SYS.all_tables where TABLESPACE_NAME='MyTableSpace') LOOP
DBMS_OUTPUT.PUT_LINE(Name.TABLE_NAME);
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'
)
) LOOP
DBMS_OUTPUT.PUT_LINE(Name.TABLE_NAME);
EXECUTE IMMEDIATE 'Update ' || Name.TABLE_NAME || ' set ClientID = 1 Where ClientID = 2';
END LOOP;
END;
您可能需要稍微调整一下,因为我面前没有Oracle数据库。 我可能拼错了几个单词。
CLIENTID
全部大写吗?默认情况下,Oracle 将所有列名存储为大写。或者,只需执行SELECT column_name FROM all_tab_columns WHERE table_name = '选择一个表名'
,并检查 Oracle 认为的列名是什么。听起来你已经很接近了,你只需要弄清楚如何查询列元数据。 - sstan