2013-07-17 44 views
0

我試圖做一個合併在Oracle:merge_oracle_ORA-01747:無效user.table.column,TABLE.COLUMN,或列規格

preparedStatement = dbConnection.prepareStatement("MERGE INTO dev_corpus a " + 
          "USING (SELECT ? corpusid, ? corpus_name, ? corpusdesc, ? corpusimageids, ? rocf1, ? rocf2, ? rocf3, ? rocc1, ? rocc2, ? rocc3, ? corpusactive, ? corpusrunfrequency, ? corpuslastrun, ? corpuslastsync, ? rocsettingid, ? corpusaffinity, ? corpusterms, ? corpusdomain FROM dual) incoming " + 
          "ON (a.corpusid = incoming.corpusid) " + 
          "WHEN MATCHED THEN " + 
          "UPDATE SET (a.corpus_name = incoming.corpus_name AND a.corpusdesc = incoming.corpusdesc AND a.corpusimageids = incoming.corpusimageids AND a.rocf1 = incoming.rocf1 AND a.rocf2 = incoming.rocf2 AND a.rocf3 = incoming.rocf3 AND a.rocc1 = incoming.rocc1 AND a.rocc2 = incoming.rocc2 AND a.rocc3 = incoming.rocc3 AND a.corpusactive = incoming.corpusactive AND a.corpusrunfrequency = incoming.corpusrunfrequency AND a.corpuslastrun = incoming.corpuslastrun AND a.corpuslastsync = incoming.corpuslastsync AND a.rocsettingid = incoming.rocsettingid AND a.corpusaffinity = incoming.corpusaffinity AND a.corpusterms = incoming.corpusterms AND a.corpusdomain = incoming.corpusdomain) " + 
          "WHEN NOT MATCHED THEN " + 
          "INSERT (a.corpusid, a.corpus_name, a.corpusdesc, a.corpusimageids, a.rocf1, a.rocf2, a.rocf3, a.rocc1, a.rocc2, a.rocc3, a.corpusactive, a.corpusrunfrequency, a.corpuslastrun, a.corpuslastsync, a.rocsettingid, a.corpusaffinity, a.corpusterms, a.corpusdomain) " + 
          "VALUES (incoming.corpusid, incoming.corpus_name, incoming.corpusdesc, incoming.corpusimageids, incoming.rocf1, incoming.rocf2, incoming.rocf3, incoming.rocc1, incoming.rocc2, incoming.rocc3, incoming.corpusactive, incoming.corpusrunfrequency, incoming.corpuslastrun, incoming.corpuslastsync, incoming.rocsettingid, incoming.corpusaffinity, incoming.corpusterms, incoming.corpusdomain)"); 

,我得到這個錯誤:

ORA-01747: invalid user.table.column, table.column, or column specification 

java.sql.SQLSyntaxErrorException: ORA-01747: invalid user.table.column, table.column, or column specification 

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:505) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:223) 
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1328) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3593) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3674) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1354) 
    at com.mycompany.datalayer.DB.insertToTaxonomy(DB.java:261) 
    at com.mycompany.datalayer.DB.restoreBackUp(DB.java:94) 
    at com.mycompany.datalayer.DB.startProcess(DB.java:56) 
    at com.mycompany.oraclebackup.App.main(App.java:13) 

現在,我檢查了它們的名稱是正確的。 你知道這是什麼問題嗎?我該如何解決它? (頁數:我沒有使用休眠)

謝謝!

回答

0

在Java Prepared語句中,您可以使用'?'僅適用於where子句中的列名稱。你試圖將這個概念擴展到其他地方,這是無效的。這裏是你的代碼中存在問題的部分:

SELECT ? corpusid, ? corpus_name, ? corpusdesc 

這裏是javadocs注意事項:

Note: The setter methods (setShort, setString, and so on) for setting IN parameter values must specify types that are compatible with the defined SQL type of the input parameter. For instance, if the IN parameter has SQL type INTEGER, then the method setInt should be used.

+0

謝謝你的提示!我需要更新表中的一行,否則將其插入表中。考慮到數據傳遞給類(不是從表中,所以我需要使用preparedstatment或類似的東西)。現在,如果我不能使用'?'在這裏,有沒有其他的選擇?或任何解決這個問題的方法?謝謝!! – user149855

+0

@ user149855您可能必須對您的sql查詢字符串進行字符串處理。 –

0

我猜測,就像corpusid領域,corpusimageids等可能不被存儲爲字符串相關的數據類型(例如。varchar)在數據庫的dev_corpus表中。它們可能是整數或數字字段。

我覺得他們是作爲字符串字段傳遞的,當你替換'?'中的參數時(例如,您可能正在使用字符串數組來傳遞這些參數)。在這種情況下,您必須確保在查詢本身中處理參數的數據類型,並參考表dev_corpus中使用的數據類型。

對於如。假設場corpusid是在你的數據庫表類型號碼,您的查詢應該是:

preparedStatement = dbConnection.prepareStatement("MERGE INTO dev_corpus a " + 
          "USING (SELECT to_number(?) corpusid, ? corpus_name, ? corpusdesc, ? corpusimageids, ? rocf1,..." 

比字符串字段以外的任何字段(CHAR,VARCHAR)可能需要這種特殊attention.eg

to_date(column_name,'dd-mm-yyyy') 
相關問題