JDBC - Oracle ArrayIndexOutOfBoundsException

Я получаю исключение при попытке вставить строку в таблицу оракула. Я использую ojdbc5.jar для oracle 11 это 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)

Ответы

Ответ 1

В Oracle Metalink (сайт поддержки Oracle - идентификатор примечания 736273.1) Я обнаружил, что это ошибка в адаптере JDBC (версия 10.2.0.0.0 - 11.1.0.7.0), когда вы вызываете prepareStatement с более чем 7 позиционными параметрами то 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", ...)

и т.д.. для установки имен переменных связывания для этого запроса.

Ответ 2

Не видя кода, я могу подумать только о том, чтобы проверить, что к каждому соединению обращаются в потоковом режиме. Драйверы Oracle обычно довольно прочные. Единственный раз, когда я видел такие странные внутренние ошибки, как это, когда у вас есть более одного потока, обращающегося к одному экземпляру подключения, и с ним делаются странные вещи. Они не являются потокобезопасными и должны храниться в одном потоке.

Ответ 3

Вы создаете подготовленный оператор с 15 заполнителями, если я понимаю правильно. Поэтому вам необходимо передать массив с 15 значениями параметров для вызова. Может быть, вы пропустили один или добавили излишки?

Ответ 4

Похоже, что вы передаете неправильное количество параметров. Вы должны проходить через 15, но вы отправляете 16 или 14.

Ответ 5

Да, если мой подсчет указателя мыши не выключен, вы пытаетесь вставить 16 значений в 15 столбцов.

Попробуйте то же самое, что и SQLPlus *, вы должны получить ORA-00913: слишком много значений

Ответ 6

Если у вас нет доступа к классу oracle.jdbc.PreparedStatement(и они вынуждены использовать java.sql.PreparedStatement, который не поддерживает методы #setXXXAtName()), предлагаемое решение использовать именованные параметры не вариант.

Я использовал подход PreparedStatement и GeneratedKeyHolder для обязательных значений, которые нужно передать (к счастью, меньше 7), и использовал сгенерированный первичный ключ, который был возвращен, чтобы выпустить простое обновление SQL для остальных значений.

Ответ 7

Я использую 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>

Это сработало.