晚上写点东西,本来心情挺好,没想到经历一场噩梦。
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个小时光和他耗了。娘的,老爷我不干了。
这才有以上文字。

解决方案 »

  1.   

    沙发自己坐。
    编辑过程中有点错误。 cellid 也是一个变量,游标中的,没问题。红色部分变量是过程的参数,有子查询的情况下不能使用。
    主啊,饶了我吧。
      

  2.   

    又查了查,有人说是2.0.1的bug,先升级44.
    为了不白放分,哪位仁兄提供一个9.2.0.5 for solaris的补丁包,溜了一遍,没看到for solaris的。
      

  3.   

    我环境也是solaris的,不过我用的是10.2.0.4,
    楼主既然用9,直接找9.2.0.8的包不行吗?
      

  4.   

    Oracle Database Vault Oracle9i 第 2 版 (9.2.0.8)下载 适用于 Solaris 操作系统 (SPARC)(32 位)
    下载 适用于 Solaris 操作系统 (SPARC)(64 位)
    下载 适用于 Linux x86-64
    下载 适用于基于 AIX 5L 的系统(64 位)
    下载 适用于 HP-UX PA-RISC(64 位) 
    链接在:
    http://www.oracle.com/technology/global/cn/software/products/database_vault/index.html
      

  5.   

    楼主在存储过程和pl/sql中执行都是这样吗,
    是不是可以试下别的的方式调用这个语句呢?
    比如说在java里面用绑定变量调用试下我帮查了下,asktom和oracle forum上面没有查到相关的信息
      

  6.   

    我这里打得开啊...换了关键字,用ORA-01008 merge查,找到了一些信息,bug的可能性很大
    这个基本上和楼主的问题一样:
    http://www.itpub.net/thread-430310-1-1.html这是用dblink时出现的ora-01008
    http://grouchgeek.blogspot.com/2008/08/ora-01008-on-plsql-merge-over-link.html
    http://dbaspot.com/f2/oracle-merge-remote-db-ora-01008-not-all-variables-bound-66158.html这是用分区表时出现的:
    http://www.orafaq.com/forum/t/100888/0/这是使用oc4j时出现的
    http://forums.oracle.com/forums/thread.jspa?threadID=46036看起来,oracle写一块代码时请了个菜鸟,呵呵
      

  7.   

    http://fourfire.javaeye.com/blog/162286
    这个地址不错
      

  8.   

    9.2.0.1测试环境中问题依旧,只好通过insert +update回避,准备打个补丁,再看看效果。
    正式环境为 10,一切正常。
      

  9.   

    当时翻了翻桌上的台历,看看今天是不是有什么忌讳,比如说,不易写sql,结果,没有,那就继续。--------------------------哈哈...
      

  10.   

    建议楼主选一个写sql的黄道吉日吧哈哈
      

  11.   

    哈哈,jdsnhan蛮有才的吗... 问题解决了别忘记贴上来一起学习一下噢。
      

  12.   

    一个小bug 足可以让人抓狂
    呵呵,同情lz
      

  13.   

    是bug吗?怎样解决的啊?
    大家都在等结果呢
      

  14.   

    不知道楼主具体怎么解决的bug,楼主说下,介绍下经验吧!
      

  15.   

    >>过程体中变量换成常量,正常了CHAR字段没TRIM的预感。
      

  16.   

    这两天和我的小猫做斗争了,在把他大卸等我数数几块啊,连带螺丝一共七块之后,他还是不能上网。今天买个新的去。因为solaris下的测试环境一直有人用,所以,没有打补丁。
    在window下,升级到9.2.0.8后,问题解决。