如何从列数未知的存储过程中查看 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 游标从列数未知的表中选择 *