可能重复:
Oracle Accessing updated records during the same transaction
我的Oracle存储过程有点像这样(实际的sqls不同)
CREATE OR REPLACE PROCEDURE mysp
IS
v_copied_row table%ROWTYPE ;
CURSOR p_copied_rows IS
select *
from table ;
BEGIN
delete from table
where <some condition>
OPEN p_copied_rows ;
LOOP
FETCH p_copied_rows into v_copied_rows ;
<do something with fetched row>
END LOOP
close p_copied_rows;
END;
理想情况下,我希望删除的行不应该是我从游标中获取的结果集的一部分,但那些是。
我是oracle的新手,想知道我在这里做错了什么?
P.S。我要使用游标来处理一些复杂的事情,所以用SQL替换游标不是一种选择。
答案 0 :(得分:1)
如果您的实际代码与您发布的代码匹配,则您删除的行将不会被光标返回
如果我创建一个包含100行的表
SQL> ed
Wrote file afiedt.buf
1 create table foo
2 as
3 select level col1
4 from dual
5* connect by level <= 100
SQL> /
Table created.
然后创建一个PL / SQL块,复制你发布的删除98行的内容,打开的光标只返回2行
SQL> select count(*) from foo;
COUNT(*)
----------
100
SQL> declare
2 cursor non_deleted_rows
3 is select *
4 from foo;
5 l_rec foo%rowtype;
6 begin
7 delete from foo
8 where col1 <= 98;
9
10 open non_deleted_rows;
11 loop
12 fetch non_deleted_rows into l_rec;
13 exit when non_deleted_rows%notfound;
14
15 dbms_output.put_line( l_rec.col1 );
16 end loop;
17 end;
18 /
99
100
PL/SQL procedure successfully completed.
现在,如果在发出DELETE
之前打开游标,游标将返回已删除的行。也许在您的实际代码中,OPEN
语句位于DELETE
之前。