Oracle MERGE raise ORA-00904 无效的标识符

今天在开发过程中遇到了一个很奇怪的错误,java.sql.SQLException: ORA-00904: "T1"."C_BALE": 无效的标识符!

出现这个错误的时候我仅仅是把原有语句中的条件T1.ID = T2.ID改为了T1.C_BALE = T2.C_BALE,其中T1为实体表-原表、T2为虚拟表-新表。

于是开始分析问题原因:

  1. 既然报错无效的标示符,那么首先确认表中是否有该字段。

    经确认该字段一直存在,并且在语句的UPDATE SET部分以及INSERT 部分都存在针对该字段的操作,所以字段不存在原因排除

  2. 程序使用数据库与PL SQL使用的数据库是否一致

    经确认为同一个数据库,原因排除

  3. 字符大小写是否敏感

    全部转换为大写后问题依旧,原因排除(ORACLE 在实际执行脚本之前都会把字符转换为大写,所以ORACLE不敏感大小写)

  4. 语法是否书写错误

    在PL SQL中针对表T1写了个最简单的例子,验证通过,证明语法没问题

    MERGE INTO B_TBG_TRADE_HVIDATA_FINAL T1

    USING (SELECT 1 ID, '1110003' C_BALE FROM DUAL) T2

    ON (T1.C_BALE = T2.C_BALE)

    WHEN MATCHED THEN

      UPDATE

        SET ID = 9999

    WHEN NOT MATCHED THEN

      INSERT (ID, C_BALE)

      VALUES

      (999, '00000111111')

  5. 是否因JDK版本不支持导致

    因为实际环境中的语句是用?赋值,并且变量比较多,所以我才迟迟不想直接在PL SQL中执行java中的脚本。现在能排除的原因都已经排除了,所以只能麻烦点自己生成sql脚本了。最终生成的脚本与JAVA中报错一直,原因排除。

  6. 求救万能的谷歌

    既然自己解决不聊了,就请教万能的谷歌大神吧!!!搜索关键字Oracle MERGE ORA-00904,出来一堆相关网页,试了几个方法依然不行,不过功夫不负有心人,在浏览N个网页后终于问题解决。

 原因其实很简单,就是出现在ON (T1.C_BALE = T2.C_BALE)关键字里面的字段,不允许同时出现在UPDATE SET中,所以抛出这个错误,把UPDATE SET中的C_BALE更新语句去掉,问题解决!!!

跪谢万能的谷歌大神!!!

  

参考地址:http://stackoverflow.com/questions/8266463/oracle-merge-raise-ora-00904-error



你可能感兴趣的:(Oracle MERGE raise ORA-00904 无效的标识符)