如何从具有未知列数的存储过程中查看Toad中结果集的内容?

时间:2016-02-26 17:38:36

标签: stored-procedures plsql toad

在Tsql中,我可以在查询分析器中执行存储过程,并在查询分析器窗口中查看结果集的内容,而不了解查询结构(表,列,...)

- Tsql示例 exec myproc parm1,parm2,parm3

现在我正在使用PLsql和Toad(我对Toad来说相对较新)。我需要查看一个复杂的存储过程的结果集的内容,我不知道列的数量是什么 - 更不用说他们的数据类型了(这个proc由几个怪异的子查询组成 - 我可以单独查看,但是它们被转动,并且列数在最终结果集中变化)。当我不知道有多少列或它们的数据类型时,如何在执行该过程时在Toad中查看此结果集的内容?

下面是我一起聚集的代码,用于查看存储过程结果集的内容,其中我知道有多少列及其数据类型提前。在下面的代码示例中,我使用了一个名为x_out的sys_refcursor,并且还创建了一个临时表来存储结果集的内容以供其他查看。当我不知道结果集中有多少列时,有没有办法可以做到这一点?如何使用PLsql - Toad?

create global temporary table tmpResult (fld1 number, fld2 varchar(50), fld3 date);

declare
  x_out sys_refcursor;  
  tmpfld1 number;
  tmpfld2 varchar2(50);
  tmpfld3 date;

BEGIN
  myschema.mypkg.myproc(parm1, parm2, x_out);

LOOP
    FETCH x_out INTO tmpfld1, tmpfld2, tmpfld3;
    DBMS_OUTPUT.Put_Line ('fld1:-- '||tmpfld1||': fld2:-- '||tmpfld2||':   fld3:-- '||tmpfld3);

-- I also insert the result set to a temp table for additional viewing of the data from the stored procedure

    Insert Into tmpResult values(tmpfld1, tmpfld2, tmpfld3);        
    EXIT WHEN x_out%NOTFOUND;    

END LOOP;

END;

3 个答案:

答案 0 :(得分:0)

Toad可以自动为您检索光标。你有几个选择,如果你只想查看数据,#3可能是最简单的。

  1. 如果你在编辑器中加载了myschema.mypkg,你可以点击 F11 来执行它。在显示的对话框中,选择左侧的包成员,然后选择“输出选项”选项卡。检查获取游标结果的选项或使用DBMS输出选项。单击“确定”,然后执行包。根据您的Toad版本,您将在编辑器底部看到结果的网格,或者您将看到PL / SQL结果选项卡。如果您看到后者双击输出列的输出参数中的(CURSOR)值。我建议使用fetch选项,只要你的数据集不是那么大就会导致Out of Memory错误。

  2. 在模式浏览器中找到您的软件包,然后单击“执行软件包”。您将看到#1中提到的相同对话框。按照那里的其余步骤进行操作。

  3. 使用匿名块中的绑定变量。使用你的例子,你想要这样的东西......

    declare x_out sys_refcursor; begin myschema.mypkg.myproc(parm1, parm2, x_out); :retval := x_out; end;

  4. 在编辑器中使用 F9 执行此操作。在“绑定变量”弹出窗口中,将retval的数据类型设置为Cursor。单击确定。然后,您的结果将显示在数据网格中。再次,如果您的数据集非常大,您可能会在这里耗尽内存。

答案 1 :(得分:0)

StackOverflow不允许我发布其他解决方案:

我尝试发布其他解决方案的一部分(如果SOF允许我) - 这是另一种方式的下半部分:

BEGIN 
myschema.mypkg.myproc(parm1, parm2, parm3 x_out); 

FOR rec_ IN get_columns LOOP 
  DBMS_OUTPUT.put_line(rec_.name || ': ' || rec_.VALUE); 
END LOOP;   
END;

答案 2 :(得分:0)

这是另一种方式的上半部分:

DECLARE 
x_out SYS_REFCURSOR; 

CURSOR get_columns IS 

...