0

重複の可能性:
Oracle 同じトランザクション中に更新されたレコードにアクセスする

私はこのような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;

理想的には、削除された行がカーソルからフェッチしている結果セットの一部であってはならないことを期待していますが、それらはそうです。

私はオラクルが初めてで、ここで何か間違っているかどうかを知りたいですか?

PSいくつかの複雑なことにカーソルを使用する必要があるため、カーソルをSQLに置き換えることはオプションではありません。

4

1 に答える 1

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.

于 2012-11-23T07:29:35.410 に答える