如何使用 RefCursor 返回类型测试 Oracle 存储过程?

Posted

技术标签:

【中文标题】如何使用 RefCursor 返回类型测试 Oracle 存储过程?【英文标题】:How to test an Oracle Stored Procedure with RefCursor return type? 【发布时间】:2011-10-10 13:09:39 【问题描述】:

我正在寻找有关如何在 SQL Developer 或 Embarcardero Rapid XE2 中测试 Oracle 存储过程的良好解释。谢谢。

【问题讨论】:

【参考方案1】:

这样的事情可以让您在几乎任何客户端上测试您的程序:

DECLARE 
  v_cur SYS_REFCURSOR;
  v_a   VARCHAR2(10);
  v_b   VARCHAR2(10);
BEGIN
  your_proc(v_cur);

  LOOP
    FETCH v_cur INTO v_a, v_b;
    EXIT WHEN v_cur%NOTFOUND;
    dbms_output.put_line(v_a || ' ' || v_b);
  END LOOP;
  CLOSE v_cur;
END;

基本上,您的测试工具需要支持SYS_REFCURSOR 变量的定义以及在传入您定义的变量时调用过程的能力,然后循环遍历游标结果集。 PL/SQL 可以做到这一切,匿名块易于设置和维护,适应性强,并且对于任何使用 PL/SQL 的人来说都非常易读。

另一种虽然类似的方法是构建一个执行相同操作的命名过程,并假设客户端有一个调试器(如 SQL Developer、PL/SQL Developer、TOAD 等),然后您可以逐步执行.

【讨论】:

请原谅我这个 Oracle SQL Browser 的新用户。如果游标返回很多列,如何让游标显示所有列而不先指定所有输出列? DECLARE 语句之前使用SET SERVEROUTPUT ON;【参考方案2】:

类似

create or replace procedure my_proc( p_rc OUT SYS_REFCURSOR )
as
begin
  open p_rc
   for select 1 col1
         from dual;
end;
/

variable rc refcursor;
exec my_proc( :rc );
print rc;

将在 SQL*Plus 或 SQL Developer 中工作。我没有任何使用 Embarcardero Rapid XE2 的经验,所以我不知道它是否支持这样的 SQL*Plus 命令。

【讨论】:

【参考方案3】:

在 SQL Developer 中,您可以右键单击包主体,然后选择 RUN。 “运行 PL/SQL”窗口将让您编辑 PL/SQL 块。单击“确定”将为您提供一个标题为“输出变量 - 日志”的窗口窗格,其中包含一个输出变量选项卡。您可以在左侧选择输出变量,结果显示在右侧。非常方便快捷。

我已将 Rapid 与 T-SQL 结合使用,我认为这与此类似。

编写您自己的 delcare-begin-end 脚本并在其中循环遍历光标,就像 DCookie 的示例一样,时不时地做一个很好的练习。它适用于任何东西,您将知道您的代码有效。

【讨论】:

我知道通过右键单击运行包,这在大多数情况下都很棒。但我也只需要一种从 SQL 窗口在 sql 中运行它的方法。与 SQL Server 相比,这非常困难。我花费数小时、数小时和数小时试图做任何事情。 我非常同意@Sam。我相信甲骨文的设计使事情变得更难做。例如,在我们从对话框窗口输入运行存储过程所需的所有内容后,SQL Developer 可以轻松地显示 PL SQL 脚本。但是相反,它只向我们展示了结果,而我们初学者仍然不知道如何手工制作脚本来执行 PL SQL 块中的过程。 更不用说 Oracle 错误消息了。他们太奇怪了。例如,如果您在插入语句中的列名中有拼写错误,则会收到 ORA-00984 错误,显示“此处不允许列”。老兄,“无效列”或“列无效”不是更有意义吗? 谢谢。 PL/Sql 是一门垃圾语言。 谢谢大家。也绝对是我的看法。 Oracle 曾经可能是最好的数据库,但今天,SQL Server 和 Postgres 在性能(参见最近的基准测试)和开发人员友好性方面都变得更好了。难怪 Oracle 开发人员的成本要高得多,如果他们需要学习如何手动循环游标来执行诸如执行过程之类的基本操作。难以置信。【参考方案4】:
create or replace procedure my_proc(  v_number IN number,p_rc OUT SYS_REFCURSOR )
as
begin
open p_rc
for select 1 col1
     from dual;
 end;
 /

然后编写一个函数 lie this 调用你的存储过程

 create or replace function my_proc_test(v_number IN NUMBER) RETURN sys_refcursor
 as
 p_rc sys_refcursor;
 begin
 my_proc(v_number,p_rc);
 return p_rc;
 end
 /

然后您可以在 SQLDeveloper 编辑器中运行此 SQL 查询。

 SELECT my_proc_test(3) FROM DUAL;

您将在控制台中看到结果,右键单击它并在单个记录视图上单击并编辑结果,您可以看到参考光标返回的所有记录。

【讨论】:

【参考方案5】:

在 Toad 10.1.1.8 中,我使用:

variable salida refcursor
exec MY_PKG.MY_PRC(1, 2, 3, :salida)  -- 1, 2, 3 are params
print salida

然后,作为脚本执行。

【讨论】:

【参考方案6】:

我认为这个链接对你来说已经足够了。我是在寻找执行oracle程序的方法时发现的。

The link to the page

简短说明:

--cursor variable declaration 
variable Out_Ref_Cursor refcursor;
--execute procedure 
execute get_employees_name(IN_Variable,:Out_Ref_Cursor);
--display result referenced by ref cursor.
print Out_Ref_Cursor;

【讨论】:

以上是关于如何使用 RefCursor 返回类型测试 Oracle 存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

测试在 DataGrip 中返回 sys-refcursor 的 Oracle 函数

在 SYS_REFCURSOR 中执行动态 sql 语句

关于Oracle游标out参数多层调用的BUG,ORA-06504

如何让 refcursor 结果/输出显示为文本?

PL/SQL: ORA-29481: 隐式结果不能返回给客户端

如何从 Java 中的 oracle SP 返回 sys_refcursor?