REF CURSOR从过程中获取列



我有一个SQL开发人员正在运行的过程。它抽出了大约50根柱子。目前我正在处理一个bug,它正在更新其中一列。是否可以只显示结果中的X列?

我正在将其作为运行

VARIABLE cursorout REFCURSOR;
EXEC MY_PROC('-1', '-1', '-1', 225835, :cursorout);
PRINT cursorout;

理想情况下,我想打印出第20栏,所以我想做一些类似的事情

PRINT cursorout[20];

感谢

是否可以只显示结果中的列X?

没有额外编码,没有

正如@OldProgrammer在对您的问题的评论中所说,您可以使用dbms_sql包来描述列,并选择您喜欢的列。

但是,如果您知道列名,那么显示该列内容的最简单方法可能是使用XML函数,尤其是xmlsequence()extract()

不幸的是,我们无法将SQL*PLUS绑定变量作为参数传递给xmlsequence()函数,因此您可能会考虑将过程封装在一个函数中,该函数返回refcursor:

测试表:

create table t1(col, col2) as
select level
, level
from dual
connect by level <= 5;
SQL> select * from t1;
COL       COL2
---------- ----------
1          1
2          2
3          3
4          4
5          5

这里有一个简单的过程,它为我们打开了一个refcursor:

create or replace procedure p1(
p_cursor out sys_refcursor
) is
begin
open p_cursor for
select * from t1;
end;
/
Procedure created

这里是p1过程的函数包装器,它只执行该过程并返回refcursor:

create or replace function p1_wrapper
return sys_refcursor is
l_res sys_refcursor;
begin
p1(l_res);
return l_res;
end;
/
Function created

查询。提取路径为ROW/COL2/text(),其中COL2是要打印的列的名称。

select t.extract('ROW/COL2/text()').getstringval() as res
from table(xmlsequence(p1_wrapper)) t ;

结果:

RES                                                                             
--------
1                                                                               
2                                                                               
3                                                                               
4                                                                               
5                                                                               
5 rows selected.

在我看来,您可以在过程my_PROC中定义一个游标,并将更新的列放在游标中(例如20),然后返回游标。或者您只需要创建一个表来记录过程的每个执行结果。

最新更新