首页 > 解决方案 > Oracle - 从过程中返回 OUT SYS_REFCURSOR 的最佳方法,其中所有行和列都从表中删除

问题描述

我想做这样的事情:

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其用于该类型的声明变量是一种方法。但是,我要删除的这个表有几列,这样做会给我带来很多复杂性,以便将其投入生产。

有没有更简单的方法从过程中的删除返回所有行?

标签: sqloraclestored-procedures

解决方案


...这样做会给我带来很多复杂性

恐怕你只能接受它。

这是一个如何做到这一点的例子。

样品表;我将删除工资高于 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>

推荐阅读