从函数获取返回ref光标到记录

nee*_*esh 4 sql oracle plsql oracle10g

我在一个包中有一个函数,它将REF CURSOR返回给RECORD.我试图从代码块调用此函数.调用代码如下所示:

declare      
   a_record package_name.record_name; 
   cursor c_symbols is select package_name.function_name('argument') from dual;

begin 
   open c_symbols;   
   loop            
        fetch c_symbols into a_record;
        exit when c_symbols%notfound;              
   end loop;
   close c_symbols; 
end;
Run Code Online (Sandbox Code Playgroud)

作为package_name的一部分的函数声明如下所示:

TYPE record_name IS RECORD(
      field_a       varchar2(20);
);

TYPE record_cursor IS REF CURSOR RETURN record_name;

FUNCTION getsymbols(argument IN varchar2) return record_cursor;
Run Code Online (Sandbox Code Playgroud)

当我尝试运行调用代码块时,我得到异常:PLS-00386:在FETCH游标和INTO变量之间的'EXAMPLE_SYMBOLS'处找到类型不匹配.

a_record的类型应该是什么以及如何访问我正在获取的记录的各个元素(类型为record_name)?

Dav*_*sta 7

我怀疑你认为你的光标应该是从REFCURSOR获取行.不是.REFCURSOR本身就是一个游标,你不使用另一个游标来从中进行选择.

当前游标正在执行的操作是获取包含函数调用结果的单个行.哪个record_cursor不是a record_name,所以你得到的类型不匹配.

我怀疑你真正想要做的是这样的事情:

declare
  symbol_cursor  package_name.record_cursor;
  symbol_record  package_name.record_name;
begin
  symbol_cursor := package_name.function_name('argument');
  loop
    fetch symbol_cursor into symbol_record;
    exit when symbol_cursor%notfound;

    -- Do something with each record here, e.g.:
    dbms_output.put_line( symbol_record.field_a );

  end loop;

  CLOSE symbol_cursor;

end;
Run Code Online (Sandbox Code Playgroud)