我在java对象中有数据作为data1,data2。
data1 和 data2 一起在我要插入对象的 myTable 中形成一个复合键。
写作是批量进行的。10 个插入语句是使用 10 个对象准备的,并作为批处理执行。
我想插入带有约束的上述数据: data1 + data2 不应该已经存在于 myTable 中,即 data1 + data2 应该是唯一的 --- 如果是唯一的,则写入 else 只是忽略。
我正在使用的查询是:
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:非原子批处理失败”。错误。
我认为这与在批处理场景中使用 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 是包含要写入的两列的 java 对象。
错误是:
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; 错误的 SQL 语法 [插入 mySchema.myTable(column1, column2) select ?,? 从不存在的 SYSIBM.DUAL 中(从 mySchema.myTable A 中选择 1,其中 ?=A.column1 和 ?=A.column2)];嵌套异常是 com.ibm.db2.jcc.b.ie:非原子批处理失败。该批次已提交,但该批次的单个成员至少发生了一次异常。使用 getNextException() 检索特定批处理元素的异常。