代码之家  ›  专栏  ›  技术社区  ›  Cade Roux

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

  •  4
  • Cade Roux  · 技术社区  · 14 年前

    我有一个Oracle 10g数据库,可以从ASP.NET应用程序访问。尽管我在许多不同的方面大量使用了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过程的可接受的最佳实践。

    例如,在SQL Server中,我们没有显式的ref游标,如果一个过程返回一个结果集(或多个结果集),则可以在ADO.NET和SSMS中作为输出结果集进行访问,您只需执行以下操作即可测试SP EXEC spname param1, param2 .

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

    4 回复  |  直到 10 年前
        1
  •  3
  •   Harrison    14 年前

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

        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光标,而在developer中,您可以在文本中获取它。

    SQL Developer you can unit test as well

        2
  •  2
  •   Bob Jarvis - Слава Україні    14 年前

    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;
    

    分享和享受。

        4
  •  1
  •   Zeus    11 年前

    我找到了一个更简单的方法…试试看(这也会为你生成脚本)

    点击执行,您将看到设置参数窗口,它是 上面的图片和闪电旁边的(…)相似。点击 输出选项按钮,您将看到您的选项。如果这是个弱裁判 然后必须使用内存中的网格选项。结果转到 执行之后,PE底部的游标结果选项卡。

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