merge 的问题,其郁闷无比
晚上写点东西,本来心情挺好,没想到经历一场噩梦。
tsql := 'merge into haref2 a using (select refer,refered,refer_exp,level rlevel
from harefer start with refered=:tcellid connect by refered=prior refer) b
on (a.refer=b.refer and a.refered=b.refered and a.tempid=:tid)
when matched then update set a.rlevel=b.rlevel
when not matched then insert values (b.refer,b.refered,b.refer_exp,:tid,b.rlevel)';
execute immediate tsql using rec_val.refered,ai_tempid,ai_tempid;
上面的语句挺正常吧,可执行的时候偏偏抛出ORA-01008 not all variables bound的异常,郁闷,一点一点找,没问题啊。
把内容换成相关的insert和update,正常,-_-!
经历了近一个小时的折磨,发现在9.2.0.1.0中不行,10g中没问题,我。。。。。
不让绑定变量,咱就直接执行,更痛苦的事情发生了。过程体中执行
merge into haref2 a using (select refer,refered,refer_exp,level rlevel
from harefer where refered=[color=#FF00FF]cellid )[/color] b
on (a.refer=b.refer and a.refered=b.refered and a.tempid=ai_tempid)
when matched then update set a.rlevel=b.rlevel
when not matched then insert (refer,refered,refer_exp,tempid,rlevel)
values (b.refer,b.refered,b.refer_exp,ai_tempid,b.rlevel);
编译通过,执行正常,就是结果不对,该插入没插入,有点蒙,复制出去,变量换常量,正常,再复制进来,常量换变量,问题依据。
当时翻了翻桌上的台历,看看今天是不是有什么忌讳,比如说,不易写sql,结果,没有,那就继续。过程体中变量换成常量,正常了。
有点抓狂。想想,oracle不至于缺心眼到这地步,把蓝色部分的结果集合放到一个表中,其他的常量换回变量,一切正常,我。。。。。
因为是在过程的循环体中,难不成让我把循环生成的结果集放在临时表中再用merge?
4个小时光和他耗了。娘的,老爷我不干了。
这才有以上文字。