首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在直接PL/SQL中调用返回引用游标的Oracle程序包过程

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

Stack Overflow用户
提问于 2010-10-20 04:14:11
回答 4查看 42.8K关注 0票数 4

我有一个从ASP.NET应用程序访问的Oracle10g数据库。尽管我曾在许多不同方面大量使用SQL Server和Oracle进行查询和报告,但这是我第一次使用Oracle作为应用程序的OLTP数据库。

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

代码语言:javascript
复制
-- 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

我假设这样做是为了让Oracle层能够使用来自输出参数的游标,我的理解是这是从.NET调用ADO.NET procs的可接受的最佳实践。

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-29 02:53:20

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

Easiest method to test an Oracle Stored Procedure

还有这里:

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

票数 1
EN

Stack Overflow用户

发布于 2010-10-20 04:43:29

看看OMG Ponies发布的链接,但你能做的是

代码语言:javascript
复制
    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中,我相信你可以在一个漂亮的网格中获得引用光标,而在developer中,你可以在文本中获得引用光标。

SQL Developer you can unit test as well

票数 3
EN

Stack Overflow用户

发布于 2010-10-20 05:24:05

试试这个:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3972338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档