2013-07-15 32 views
1

我真的回避了我的问题的“最好”一词,但它确实是最合适的词。什么是从Oracle函数返回记录的标准方式?

从函数返回记录的最佳(最有效)方式是什么?

目前,我有这样的:

FUNCTION myFunct(param1 VARCHAR2) RETURN SYS_REFCURSOR AS 
    myCursor SYS_REFCURSOR; 
    BEGIN 
    OPEN myCursor FOR 
    SELECT * 
    FROM myTable 
    WHERE field = param1; 

    RETURN(myCursor); 
    END myFunct; 

我可以运行此罚款,但与其他一切我读像(表式,隐式游标等),我真搞不清楚什么是最合适的。

P.S.我从一个proc调用它后如何循环这个游标?

编辑: 我读过,我只能遍历游标ONCE(forums.oracle.com/thread/888365),但实际上我想多次循环内容。这是否意味着我选择使用关联数组呢?

+2

这取决于使用情况。你是否将数据返回给客户端应用程序?在你真实的代码中,你在做什么需要PL/SQL?如果没有,为什么不使用视图?你正在编写一个多阶段ETL过程吗?将'REF CURSOR'返回到另一块PL/SQL将是非常不寻常的。 –

+0

这个链接可能会帮助你http://stackoverflow.com/questions/4125992/how-to-return-a-refcursor-from-oracle-function – ajmalmhd04

+1

@JustinCave - “将REF CURSOR返回给另一个一块PL/SQL“。会吗?参考游标可以使用静态或动态SQL对结果集进行编程控制。这并不意味着我们可能想要在离散函数中封装程序控制,特别是在逻辑复杂的情况下。另外还有一个正常的用例:我们有几个不同的代码片段,都需要读取结果集。 – APC

回答

1
create or replace 
PACKAGE example_pkg AS 

    /* 
    ** Record and nested table for "dual" table 
    ** It is global, you can use it in other packages 
    */ 
    TYPE g_dual_ntt IS TABLE OF SYS.DUAL%ROWTYPE; 
    g_dual g_dual_ntt; 

    /* 
    ** procedure is public. You may want to use it in different parts of your code 
    */ 
    FUNCTION myFunct(param1 VARCHAR2) RETURN SYS_REFCURSOR; 

    /* 
    ** Example to work with a cursor 
    */ 
    PROCEDURE example_prc; 

END example_pkg; 

create or replace 
PACKAGE BODY example_pkg AS 

    FUNCTION myFunct(param1 VARCHAR2) RETURN SYS_REFCURSOR 
    AS 
     myCursor SYS_REFCURSOR; 
    BEGIN 
     OPEN myCursor FOR 
      SELECT dummy 
      FROM dual 
      WHERE dummy = param1; 

     RETURN(myCursor); 
    END myFunct; 

    PROCEDURE example_prc 
    AS 
     myCursor SYS_REFCURSOR; 
     l_dual g_dual_ntt; /* With bulk collect there is no need to initialize the collection */ 
    BEGIN 
     -- Open cursor 
     myCursor := myFunct('X'); 
     -- Fetch from cursor/all at onece 
     FETCH myCursor BULK COLLECT INTO l_dual; 
     -- Close cursor 
     CLOSE myCursor; 

     DBMS_OUTPUT.PUT_LINE('Print: '); 
     FOR indx IN 1..l_dual.COUNT LOOP 
      DBMS_OUTPUT.PUT_LINE('element: ' || l_dual(indx).dummy); 
     END LOOP; 
    END example_prc; 

END example_pkg; 

EXECUTE example_pkg.example_prc(); 

/* 
Print: 
element: X 
*/ 

请看看这个链接:http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php

您可能会发现它很有用...

+0

被接受为答案(唯一回答)。谢谢,并为链接也。 – Incognito

+0

@Kampai没有一种正确的方法来处理游标(SYS_REFCURSOR)。你可以从一个函数中返回它,或者设置为变量。它是由你决定。使用它的主要原因是你可能想要为不同的查询打开它,即:不同的条件。 –

相关问题