私は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() を使用して、バッチ処理された特定の要素の例外を取得します。