sql - 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
其用于该类型的声明变量是一种方法。但是,我要删除的这个表有几列,这样做会给我带来很多复杂性,以便将其投入生产。
有没有更简单的方法从过程中的删除返回所有行?
解决方案
...这样做会给我带来很多复杂性
恐怕你只能接受它。
这是一个如何做到这一点的例子。
样品表;我将删除工资高于 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>
推荐阅读
- python - 在无服务器 Lambda 函数中访问 /tmp 或其他临时文件结构
- wso2 - WSO2APIM:API 失败,错误消息为 - 状态 = 消息已分派到主序列。无效的 URL。,RESOURCE =
- wordpress - Wordpress 的路由算法
- java - 为什么使用 containerGroup 会阻止我的其他侦听器工作?
- python - 如何加快pyqtgraph中的实时绘图
- oracle - 如何安装两个oracle版本,11g和12c?
- android - DP而不是PX应该保持大小还是改变它?
- reactjs - 有没有办法在使用历史重定向后保持状态
- python - 输出无而不是值
- excel - 解决 Excel 中生成的 .Bat 的 VBA 类型不匹配问题