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

问题现象

某客户的应用在执行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来重现,验证问题。

浏览量:0