部分更新无法在程序

时间:2017-03-10 10:17:10

标签: sql oracle plsql sql-update

我在我的程序中写了两个更新语句。出于某些奇怪的原因,第一个更新语句只更新了一些记录(基本上我更新了超过100,000行)。所以第二个更新语句一直很好。我集思广益,但程序成功完成,但我没有得到什么问题。有什么方法可以执行验证检查,例如有多少更新了,有多少没有?

第一次更新声明(有时仅更新某些记录)

UPDATE /*+PARALLEL(A,10,2)*/ VV_ACT_CALL_DET_DIS_EXTRACT A SET PRIORITY = 
       ( SELECT P.PRIORITY
         FROM   VV_ACT_CALL_DET_DIS P
         WHERE  P.CALL_ID = A.CALL_ID
         AND    P.PRODUCT_ID = A.PRODUCT_ID
         AND    P.IS_DELETED = A.IS_DELETED
         AND    ROWVAL = 1 )
WHERE  EXTRACT_STATUS = 'PENDING'
AND    EXISTS
       ( SELECT B.PRIORITY
         FROM   VV_ACT_CALL_DET_DIS B
         WHERE  B.CALL_ID=A.CALL_ID
         AND    B.PRODUCT_ID = A.PRODUCT_ID
         AND    B.IS_DELETED = A.IS_DELETED );

虽然条件与上述相同,但仍会成功更新记录的第二次更新声明

UPDATE /*+PARALLEL(A,10,2)*/ VV_ACT_CALL_DET_DIS_EXTRACT A SET TYPE = 
       ( SELECT P.TYPE_VAL
         FROM   VV_ACT_CALL_DET_DIS P
         WHERE  P.CALL_ID = A.CALL_ID
         AND    P.PRODUCT_ID = A.PRODUCT_ID
         AND    P.IS_DELETED = A.IS_DELETED
         AND    ROWVAL = 1 )
WHERE  EXTRACT_STATUS = 'PENDING'
AND    EXISTS
       ( SELECT B.TYPE_VAL
         FROM   VV_ACT_CALL_DET_DIS B
         WHERE  B.CALL_ID = A.CALL_ID
         AND    B.PRODUCT_ID = A.PRODUCT_ID
         AND    B.IS_DELETED = A.IS_DELETED );

1 个答案:

答案 0 :(得分:3)

您可以在更新语句之后(提交之前)使用SQL%rowcount查询更新的行计数,例如:

update ....
if sql%rowcount <> nnn then  --or = 0 or ...
  raise_application_error(-20001, 'invalid number of rows updated: ' || sql%rowcount);
end if;

关于'为什么它没有更新问题':没有看到实际数据,很难说。你能给我们一个示例数据集吗?是否有可能,第一个语句更新相同数量的行,但数据不会更改(优先级保持不变)?