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>
Это сработало.