Plsql 使用dbms_lob.compare比较CLOB,没有得到我想要的结果
不用于使用dbms_lob.compare,因此更新工作正常,但是当它到达IF语句时,看起来像只在支持替换时执行相同的操作,如下图所示 我的PL/SQL代码:Plsql 使用dbms_lob.compare比较CLOB,没有得到我想要的结果,plsql,Plsql,不用于使用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;
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创建光标时,它是运行select时存在的数据的快照。在游标执行期间所做的任何表更改都不会反映在游标中。有关更多详细信息,请参阅 因此,您需要更新光标的基表(我假设您没有显示实际的select) 然后使用光标中的详细信息进行比较
IF DBMS_LOB.compare(rec.VALUE, aux) = 0 THEN
由于光标是一个快照,它将始终以未更改的状态返回,因此必须从基表中重新选择该值,或使用SQL%ROWCOUNT检查更新状态是否影响任何行(请参阅),以了解如何使用该值的详细信息 欢迎来到堆栈溢出。您能否澄清您看到的行为以及您期望/希望看到的行为?
IF DBMS_LOB.compare(rec.VALUE, aux) = 0 THEN