不用于使用 dbms_lob.compare,因此更新工作正常,但是当它到达 IF 语句时,看起来只有在它支持交替时才会做同样的事情,就像你在下面看到的那样
我的PL/SQL代码:
CREATE OR REPLACE PROCEDURE teste
IS
aux CLOB;
cnt NUMBER := 0;
cnt1 NUMBER := 0;
BEGIN
FOR rec IN (SELECT xxxx)
LOOP
aux := rec.VALUE;
UPDATE db
SET VALUE = TO_CLOB(deletexml(
xmltype(VALUE),
'//*:getPaymentDetailsResponse/*:Payment/*:childs[./*:status[text()="Failed"]]'
))
WHERE id=rec.gb_ID;
--Teste
IF DBMS_LOB.compare(rec.VALUE, aux) = 0 THEN
DBMS_OUTPUT.put_line('### ORDERS NOT CHANGED ###');
cnt1 := cnt1 + 1; --count orders without any change
DBMS_OUTPUT.put_line(cnt1 || '- ' || rec.ORDER_PUBLIC_ID);
ELSE
DBMS_OUTPUT.put_line('### ORDERS CHANGED ###');
cnt := cnt +1; --count changed orders
DBMS_OUTPUT.put_line(cnt || '- ' || rec.ORDER_PUBLIC_ID);
END IF;
END LOOP;
-- Print count results
DBMS_OUTPUT.put_line('Orders without changing: '|| cnt1 || ' orders.');
DBMS_OUTPUT.put_line('Orders updated: '|| cnt || ' orders.');
END;
/
这是我目前得到的:
订单未更改
1- 160000
订单未更改
2- 160000
订单未更改
3- 160313
订单未更改
4- 160313
我想发生什么:
订单已更改
1- 160000
订单未更改
2- 160000
订单已更改
3- 160313
订单未更改
4- 160313
创建游标时,它是运行选择时存在的数据的快照。 在游标执行期间所做的任何表更改都不会反映在游标中。请参阅数据库游标是否选取对基础数据的更改?了解更多详情。
因此,您更新了光标的基表(我假设您不显示实际的选择(
UPDATE db
SET VALUE = TO_CLOB(deletexml(
xmltype(VALUE),
'//*:getPaymentDetailsResponse/*:Payment/*:childs[./*:status[text()="Failed"]]'
))
WHERE id=rec.gb_ID;
然后使用光标中的详细信息进行比较
IF DBMS_LOB.compare(rec.VALUE, aux) = 0 THEN
由于游标是快照,因此它将始终返回为"未更改",因此您必须从基表中重新选择值,或者使用 SQL%ROWCOUNT 检查更新语句是否影响了任何行(请参阅 https://community.oracle.com/thread/2370954?start=0&tstart=0(,以获取有关如何使用它的详细信息。