programing

JDBC - Oracle ArrayIndexOutOfBounds 예외

yellowcard 2023. 11. 1. 22:16
반응형

JDBC - Oracle ArrayIndexOutOfBounds 예외

오라클 테이블에 행을 삽입하려고 하면 예외가 발생합니다.오라클 11에 ojdbc5.jar를 사용하고 있습니다. 이것이 제가 시도하고 있는 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,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

그리고 나는 예외를 따르게 됩니다.어떤 도움이라도 주시면 감사하겠습니다.

자바, lj아바, lang.ArrayIndexOutOfBounds예외: 15오라클에서 jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)오라클에서 jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623)오라클에서 jdbc.driver.Oracle Prepared Statement.(오라클 준비문.java:1212)오라클에서 jdbc.driver.T4C 준비 상태.(T4C 준비 상태.java:28)오라클에서 jdbc.driver.T4C 드라이버 확장.allocatePrepared Statement(T4C driverExtension.java:68)오라클에서 jdbc.driver.물리적 연결.prepareStatement(물리적 연결.java:3059)오라클에서 jdbc.driver.물리적 연결.prepareStatement(물리적 연결.java:2961)오라클에서 jdbc.driver.물리적 연결.prepareStatement(물리적 연결.java:5874)조직.jboss.자원.adapter.jdbc.WrapedConnection.prepareStatement(WrapedConnection.java:232)com에서gehcit.platform. cds.common. util.db.DBWrapper.execute오라클 리턴PK 삽입(DBWrapper.java:605)

Oracle Metalink(Oracle의 지원 사이트 - Note ID 736273.1)에서 이 오류가 JDBC 어댑터(버전 10.2.0.0.0~11.1.0.7.0)의 버그임을 발견했습니다. 7개 이상의 위치 매개 변수로 preparedStatement를 호출하면 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", ...)

등: 이 쿼리에 대해 명명된 바인딩 변수를 설정합니다.

저는 batis + oracle + spring + maven을 사용하고 있습니다.매개 변수가 8개 이상인 경우 동일한 오류 "array index out of bounds exception"입니다.

폼 버전 ojdbc6에서 ojdbc14로 변경된 경우,

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

됐습니다.

코드를 보지 않고 각 연결이 스레드 안전 방식으로 액세스되고 있는지 확인하는 것만 생각합니다.Oracle 드라이버는 일반적으로 상당히 견고합니다.두 개 이상의 스레드가 동일한 연결 인스턴스에 액세스하여 이상한 작업을 수행할 때와 같은 이상한 내부 오류를 본 적이 있습니다.나사산은 안전하지 않으므로 나사산마다 하나씩 보관해야 합니다.

매개변수 수를 잘못 입력한 것 같습니다.15분 안에 지나가셔야 하는데 16분이나 14분을 보내시는 겁니다.

네, 제 마우스 커서 계산이 꺼지지 않는 한, 15개의 열에 16개의 값을 삽입하려고 하는 겁니다.

SQLPlus*와 동일한 작업을 수행해 보십시오. ORA-00913: 값이 너무 많습니다.

제가 이해하는 바가 맞다면, 당신은 15명의 자리 표시자와 함께 준비된 진술서를 작성합니다.따라서 15개의 파라미터 값을 가진 배열을 호출에 전달해야 합니다.하나를 놓쳤거나 남은 것을 추가한 것은 아닐까요?

Oracle.jdbc에 액세스할 수 없는 경우.PreparedStatement 클래스(및 강제로 java.sql을 사용합니다).#setXXXAtName() 메서드를 지원하지 않는 PreparedStatement는 명명된 매개 변수를 사용하는 제안된 솔루션은 옵션이 아닙니다.

준비된 문 및 생성된 키를 사용했습니다.필수 값을 전달하기 위한 홀더 접근 방식(운 좋게도 7보다 작음)을 사용하고 생성된 기본 키를 사용하여 나머지 값에 대한 간단한 SQL 업데이트를 실행했습니다.

언급URL : https://stackoverflow.com/questions/277744/jdbc-oracle-arrayindexoutofboundsexception

반응형