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

Posted

技术标签:

【中文标题】如何从列数未知的存储过程中查看 Toad 中结果集的内容?【英文标题】:How to view the content of a resultset in Toad from a stored procedure with unknown number of columns? 【发布时间】:2016-02-26 17:38:36 【问题描述】:

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

--Tsql 示例 执行 myproc parm1, parm2, parm3

现在我正在使用 PLsql 和 Toad(我对 Toad 比较陌生)。我需要查看一个复杂的存储过程的结果集的内容,而且我不知道列的数量是多少——更不用说它们的数据类型了(这个过程由几个奇怪的子查询组成——我可以单独查看,但它们会被旋转,并且最终结果集中的列数会有所不同)。当我不知道有多少列或它们的数据类型时,当我执行该过程时,如何在 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;

【问题讨论】:

什么版本的 Toad? 【参考方案1】:

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

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

    在模式浏览器中找到您的包,然后按右键单击,执行包。您将看到与 #1 中提到的相同的对话框。按照此处的剩余步骤操作。

    使用来自匿名块的绑定变量。使用您的示例,您会想要这样的东西...

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

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

【讨论】:

太棒了!我找到了另一种方法来做到这一点 - 不像你的方式那么酷,而是一种选择(这个不做旋转) 优秀。我找到了另一种方式——尝试发布它。【参考方案2】:

*** 不让我发布这个其他解决方案:

我尝试发布这个其他解决方案的一部分(如果 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;

【讨论】:

它是指向另一个站点的链接吗?我不知道为什么它不会让你发帖,但我知道强烈建议不要只发布指向其他网站的链接。例如,有一些博客建议使用 SQL*Plus“打印”命令,但不鼓励使用 Toad 的脚本引擎执行单个语句。【参考方案3】:

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

DECLARE 
x_out SYS_REFCURSOR; 

CURSOR get_columns IS 

...

【讨论】:

这是上半场的另一部分 --- SELECT t2.column_value.getrootelement() name, EXTRACTVALUE(t2.column_value, 'node()') VALUE 这里是另一条路的上半场的最后一部分--- 我似乎在发布表达式 xmlsequence(x_out) 时遇到问题,但这是另一种方法用来读取光标的类似内容 除非您需要在 PL/SQL 中使用结果,或者您只想手动编写代码,如果查看数据是您的唯一目标,我会让 Toad 自动处理它。毕竟,我假设您购买 Toad 是为了让您的生活更轻松!

以上是关于如何从列数未知的存储过程中查看 Toad 中结果集的内容?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种方法可以使用 android-sqlite 游标从列数未知的表中选择 *

如何在 TOAD 中查看存储过程的输出

如何在存储过程中直接使用另一个存储过程返回的数据集

在MySQL中如何创建一个带输出参数为一个表类型的存储过程

Toad for Oracle - 从列选项卡中复制列而不包含所有详细信息

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?