今天在開發過程當中遇到了一個很奇怪的錯誤,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