2008-11-10 18 views
14

我在嘗試在Oracle表中插入行時收到異常。 我使用ojdbc5.jar的Oracle 11 這是我想要JDBC - Oracle ArrayIndexOutOfBoundsException

INSERT INTO rule_definitions(RULE_DEFINITION_SYS,rule_definition_type, 
rule_name,rule_text,rule_comment,rule_message,rule_condition,rule_active, 
rule_type,current_value,last_modified_by,last_modified_dttm, 
rule_category_sys,recheck_unit,recheck_period,trackable) 
VALUES(RULE_DEFINITIONS_SEQ.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 

的SQL和我得到下面的異常。任何幫助將不勝感激。

 
java.ljava.lang.ArrayIndexOutOfBoundsException: 15 
at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950) 
    at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623) 
    at oracle.jdbc.driver.OraclePreparedStatement.(OraclePreparedStatement.java:1212) 
    at oracle.jdbc.driver.T4CPreparedStatement.(T4CPreparedStatement.java:28) 
    at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68) 
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3059) 
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:2961) 
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5874) 
    at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:232) 
    at com.gehcit.platform.cds.common.util.db.DBWrapper.executeInsertOracleReturnPK(DBWrapper.java:605) 
+0

我認爲你應該粘貼你正在執行這個SQL的代碼。 – 2008-11-10 12:30:02

回答

25

在Oracle的Metalink(Oracle的支持站點 - 注ID 736273.1),我發現這是JDBC適配器(錯誤版本10.2 .0.0.0到11.1.0.7.0),當你用多於7個位置參數調用prepareStatement時,JDBC將拋出這個錯誤。

如果您有權訪問Oracle Metalink,那麼有一個選擇是去那裏下載提及的補丁。

另一個解決方案是解決方法 - 使用命名參數而不是位置參數:

INSERT INTO rule_definitions(RULE_DEFINITION_SYS,rule_definition_type, 
rule_name,rule_text,rule_comment,rule_message,rule_condition,rule_active, 
rule_type,current_value,last_modified_by,last_modified_dttm, 
rule_category_sys,recheck_unit,recheck_period,trackable) 
VALUES(RULE_DEFINITIONS_SEQ.NEXTVAL,:rule_definition_type, 
:rule_name,:rule_text,:rule_comment,:rule_message,:rule_condition,:rule_active, 
:rule_type,:current_value,:last_modified_by,:last_modified_dttm, 
:rule_category_sys,:recheck_unit,:recheck_period,:trackable) 

,然後使用

preparedStatement.setStringAtName("rule_definition_type", ...) 

等設置名爲綁定變量對於這個查詢。

0

沒有看到代碼,我唯一能想到的就是檢查每個連接是否以線程安全方式訪問。 Oracle驅動程序通常非常穩固。唯一一次我看到奇怪的內部錯誤就是當你有不止一個線程訪問同一個連接實例並且用它做了奇怪的事情時。它們不是線程安全的,應該保持爲每個線程一個。

0

如果我理解正確,您將創建一個包含15個佔位符的準備語句。所以你需要傳遞一個包含15個參數值的數組給這個調用。也許你錯過了一個或添加了一個剩餘的?

+0

或多一個... – Elie 2008-11-10 13:49:42

+0

我認爲這也是額外的一個。 – Fred 2008-11-10 14:01:59

0

看起來你傳遞了錯誤的參數數量。您應該傳入15,但您要麼發送16或14。

0

是的,除非我的鼠標光標計數關閉,您試圖將16個值插入15列。

嘗試同樣的事情的SQLPlus *,你應該得到ORA-00913:值過多

+0

聲明中的值和列數與我的計數匹配。 – 2008-11-10 14:36:49

0

當您無權訪問oracle.jdbc.PreparedStatement類(並且被迫使用java.sql.PreparedStatement,它不支持#setXXXAtName()方法)時,建議的解決方案使用命名參數不是一種選擇。

我已經使用PreparedStatement和GeneratedKeyHolder方法來傳遞強制值(幸運地小於7),並使用返回的生成主鍵爲其餘值發出一個簡單的SQL更新。

0

我使用的是mybatis + oracle + spring + maven。 如果有8(或)個以上的參數,則會出現同樣的錯誤「arrayindexoutofboundsexception」。

在POM改變版本ojdbc6到ojdbc14,

<dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc14</artifactId> 
     <version>10.2.0.3.0</version> 
    </dependency> 

它的工作。