2012-11-23 63 views
0

可能重複:
Oracle Accessing updated records during the same transaction在存儲過程中使用遊標DELETE語句後

我有一個Oracle存儲過程有點像這樣(實際的sql語句是不同的)

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行可複製你發佈什麼它刪除行的98/SQL塊,在打開光標將返回只有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. 

現在,如果你打開遊標發出上前t他DELETE,遊標將返回被刪除的行。也許在你的實際代碼中,OPEN聲明在DELETE之前。

相關問題