2008-11-10 9 views
14

Otrzymuję wyjątek podczas próby wstawienia wiersza do tabeli Oracle. Używam ojdbc5.jar dla Oracle 11 to sql PróbujęJDBC - Oracle ArrayIndexOutOfBoundsException

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,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 

i otrzymuję następujący wyjątek. Każda pomoc zostanie doceniona.

 
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) 
+0

Myślę, że powinieneś wkleić kod, w którym wykonywany jest ten SQL. –

Odpowiedz

25

W Oracle Metalink (witrynie pomocy technicznej firmy Oracle - przyp ID 736273.1) Okazało się, że jest to błąd w adapterze JDBC (wersja 10.2 .0.0.0 do 11.1.0.7.0), który wywołując readyStatement z więcej niż 7 parametrami pozycyjnymi, JDBC rzuci ten błąd.

Jeśli masz dostęp do Oracle Metalink, wybierz jedną z opcji, aby pobrać wspomnianą poprawkę.

Innym rozwiązaniem jest obejście - stosowanie nazwie parametry zamiast pozycyjne parametry:

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) 

a następnie za pomocą

preparedStatement.setStringAtName("rule_definition_type", ...) 

itp ustawić nazwie zmienne wiązania dla tego zapytania.

+3

Działa poprawnie, chyba że wygenerowane klucze są potrzebne do zwrócenia. Przynajmniej wciąż mam ten błąd. Używam szablonu sprężyny: KeyHolder keyHolder = new GeneratedKeyHolder(); SqlParameterSource paramSource = new BeanPropertySqlParameterSource (element); simpleJdbcTemplate.getNamedParameterJdbcOperations(). Update (sql, paramSource, keyHolder, new String [] {"id"}); Jakieś pomysły? –

+0

Poprawka Metalink wciąż nie naprawia błędu w niektórych szczególnych przypadkach. Na przykład to zapytanie nie działa ani z patched ojdbc, ani z najnowszą wersją ojdbc (11.2.0.1.0): wybierz 1 z dual, gdzie 1 in (?,?,?,?,?,?,? ,?) i 1 =: foo Jednak to zapytanie działa dobrze: wybierz 1 z dual, gdzie 1 in (?,?,?,?,?,?,?) i 1 =: foo Wniosek: don Zmodyfikuj parametry pozycyjne i nazwane, aby uniknąć tego konkretnego problemu. – Misha

+0

@Raimonds Czy możesz podać adres URL url oracle, skąd mogę pobrać łatkę? Jak wykorzystać tę poprawkę? Czy jest inne rozwiązanie z wyżej wymienionych? –

0

Bez zobaczenia kodu, jedyne co mogę myśleć o to, aby sprawdzić, że każda gra jest dostępna w sposób bezpieczny wątku. Sterowniki Oracle są zwykle dość solidne. Jedyny przypadek, w którym widziałem dziwne błędy wewnętrzne, to sytuacja, w której masz więcej niż jeden wątek, który uzyskuje dostęp do tej samej instancji połączenia i robi z nią dziwne rzeczy. Nie są bezpieczne dla wątków i powinny być przechowywane w jednym wątku.

0

Tworzysz przygotowane oświadczenie z 15 symbolami zastępczymi, jeśli rozumiem je poprawnie. Musisz więc przekazać do tablicy tablicę z 15 wartościami parametrów. Może przegapiłeś jedną lub dodałeś nadwyżkę?

+0

lub może jeszcze jeden ... – Elie

+0

Myślę, że to również dodatkowy. – Fred

0

Wygląda na to, że podajesz nieprawidłową liczbę parametrów. Powinieneś zdać 15, ale wysyłasz 16 lub 14.

0

Tak, chyba że moje zliczanie kursorów myszy jest wyłączone, próbujesz wstawić 16 wartości do 15 kolumn.

Spróbuj samo SQLPLUS *, powinieneś dostać ORA-00913: zbyt wiele wartości

+0

Liczba wartości i kolumn w zestawieniu jest zgodna z liczbą. –

0

Gdy nie masz dostępu do klasy oracle.jdbc.PreparedStatement (i są zmuszeni używać java.sql.PreparedStatement, która nie obsługuje metod #setXXXAtName()), proponowane rozwiązanie do używania nazwanych parametrów nie jest opcją.

Użyłem metody PreparedStatement i GeneratedKeyHolder do podania obowiązkowych wartości (na szczęście mniej niż 7) i użyłem wygenerowanego klucza podstawowego zwróconego do wydania prostej aktualizacji SQL dla pozostałych wartości.

0

Używam mybatis + oracle + spring + maven. Ten sam błąd "arrayindexoutofboundsexception", jeśli ma 8 (lub) powyższych parametrów.

W pom zmieniło wersji ojdbc6 do ojdbc14,

<dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc14</artifactId> 
     <version>10.2.0.3.0</version> 
    </dependency> 

to działało.