Query

DB2:在批處理查詢中使用 NOT EXISTS 和 SYSIBM.DUAL 時出錯

  • November 5, 2012

我在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; 
bad SQL grammar 

[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)]; 

nested exception is com.ibm.db2.jcc.b.ie: Non-atomic batch failure.  

The batch was submitted, but at least one exception occurred on an 
individual member of the batch. 

Use getNextException() to retrieve the exceptions for specific batched elements. 

謝謝,尼克

這個問題有點老了,所以你可能已經找到了你的問題,但如果我可以提供一個替代方案……

在這種情況下使用MERGE語句可能會更好(點擊 publib 條目的連結):

MERGE INTO mySchema.myTable tab USING (
       VALUES ('abc', '123')
   ) AS merge (C1, C2)
   ON  tab.column1 = merge.C1
   AND tab.column2 = merge.C2
   WHEN MATCHED THEN
       IGNORE
   WHEN NOT MATCHED THEN 
       INSERT (column1, column2)
       VALUES (merge.C1, merge.C2)

這將獲取“假”表中的列merge,並使用子句中的鍵對它們進行比較ON,如果不匹配,則使用該INSERT語句。如果有匹配,則該行將被忽略。

但是,可用性MERGE取決於您的平台。我相當肯定MERGE自 v8 以來一直在 Linux/Unix/Windows DB2 中(儘管自 9.7 以來您只能使用PREPARE’d 合併),並且它是在 v9.1 的 z/OS DB2 中添加的。我不知道其他平台(AS/400 等)。

select ?, ? from SYSIBM.DUAL不是有效的語法。據我所知,問號只能放在where子句中。

引用自:https://dba.stackexchange.com/questions/5402