2017-08-09 59 views
0

我正在使用PreparedStatement來執行更新查詢。 以下是查詢:PreparedStatement.executeUpdate()不適用於Oracle

String callersUpdateQuery = "update W67U999S a set pcrdattim= ? where exists (select b.CRDATTIM, b.RECORDCD, b.CRNODE, b.UNITCD, b.WRKTYPE from W03U999S b where a.PCRDATTIM = ? and a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE and a.PRECORDCD = 'F' and a.PCRNODE = '01' and b.WRKTYPE = 'CALLER' and b.UNITCD=? and a.crecordcd='T')"; 

下面是java代碼應該更新記錄:

​​

preparedStatement.executeUpdate()沒有更新所需的行並返回更新的行數爲零。奇怪的是,當我在數據庫端執行同樣的sql查詢時,記錄正在更新。 我的數據庫是Oracle和應該更新的表的模式如下:

Name  Null  Type  
----------- -------- ---------- 
PCRDATTIM NOT NULL CHAR(26) 
PRECORDCD NOT NULL CHAR(1)  
PCRNODE  NOT NULL CHAR(2)  
RECORDTYPE NOT NULL NUMBER(3) 
CCRDATTIM NOT NULL CHAR(26) 
CRECORDCD NOT NULL CHAR(1)  
CCRNODE  NOT NULL CHAR(2)  
CRDATTIM NOT NULL CHAR(26) 
LINKRULE_ID NOT NULL NUMBER(14) 

誰能猜有什麼錯的代碼或查詢?

+0

*「任何人都可以猜測...?」*當然,我猜測*它與'crdattim'和/或' businessAreaName'。 – Andreas

+0

*僅供參考:*不要在'exist'子句中的'a'上添加條件。它們應該作爲'update'的where子句的一部分。 – Andreas

+0

'b.UNITCD'的類型和大小是什麼?也許[這](https://stackoverflow.com/questions/28894238/query-column-with-char-data-type-in​​-oracle)可能會有所幫助。 –

回答

0

Oracle CHAR類型是這裏的罪魁禍首。我想要更新的列是CHAR。這是造成這個問題的原因。這個鏈接幫助我找出解決方案:Oracle JDBC and Oracle CHAR data type

0

首先,你是否檢查你在where條件中使用的選擇條件中是否存在元組?

如果有行正在返回。該問題可能與您執行更新聲明的事務有關。仔細檢查您的交易模式,以及是否確實提交。

作爲查詢優化建議,我會改變聲明:

String callersUpdateQuery = 
    "update W67U999S a 
    set pcrdattim= ? 
    where 
      a.PCRDATTIM = ? 
     and a.PRECORDCD = 'F' 
     and a.PCRNODE = '01' 
     and a.CRECORDCD ='T' 

     and exists (
      select 
       b.CRDATTIM, 
       b.RECORDCD, 
       b.CRNODE, 
       b.WRKTYPE 
      from W03U999S b 
      where 
        b.CCRDATTIM = a.CRDATTIM 
       and b.CRECORDCD = a.RECORDCD 
       and b.CCRNODE = a.CRNODE 
       and b.WRKTYPE = 'CALLER' 
       and b.UNITCD=? 
     )"; 

這樣,你會首先減少a元組然後用它來的b元組縮小,只有那些匹配。

+0

具有相同值的相同查詢通過SQL編輯器成功執行。是否存在導致此問題? –

+0

但是在SQL編輯器中,自動提交功能可能處於活動狀態。由於您處於同一事務中,因此自動提交更新或正在查看的數據對您可見。如果你的程序沒有主動提交,你的事務在執行結束時會回滾。 –

+0

Oracle CHAR類型是這裏的罪魁禍首。我想要更新的列是CHAR類型。這是造成這個問題的原因。此鏈接幫助我找出解決方案:https://stackoverflow.com/questions/5332845/oracle-jdbc-and-oracle-char-data-type –

相關問題