首批通过分布式安全可靠测评,为关键业务系统打造
DML 语句调用函数报错 table is mutating
更新时间:2026-05-28 02:06
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题现象
使用 DML 语句调用函数(函数中也对同一个表使用 DML 语句),发生类似如下报错信息。
- ERROR 5791 (HY000): table is mutating, trigger/function may not see it
- ErrorCode = 1442, SQLState = HY000, Details = table is mutating, trigger/function may not see it
- ErrorCode = 1442, SQLState = HY000, Details = Can't update table 'xxx' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
- ORA-04091: table is mutating, trigger/function may not see it
测试 SQL:
create table resFun(var1 char(50),var2 char(50),var3 char(50));
DELIMITER //
create function func3(var1 char(50))
returns char(50)
begin
insert into resFun (var1) values (var1);
return 'aaa';
end //
DELIMITER ;
insert into resFun values ('1','1',func3('1'));
create table resFun(var1 varchar2(50),var2 varchar2(50),var3 varchar2(50));
create or replace function func3(var1 in number)
return number
is
begin
insert into resFun (var1) values (var1);
return 66;
end;
/
insert into resFun values (12,12,func3(12));
问题原因
OceanBase 数据库的功能限制,执行外层 insert 后,表的状态被修改为 mutating,再次执行函数中的查询时便会报错。
解决方法
- 升级 OceanBase 数据库至 V4.x 版本
- 或者修改 SQL 以避免使用 DML 语句调用函数并且函数中也对同一个表使用 DML 语句的情景。