JDBC - Oracle ArrayIndexOutOfBoundsException

时间:2008-11-10 12:22:11

标签: oracle jdbc jboss

我在尝试在oracle表中插入一行时遇到异常。 我在oracle 11上使用ojdbc5.jar 这是我正在尝试的SQL

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,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

我得到以下异常。任何帮助将不胜感激。

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)

7 个答案:

答案 0 :(得分:25)

在Oracle Metalink(Oracle的支持站点 - 注释ID 736273.1)中,我发现这是JDBC适配器(版本10.2.0.0.0到11.1.0.7.0)中的一个错误,当您调用具有7个以上位置参数的preparedStatement时然后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", ...)

等。为此查询设置命名绑定变量。

答案 1 :(得分:0)

在没有看到代码的情况下,我唯一能想到的就是检查是否以线程安全的方式访问每个连接。 Oracle驱动程序通常非常可靠。我唯一一次看到奇怪的内部错误就是当你有多个线程访问同一个连接实例并用它做奇怪的事情时。它们不是线程安全的,应该保持每个线程一个。

答案 2 :(得分:0)

如果我理解正确,您可以创建一个包含15个占位符的预准备语句。因此,您需要将包含15个参数值的数组传递给调用。也许你错过了一个或增加了剩余的一个?

答案 3 :(得分:0)

看起来你输入了错误数量的参数。你应该在15岁时通过,但你要么发送16或14。

答案 4 :(得分:0)

是的除非我的鼠标光标计数关闭,否则你试图将16个值插入15列。

尝试相同的SQLPlus *,你应该得到ORA-00913:太多的值

答案 5 :(得分:0)

如果您无法访问oracle.jdbc.PreparedStatement类(并且被强制使用java.sql.PreparedStatement,它不支持方法#setXXXAtName()),则建议的使用命名参数的解决方案是不是一种选择。

我已经使用了PreparedStatement和GeneratedKeyHolder方法来传递强制值(幸运的是小于7),并使用返回的生成主键为剩余值发出简单的SQL更新。

答案 6 :(得分:0)

我正在使用mybatis + oracle + spring + maven。 相同的错误“arrayindexoutofboundsexception”,如果有8(或)以上参数。

在pom中将ojdbc6更改为ojdbc14,

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

有效。