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





Не видя кода, единственное, что я могу придумать, - это проверить, выполняется ли доступ к каждому соединению в потокобезопасном режиме. Драйверы Oracle обычно довольно солидные. Единственный раз, когда я видел подобные странные внутренние ошибки, - это когда у вас есть несколько потоков, обращающихся к одному и тому же экземпляру соединения и выполняющих с ним странные вещи. Они не являются потокобезопасными и должны быть по одному на поток.
Если я правильно понял, вы создаете подготовленный оператор с 15 заполнителями. Итак, вам нужно передать в вызов массив с 15 значениями параметров. Может быть, вы пропустили один или добавили лишний?
Думаю, это тоже лишнее.
Похоже, вы передаете неправильное количество параметров. Вы должны передать 15, но вы отправляете либо 16, либо 14.
Да, если мой подсчет курсора мыши не отключен, вы пытаетесь вставить 16 значений в 15 столбцов.
Попробуйте то же самое с SQLPlus *, вы должны получить ORA-00913: слишком много значений
Количество значений и столбцов в заявлении совпадает по моему количеству.
В 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"}); Есть идеи?
Патч Metalink по-прежнему не исправляет ошибку в некоторых конкретных случаях. Например, этот запрос не работает ни с исправленным ojdbc, ни с самой последней версией ojdbc (11.2.0.1.0): выберите 1 из двойных, где 1 в (?,?,?,?,?,?,?,?) И 1 =: foo Однако этот запрос работает нормально: выберите 1 из двойного, где 1 в (?,?,?,?,?,?,?) И 1 =: foo Заключение: не смешивайте позиционные и именованные параметры, чтобы избежать эта конкретная проблема.
@Raimonds Можете ли вы предоставить URL-адрес металинк Oracle, откуда я могу скачать патч? Как использовать этот патч? Есть ли другое решение из упомянутого выше
Когда у вас нет доступа к классу 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-файле, но у меня это сработало.
Я думаю, вам следует вставить код, с которым вы выполняете этот SQL.