merge into执行时报错YAS-05235 cannot perform a DML or DDL or DCL inside a query or DML
问题现象
某客户的应用在执行merge into时报错:YAS-05235 cannot perform a DML or DDL or DCL inside a query or DML
问题的风险及影响
客户的正常sql无法执行,影响业务功能。
问题影响的版本
所有的yashandb版本
问题发生原因
merge into语句如果带子定义函数,那么就会触发这个问题。
解决方法及规避方式
不使用merge into,使用insert/update等价代替。
问题分析和处理过程
问题原因:自定义函数在yashandb执行时对merge into场景处理有误。
使用如下的sql可以验证yashandb当前版本是否存在这个问题。如果执行时有YAS-05235 cannot perform a DML or DDL or DCL inside a query or DML异常,那么此问题存在。
drop table a; create table a ( tid number, tname varchar2(30) ); drop table b; create table b ( tid number, tname varchar2(30) );
create or replace function fun(ii number) return number is v_r number; begin select tid into v_r from (select 1 tid from dual); return v_r; end; /
merge into b using (select fun(1) as tid, 'a' as tname from dual) a on (b.tid = a.tid) when matched then update set tname = a.tname when not matched then insert values (a.tid, a.tname); |
经验总结
客户的原始sql很复杂,分析简化后使用精简sql来重现,验证问题。