为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server 64 V8 03134284404-20250930-295335-20164
【操作系统】:cenos7
【CPU】:
【问题描述】*:在代码和在manage.exe都一样有错误
--liquibase formatted sql
--changeset admin:1 splitStatements:false
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE SYS_USER;';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
--changeset admin:2 splitStatements:false
declare
num number;
begin
select count(1) into num from user_tables where table_name = upper('SYS_USER');
if num > 0 then
EXECUTE IMMEDIATE 'DROP TABLE SYS_USER;';
end if;
end;
总共2个语句正依次执行...
EXECUTE IMMEDIATE 'DROP TABLE SYS_USER;';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
执行成功, 执行耗时42毫秒. 执行号:98133
影响了0条记录
num number;
begin
select count(1) into num from user_tables where table_name = upper('SYS_USER');
if num > 0 then
EXECUTE IMMEDIATE 'DROP TABLE SYS_USER;';
end if;
end;
执行失败(语句2)
-2106: 无效的表或视图名[SYS_USER]
1条语句执行成功
1条语句执行失败

问题本质:匿名块中动态SQL执行DDL操作后,事务后续查询无法感知表状态变化,最终导致逻辑判断问题并执行DROP TABLE报错。
解决方法:由于动态SQL执行了DDL,可将原本的1个事务拆成2个:显式提交事务,在第2个匿名块开始前加一个
commit