1

私はdata1、data2としてJavaオブジェクトにデータを持っています。

data1 と data2 は一緒に、オブジェクトを挿入したい myTable の複合キーを形成します。

書き込みはバッチとして行われます。10 個のオブジェクトを使用して 10 個の INSERT ステートメントを作成し、バッチとして実行します。

上記のデータを制約付きで挿入したい: data1 + data2 はまだ myTable に存在してはならない、つまり data1 + data2 は一意でなければならない --- 一意の場合は書き込み、そうでなければ単に無視する。

私が使用しているクエリは次のとおりです。

Insert into mySchema.myTable(column1, column2)
  select 'abc', '123'
  from SYSIBM.DUAL
  where not exists
        ( select 1 
          from mySchema.myTable A 
          where 'abc' = A.column1 
            and '123' = A.column2
        )

単一のデータセットに対して上記のクエリを個別に実行すると、正常に実行されます。

ただし、バッチ シナリオでの実行中に、「com.ibm.db2.jcc.b.ie: Non-atomic batch failure.」というメッセージが表示されます。エラー。

バッチシナリオで SYSIBM.DUAL を使用することに関係があると思います。

失敗しているコード:

クエリを挿入:

Insert into mySchema.myTable(column1, column2)
select ?,? from SYSIBM.DUAL
where not exists (
  select 1 from mySchema.myTable A
  where ?=A.column1 and ?=A.column2)

ステートメント セッター:

ps.setString(1, item.getColumn1());
ps.setString(2, item.getColumn2());
ps.setString(3, item.getColumn1());
ps.setString(4, item.getColumn2());

item は、書き込む 2 つの列を保持する Java オブジェクトです。

エラーは次のとおりです。

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; 不適切な SQL 文法 [insert into mySchema.myTable(column1, column2) select ?,? from SYSIBM.DUAL where not exists (?=A.column1 および ?=A.column2 の mySchema.myTable A から 1 を選択)]; ネストされた例外は com.ibm.db2.jcc.b.ie: 非アトミック バッチ エラーです。バッチは送信されましたが、バッチの個々のメンバーで少なくとも 1 つの例外が発生しました。getNextException() を使用して、バッチ処理された特定の要素の例外を取得します。

4

0 に答える 0