JDBC - Oracle ArrayIndexOutOfBoundsException

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

Я думаю, вам следует вставить код, с которым вы выполняете этот SQL.

Vinko Vrsalovic 10.11.2008 15:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
1
23 743
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

Думаю, это тоже лишнее.

Fred 10.11.2008 17:01

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

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

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

Количество значений и столбцов в заявлении совпадает по моему количеству.

Dave Costa 10.11.2008 17:36
Ответ принят как подходящий

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

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

Он отлично работает, если не требуется возвращать сгенерированные ключи. По крайней мере, я все еще получаю эту ошибку. Я использую шаблон Spring: KeyHolder keyHolder = new GeneratedKeyHolder (); SqlParameterSource paramSource = новый BeanPropertySqlParameterSource (элемент); simpleJdbcTemplate.getNamedParameterJdbcOperations (). update (‌ sql, paramSource, keyHolder, new String [] {"id"}); Есть идеи?

Anton Kuzmin 20.04.2009 19:54

Патч Metalink по-прежнему не исправляет ошибку в некоторых конкретных случаях. Например, этот запрос не работает ни с исправленным ojdbc, ни с самой последней версией ojdbc (11.2.0.1.0): выберите 1 из двойных, где 1 в (?,?,?,?,?,?,?,?) И 1 =: foo Однако этот запрос работает нормально: выберите 1 из двойного, где 1 в (?,?,?,?,?,?,?) И 1 =: foo Заключение: не смешивайте позиционные и именованные параметры, чтобы избежать эта конкретная проблема.

Misha 13.10.2009 14:28

@Raimonds Можете ли вы предоставить URL-адрес металинк Oracle, откуда я могу скачать патч? Как использовать этот патч? Есть ли другое решение из упомянутого выше

Kamlesh Kanazariya 22.01.2015 11:19

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

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

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

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

Осталось только сказать, что вам нужно сослаться на репозиторий в вашем pom-файле, но у меня это сработало.

Thialyson Martins 29.11.2019 14:52

Другие вопросы по теме