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

Rya*_*sch 36 oracle stored-procedures ref-cursor rapidsql plsqldeveloper

我正在寻找关于如何在SQL Developer或Embarcardero Rapid XE2中测试Oracle存储过程的一个很好的解释.谢谢.

Jus*_*ave 63

就像是

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;
Run Code Online (Sandbox Code Playgroud)

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


DCo*_*kie 21

这样的东西可以让你在几乎任何客户端上测试你的程序:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请原谅我这位Oracle SQL Browser的新用户.如果游标返回许多列,我们如何让光标显示所有列而不首先指定所有输出列? (2认同)

Gle*_*ark 10

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

我使用了Rapid with T-SQL,我觉得有类似的东西.

编写自己的delcare-begin-end脚本循环浏览光标,就像在DCookie的例子中一样,总是一个很好的练习.它可以处理任何事情,你会知道你的代码是有效的.

  • 我知道通过右键单击运行包,这在大多数情况下是很好的.但我还需要一种从SQL窗口在sql中运行它的方法.与SQL Server相比,这是非常困难的.我花了几个小时,几个小时才想做任何事情. (4认同)
  • 我非常同意@Sam。我相信这是设计使Oracle变得更难做。例如,在我们从对话框窗口输入运行存储过程所需的所有信息之后,SQL Developer可以轻松显示PL SQL脚本。但是,相反,它仅向我们显示了结果,而我们的初学者仍然不知道如何手工编写脚本以执行PL SQL块中的过程。 (2认同)
  • 更不用说Oracle错误消息。他们是如此离奇。例如,如果您在插入语句中的列名中有错字,则会出现ORA-00984错误,提示“此处不允许列”。杜德(Dude),“无效列”或“无效列”更有意义吗? (2认同)

use*_*468 5

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;
 /
Run Code Online (Sandbox Code Playgroud)

然后编写一个函数,它调用您的存储过程

 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
 /
Run Code Online (Sandbox Code Playgroud)

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

 SELECT my_proc_test(3) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

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


Her*_*lez 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
Run Code Online (Sandbox Code Playgroud)

然后,以脚本执行。


Shi*_*rma 5

我想这个链接对你来说就足够了。我在寻找执行oracle程序的方法时发现的。

页面链接

简短的介绍:

--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;
Run Code Online (Sandbox Code Playgroud)