JDBC - Oracle ArrayIndexOutOfBoundsException - PullRequest
14 голосов
/ 10 ноября 2008

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

Ответы [ 7 ]

25 голосов
/ 11 ноября 2008

В Oracle Metalink (сайт поддержки Oracle - примечание ID 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", ...)

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

0 голосов
/ 20 июля 2016

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

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

0 голосов
/ 06 июля 2012

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

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

0 голосов
/ 10 ноября 2008

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

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

0 голосов
/ 10 ноября 2008

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

0 голосов
/ 10 ноября 2008

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

0 голосов
/ 10 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...