我在我的程序中写了两个更新语句。出于某些奇怪的原因,第一个更新语句只更新了一些记录(基本上我更新了超过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 );
答案 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;
关于'为什么它没有更新问题':没有看到实际数据,很难说。你能给我们一个示例数据集吗?是否有可能,第一个语句更新相同数量的行,但数据不会更改(优先级保持不变)?