REF CURSOR从程序中获取一列

时间:2014-01-06 14:12:48

标签: sql oracle stored-procedures oracle10g

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

我正在以

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

理想情况下,我想要打印出第20栏,所以想做类似

的事情
 PRINT cursorout[20];

由于

2 个答案:

答案 0 :(得分:2)

  

可以从结果中显示第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.

答案 1 :(得分:0)

在我看来,你可以在程序MY_PROC中定义一个游标,并在游标中放置哪一列(例如20),然后返回游标。或者你只需​​创建一个表来记录你程序的每个执行结果