如何从返回参考光标的Oracle过程获得格式良好的结果?

在MS sql Server中,如果我想检查存储过程的结果,我可能会在Management Studio中执行以下操作.
--sql SERVER WAY
exec sp_GetQuestions('OMG Ponies')

结果窗格中的输出可能如下所示.

ID    Title                                             ViewCount   Votes 
----- ------------------------------------------------- ---------- --------
2165  Indexed View vs Indexes on Table                  491         2  
5068  sql Server equivalent to Oracle’s NULLS FIRST     524         3 
1261  Benefits Of Using sql Ordinal Position Notation?  377         2 

(3 row(s) affected)

无需编写循环或PRINT语句.

要在Oracle中执行同样的操作,我可能会在sql Developer中执行以下匿名块

--ORACLE WAY
    DECLARE
        OUTPUT  MYPACKAGE.refcur_question;
        R_OUTPUT MYPACKAGE.r_question;
        USER    VARCHAR2(20);

BEGIN

  dbms_output.enable(10000000);
  USER:= 'OMG Ponies';
  recordCount := 0;



  MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT,p_USER=> USER,) ;




  DBMS_OUTPUT.PUT_LINE('ID |  Title | ViewCount | Votes' );

  LOOP 
    FETCH OUTPUT
    INTO R_OUTPUT;

         DBMS_OUTPUT.PUT_LINE(R_OUTPUT.QUESTIONID || '|' || R_OUTPUT.TITLE 
               '|' || R_OUTPUT.VIEWCOUNT '|' || R_OUTPUT.VOTES);
          recordCount := recordCount+1;




 EXIT WHEN OUTPUT % NOTFOUND;  
      END LOOP;
      DBMS_OUTPUT.PUT_LINE('Record Count:'||recordCount);
      CLOSE OUTPUT;


    END;

这样输出

ID|Title|ViewCount|Votes 
2165|Indexed View vs Indexes on Table|491|2  
5068|sql Server equivalent to Oracle’s NULLS FIRST|524|3 
1261|Benefits Of Using sql Ordinal Position Notation?|377|2 
Record Count: 3

所以sql版本有1行,而oracle有18行,输出是丑的.如果有很多列和/或数据是数字的,它会加剧.

对我来说这是奇怪的是,如果我在sql Developer或Management studio中写这个语句

SELECT 
ID,Title,ViewCount,Votes
FROM votes where user = 'OMG Ponies'

结果相当相似.这让我觉得我是缺少技术或使用错误的工具.

如果GetQuestions是一个返回refcursor的函数,这似乎是您在sql Server版本中的,那么您可能会这样做:
select * from table(MyPackage.GetQuestions('OMG Ponies'));

或者如果您需要在PL / sql块中,那么您可以在游标中使用相同的选择.

您也可以使该函数产生dbms_output语句,因为它们始终可用于调试,尽管这增加了一些开销.

编辑

嗯,不知道是否可以将返回的refcursor转换成可用的类型,除非你愿意在包之外声明自己的类型(和类型的表).你可以这样做,只是为了转储结果:

create package mypackage as
    function getquestions(user in varchar2) return sys_refcursor;
end mypackage;
/

create package body mypackage as
    function getquestions(user in varchar2) return sys_refcursor as
        r sys_refcursor;
    begin
        open r for
            /* Whatever your real query is */
            select 'Row 1' col1,'Value 1' col2 from dual
            union
            select 'Row 2','Value 2' from dual
            union
            select 'Row 3','Value 3' from dual;
            return r;
    end;
end mypackage;
/

var r refcursor;
exec :r := mypackage.getquestions('OMG Ponies');
print r;

您可以使用另一个过程或函数中的调用结果;它只是在PL / sql外面看起来有点棘手.

编辑添加:使用这种方法,如果它是一个程序,你可以做同样的事情:

var r refcursor;
exec mypackage.getquestions(:r,'OMG Ponies');
print r;

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...