14

Oracle テーブルに行を挿入しようとすると、例外が発生します。私はOracle 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,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

そして、次の例外が発生します。どんな助けでも大歓迎です。

java.ljava.lang.ArrayIndexOutOfBoundsException: 15
oracle.jdbc.driver.OracleSql.computeBasicInfo (OracleSql.java:950) で
    oracle.jdbc.driver.OracleSql.getSqlKind (OracleSql.java:623) で
    oracle.jdbc.driver.OraclePreparedStatement.(OraclePreparedStatement.java:1212)
    oracle.jdbc.driver.T4CPreparedStatement.(T4CPreparedStatement.java:28)で
    oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68)で
    oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3059)で
    oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:2961)で
    oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5874)で
    org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement (WrappedConnection.java:232) で
    com.gehcit.platform.cds.common.util.db.DBWrapper.executeInsertOracleReturnPK (DBWrapper.java:605) で
4

7 に答える 7

27

Oracle Metalink (Oracle のサポート サイト - Note ID 736273.1) で、これは JDBC アダプター (バージョン 10.2.0.0.0 から 11.1.0.7.0) のバグであることがわかりました。このエラーをスローします。

Oracle Metalink にアクセスできる場合は、そこにアクセスして上記のパッチをダウンロードする方法があります。

もう 1 つの解決策は回避策です。位置パラメータの代わりに名前付きパラメータを使用します。

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", ...)

などを使用して、このクエリの名前付きバインド変数を設定します。

于 2008-11-11T10:29:23.353 に答える
1

私はmybatis + oracle + spring + mavenを使用しています。上記の 8 つ (または) のパラメーターがある場合、同じエラー「arrayindexoutofboundsexception」。

pom でバージョン ojdbc6 を ojdbc14 に変更し、

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

出来た。

于 2016-07-20T09:23:18.937 に答える
0

oracle.jdbc.PreparedStatementクラスにアクセスできない場合(およびメソッド#setXXXAtName()をサポートしないjava.sql.PreparedStatementを使用するように強制される場合)、名前付きパラメーターを使用するための提案されたソリューションはオプションではありません。 。

渡される必須値(幸いなことに7未満)にはPreparedStatementおよびGeneratedKeyHolderアプローチを使用し、返された生成された主キーを使用して、残りの値に対して単純なSQL更新を発行しました。

于 2012-07-06T10:10:59.600 に答える
0

間違った数のパラメーターを渡しているようです。15 を渡す必要がありますが、16 または 14 を送信しています。

于 2008-11-10T13:51:01.947 に答える
0

ええ、私のマウス カーソル カウントがオフになっていない限り、15 列に 16 個の値を挿入しようとしています。

SQLPlus* と同じことを試してください。ORA-00913: too many values が表示されるはずです。

于 2008-11-10T13:55:30.487 に答える
0

コードを見ずに考えられる唯一のことは、各接続がスレッドセーフな方法でアクセスされていることを確認することです。通常、Oracle ドライバーはかなり安定しています。このような奇妙な内部エラーを見たのは、複数のスレッドが同じ接続インスタンスにアクセスして奇妙なことを行っている場合だけです。これらはスレッド セーフではないため、スレッドごとに 1 つにしておく必要があります。

于 2008-11-10T12:34:41.477 に答える
0

私が正しいと理解していれば、15 個のプレースホルダーを使用して準備済みステートメントを作成します。したがって、15 個のパラメーター値を持つ配列を呼び出しに渡す必要があります。たぶん、1つを逃したか、余ったものを追加しましたか?

于 2008-11-10T12:35:14.533 に答える