今天在开发过程当中遇到了一个很奇怪的错误,java.sql.SQLException: ORA-00904: "T1"."C_BALE": 无效的标识符!java
出现这个错误的时候我仅仅是把原有语句中的条件T1.ID = T2.ID改成了T1.C_BALE = T2.C_BALE,其中T1为实体表-原表、T2为虚拟表-新表。sql
因而开始分析问题缘由:数据库
既然报错无效的标示符,那么首先确认表中是否有该字段。oracle
经确认该字段一直存在,而且在语句的UPDATE SET部分以及INSERT 部分都存在针对该字段的操做,因此字段不存在缘由排除spa
程序使用数据库与PL SQL使用的数据库是否一致开发
经确认为同一个数据库,缘由排除get
字符大小写是否敏感io
所有转换为大写后问题依旧,缘由排除(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