14

尝试在 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
在 oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)
    在 oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623)
    在 oracle.jdbc.driver.OraclePreparedStatement.(OraclePreparedStatement.java:1212)
    在 oracle.jdbc.driver.T4CPreparedStatement.(T4CPreparedStatement.java:28)
    在 oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68)
    在 oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3059)
    在 oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:2961)
    在 oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5874)
    在 org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:232)
    在 com.gehcit.platform.cds.common.util.db.DBWrapper.executeInsertOracleReturnPK(DBWrapper.java:605)
4

7 回答 7

27

在 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", ...)

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

于 2008-11-11T10:29:23.353 回答
1

我正在使用 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>

有效。

于 2016-07-20T09:23:18.937 回答
0

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

于 2008-11-10T12:34:41.477 回答
0

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

于 2008-11-10T12:35:14.533 回答
0

看起来您传递的参数数量错误。您应该传递 15,但您要发送 16 或 14。

于 2008-11-10T13:51:01.947 回答
0

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

尝试相同的 SQLPlus*,你应该得到 ORA-00913: too many values

于 2008-11-10T13:55:30.487 回答
0

当您无权访问 oracle.jdbc.PreparedStatement 类(并且被迫使用不支持方法#setXXXAtName() 的 java.sql.PreparedStatement)时,建议的使用命名参数的解决方案不是一个选项.

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

于 2012-07-06T10:10:59.600 回答