【问题标题】:Fetch and bulk collect from a REF CURSOR returned by a procedure从过程返回的 REF CURSOR 获取和批量收集
【发布时间】:2013-11-02 23:08:03
【问题描述】:

我有一个以SYS_REFCURSOR 作为OUT 参数的存储过程。签名例如如下:

PROCEDURE myProc(p_someID IN INTEGER, p_cursor OUT SYS_REFCURSOR);

我从一个函数调用这个过程,我必须将一个名为 clientID 的列从 p_cursor 复制到一个标量嵌套表。

我的做法如下:

CREATE OR REPLACE FUNCTION myFunction
    RETURN sys_refcursor
IS
    someID      INTEGER       := 1234;
    myCursor    SYS_REFCURSOR;
    TYPE t_clientID_nt IS TABLE OF NUMBER(16,0);
    clientID_nt t_clientID_nt;
    otherID     SYS_REFCURSOR;
BEGIN
    myProc (someID, myCursor);
    FOR i IN myCursor
    LOOP
        clientID_nt.EXTEND;
        clientID_nt (clientID_nt.COUNT) := i.clientID;
    END LOOP;


    -- Other code that opens the cursor otherID
    -- based on the IDs in clientID_nt
    ...
    ... 
    RETURN otherID;
END;
/

当我尝试编译这个函数时,我得到的错误是:

PLS-00221: 'CLIENTID_NT' is not a procedure or is undefined

它位于代码的第 11 行。

非常感谢任何有关如何从此类游标中获取和批量收集的帮助。

【问题讨论】:

    标签: oracle plsql oracle11g cursor oracle11gr2


    【解决方案1】:

    不允许在 for 游标循环 (FOR i IN myCursor) 中使用游标变量。您必须一次显式地从游标变量中获取一行,例如使用FETCH INTO 语句和常规循环语句或使用FETCH BULK COLLECT INTO 来填充集合。例如:

    SQL> declare
      2    TYPE t_clientID_nt IS TABLE OF dual%rowtype;
      3    clientID_nt t_clientID_nt;
      4  
      5    l_cur sys_refcursor;
      6  
      7    procedure OpenAndPopulateCursor(p_cur in out sys_refcursor) is
      8    begin
      9      open p_cur for
     10        select *
     11         from dual;
     12    end;
     13  
     14  begin
     15    OpenAndPopulateCursor(l_cur);
     16  
     17    if l_cur%isopen
     18    then
     19      fetch l_cur bulk collect into clientID_nt;
     20    end if;
     21  
     22    dbms_output.put_line(concat( to_char(clientID_nt.count) 
     23                               , ' record(s) has/have been fetched.'));
     24  end;
     25  /
    
     1 record(s) has/have been fetched.
    
     PL/SQL procedure successfully completed
    

    【讨论】:

    • @Rachcha 你知道引用游标返回的类型(有多少列以及每列的数据类型)吗?您可能可以通过探索myProc 过程的源代码来获取该信息。如果您知道类型并且它与some_table%rowtype 不同,那么您可以声明一个记录类型,该类型具有与引用游标包含的字段一样多的字段,并且这些字段具有兼容的数据类型。
    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 2012-01-23
    • 2022-07-21
    • 2012-01-13
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多