Oracle - 从过程 return OUT SYS_REFCURSOR 中删除所有行和列的最佳方法 table

Oracle - best way to return from a procedure an OUT SYS_REFCURSOR with all the rows and columns deleted from a table

我想做这样的事情:

create or replace procedure get_deleted_rows(result_set OUT SYS_REFCURSOR) is
begin
 delete from table1
 where start_date >= sysdate - 30 and start_date <= sysdate
 returning * bulk collect into result_set;
end;

我看到创建类型 table of... 并将 bulk collect 用于此类型的已声明变量是一种可行的方法。但是,我要删除的这个 table 有几个列,这样做会为我将其投入生产带来很多复杂性。

是否有更简单的方法return 从过程中删除所有行?

... and doing this would generate a lot of complexity for me

恐怕你只能接受了。

这是一个如何操作的示例。

样本table;我将删除工资高于 2000 的员工的行。

SQL> select * from test order by sal;

ENAME             SAL STARS
---------- ---------- ----------
SMITH             800
JAMES             950
ADAMS            1100 *
WARD             1250 *
MARTIN           1250 *
TURNER           1500 *
ALLEN            1600 *
BLAKE            2850 **        --> delete Blake, Jones and Scott
JONES            2975 **
SCOTT            3000 ***

10 rows selected.

让我们开始吧:

SQL> create or replace type t_row is object
  2    (ename varchar2(10), sal number, stars varchar2(10));
  3  /

Type created.

SQL> create or replace type t_tab as table of t_row;
  2  /

Type created.

程序:

SQL> create or replace procedure p_test (par_rc out sys_refcursor)
  2  is
  3    l_tab t_tab;
  4  begin
  5    delete from test
  6    where sal > 2000
  7    returning t_row(ename, sal, stars) bulk collect into l_tab;
  8
  9    open par_Rc for select * from table (l_tab);
 10  end;
 11  /

Procedure created.

测试:

SQL> var l_rc refcursor
SQL>
SQL> exec p_test(:l_rc);

PL/SQL procedure successfully completed.

SQL> print l_rc

ENAME             SAL STARS
---------- ---------- ----------
JONES            2975 **                   --> Deleted, as expected
BLAKE            2850 **
SCOTT            3000 ***
    

还剩什么?

SQL> select * from test order by sal;

ENAME             SAL STARS
---------- ---------- ----------
SMITH             800
JAMES             950
ADAMS            1100 *
WARD             1250 *
MARTIN           1250 *
TURNER           1500 *
ALLEN            1600 *

7 rows selected.

SQL>