调用在直接PL / SQL中返回ref游标的Oracle包过程

时间:2010-10-19 20:14:11

标签: oracle stored-procedures ado.net oracle10g cursor

我有一个从ASP.NET应用程序访问的Oracle 10g数据库。虽然我在很多不同方面都使用过SQL Server,而Oracle却用于查询和报告,但这是我第一次将Oracle用作应用程序的OLTP数据库。

包中的数据库级过程通常采用以下形式:

-- TYPE refcur IS REF CURSOR;

PROCEDURE get_some_stuff(o_cursor OUT refcur, p_param1 IN INTEGER, p_param2 IN INTEGER) IS
BEGIN
    OPEN o_cursor FOR
    SELECT whatever
    FROM whatever
END

我认为这些都是以这种方式完成的,因为ADO.NET层能够使用输出参数中的游标,我理解这是从.NET调用Oracle procs的最佳实践。

例如,在SQL Server中,如果proc返回结果集(或多个结果集),我们没有显式的ref游标,可以在ADO.NET和SSMS中作为输出结果集访问,并且可以通过EXEC spname param1, param2来简单地测试SP。

我遇到的问题是我不知道如何在Toad中直接调用这些,例如,为了能够在转到应用程序之前先在PL / SQL级别测试更改。我非常习惯于在SQL Server中运行甚至重新混合存储过程和函数,以便能够重构数据库接口层,而不会影响应用程序级代码的外部接口。

4 个答案:

答案 0 :(得分:3)

查看OMG Ponies发布的链接,但您可以做的是

    var x refcursor;


declare

    PROCEDURE GET_SOME_STUFF(O_CURSOR OUT SYS_REFCURSOR, P_PARAM1 IN NUMBER, P_PARAM2 IN NUMBER) IS
    BEGIN
         OPEN O_CURSOR FOR
         SELECT LEVEL, p_param1 ,P_PARAM2  FROM DUAL CONNECT BY LEVEL < 3;
    END ;

BEGIN
GET_SOME_STUFF(:x , 5, 10); 
END;
/

PRINT X;

你几乎只是将它包装在一个将运行的匿名阻止广告中。我使用SQL Developer(强烈推荐,免费提供大量支持)或SQL plus,所以我无法帮助TOAD,但我希望它是相同的。在SQL Developer中(如果内存服务正确,则在SQL Navigator中),您只需右键单击所需的包/方法,它就会为您创建脚本。
在toad和navigator中我相信你可以将ref光标放在漂亮的网格中,而在开发人员中你可以用文本获取它。

SQL Developer you can unit test as well

答案 1 :(得分:2)

试试这个:

DECLARE
  aCursor       SYS_REFCURSOR;
  someVariable  SOME_TYPE;

  FUNCTION SOME_FUNC_RETURNING_A_CURSOR RETURN SYS_REFCURSOR IS
    csrLocal  SYS_REFCURSOR;
  BEGIN
    OPEN csrLocal FOR SELECT whatever FROM wherever;

    RETURN csrLocal;
  END SOME_FUNC_RETURNING_A_CURSOR;

BEGIN
  aCursor := SOME_FUNC_RETURNING_A_CURSOR;

  WHILE TRUE LOOP
    FETCH aCursor INTO someVariable;
    EXIT WHEN aCursor%NOTFOUND;

    ...do whatever with variables...
  END LOOP;

  COMMIT;
END;

分享并享受。

答案 2 :(得分:1)

在OMG Ponies提供的链接中找到了最佳解决方案:

Easiest method to test an Oracle Stored Procedure

在这里:

http://heather.koyuk.net/refractions/?p=343

答案 3 :(得分:1)

我找到了一种更简单的方法...尝试一下(这也会为你生成脚本)

在“过程编辑器”中,加载您的过程。点击闪电 要执行的螺栓,您将看到“设置参数”窗口,即 也可以通过Proc Editor工具栏上的按钮获得 图像类似于(...),旁边是闪电。点击 输出选项按钮,您将看到您的选项。如果这是一个弱的参考 然后你必须使用内存中的网格选项。结果去了 执行后,PE底部的光标结果选项卡。

http://toad.10940.n7.nabble.com/display-ref-cursor-in-toad-td1427.html