从函数取返回一个引用游标来记录(fetch from function returning a re

2019-06-25 12:42发布

我有一个返回REF CURSOR的记录的包的功能。 我试图从调用代码块这个功能。 调用代码如下所示:

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;

该函数声明为程序包的一部分,看起来是这样的:

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;

当我尝试运行调用的代码块,我得到异常:PLS-00386:类型不匹配发现在FETCH光标之间和到变量“EXAMPLE_SYMBOLS”。

我应该a_record的类型是,我怎么能访问我取(类型record_name)记录的各个元素?

Answer 1:

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

你的当前光标正在做的是获取一个单列,带单个列,包含函数调用的结果。 这是一个record_cursor不是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;


Answer 2:

该函数返回一个record_cursor ,所以我希望a_record也应该是record_cursor 。 为什么不能函数返回一个-但是,为什么你反正返回一个参考光标目前尚不清楚record_name类型呢?



Answer 3:

在PL / SQL块读出裁判光标看起来有点怪我。 甲骨文可能无法满足您的游标类型c_symbols与类型package_name.record_cursor

建议:

  • 改变的申报c_symbols为“ c_symbols package_name.record_cursor
  • 更换声明“ open c_symbols与” “ c_symbols := package_name.function_name('argument')

只要调用函数确实返回游标,应该工作。 否则,你可能要发布实际的源代码。



文章来源: fetch from function returning a ref cursor to record