今天在开发过程中遇到了一个很奇怪的错误,java.sql.SQLException: ORA-00904: "T1"."C_BALE": 无效的标识符!
出现这个错误的时候我仅仅是把原有语句中的条件T1.ID = T2.ID改为了T1.C_BALE = T2.C_BALE,其中T1为实体表-原表、T2为虚拟表-新表。
于是开始分析问题原因:
既然报错无效的标示符,那么首先确认表中是否有该字段。
经确认该字段一直存在,并且在语句的UPDATE SET部分以及INSERT 部分都存在针对该字段的操作,所以字段不存在原因排除
程序使用数据库与PL SQL使用的数据库是否一致
经确认为同一个数据库,原因排除
字符大小写是否敏感
全部转换为大写后问题依旧,原因排除(ORACLE 在实际执行脚本之前都会把字符转换为大写,所以ORACLE不敏感大小写)
语法是否书写错误
在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')
是否因JDK版本不支持导致
因为实际环境中的语句是用?赋值,并且变量比较多,所以我才迟迟不想直接在PL SQL中执行java中的脚本。现在能排除的原因都已经排除了,所以只能麻烦点自己生成sql脚本了。最终生成的脚本与JAVA中报错一直,原因排除。
求救万能的谷歌
既然自己解决不聊了,就请教万能的谷歌大神吧!!!搜索关键字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