PreparedStatement.executeUpdate()不适用于Oracle

时间:2017-08-09 16:28:47

标签: java

我正在使用PreparedStatement来执行更新查询。 以下是查询:

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 = dbConnection.prepareStatement(callersUpdateQuery);
                preparedStatement.setString(1,newFolderCrdattim);  
                preparedStatement.setString(2,crdattim);  
                preparedStatement.setString(3,businessAreaName.trim());
                int j = preparedStatement.executeUpdate();

但是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) 

有人可以猜出代码或查询有什么问题吗?

1 个答案:

答案 0 :(得分: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元组缩小到仅匹配的元组。