Oracle pl/sql 将保存 sql 文本的变量分配给 sys_refcursor 并循环遍历记录

问题描述

我有下面的代码,其中函数 ReturnSysRef 返回 SYS_REFCURSOR,该函数sql 文本保存在一个变量中,然后打开该变量的 SYS_REFCURSOR 并返回它。函数 MyFunc 是一个流水线函数,它调用 ReturnSysRef 循环遍历记录,然后返回明确定义的记录。问题是当我尝试调用流水线函数时,我只能返回列标题而不是数据。

CREATE OR REPLACE PACKAGE MyPackage IS
   
    type MyRecords is record
    (
        Col1   varchar2,Col2   varchar2,Col3   varchar2
    );    
    
    type MyList is table of MyRecord;
    function MyFunc return MyList pipelined;
    function ReturnSysRef return SYS_REFCURSOR;
END;
/
CREATE OR REPLACE package body MyPackage is
function MyFunc return MyList pipelined is
    
       l_row MyRecord;
       l_ref SYS_REFCURSOR;
    begin
        
        l_ref:=ReturnSysRef;
          LOOP 
            FETCH l_ref
            INTO  l_row.col1,l_row.col2,l_row.col3;;
            EXIT WHEN l_ref%NOTFOUND;
            pipe row(l_row);
          END LOOP;
          CLOSE l_ref;
    
    <<Proc_Exit>>
        return;
    Exception
        When others then
            return;
    end MyFunc;
    
    
function ReturnSysRef return SYS_REFCURSOR is
    l_sqlqry varchar2(50);
    l_ref SYS_REFCURSOR;
    begin
    
        l_sqlqry:='select ''val1'' as col1,''val2'' as col2,''val3'' as col3 from dual;';
        
        open l_ref for
        l_sqlqry;
        
        return l_ref;
    end ReturnSysRef;
end;
/

当我执行下面的查询时,它不返回任何数据,而我希望它返回“val1、val2、val3”。

select * From table(mypackage.Myfunc);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)