在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;
答案 0 :(得分:0)
Toad可以自动为您检索光标。你有几个选择,如果你只想查看数据,#3可能是最简单的。
如果你在编辑器中加载了myschema.mypkg,你可以点击 F11 来执行它。在显示的对话框中,选择左侧的包成员,然后选择“输出选项”选项卡。检查获取游标结果的选项或使用DBMS输出选项。单击“确定”,然后执行包。根据您的Toad版本,您将在编辑器底部看到结果的网格,或者您将看到PL / SQL结果选项卡。如果您看到后者双击输出列的输出参数中的(CURSOR)值。我建议使用fetch选项,只要你的数据集不是那么大就会导致Out of Memory错误。
在模式浏览器中找到您的软件包,然后单击“执行软件包”。您将看到#1中提到的相同对话框。按照那里的其余步骤进行操作。
使用匿名块中的绑定变量。使用你的例子,你想要这样的东西......
declare
x_out sys_refcursor;
begin
myschema.mypkg.myproc(parm1, parm2, x_out);
:retval := x_out;
end;
在编辑器中使用 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
...