1

我在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() 检索特定批处理元素的异常。

4

0 回答 0