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

时间:2009-07-09 21:27:46

标签: 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;

作为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;

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

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

3 个答案:

答案 0 :(得分:7)

我怀疑您认为您的光标应该从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;

答案 1 :(得分:0)

该函数返回record_cursor,因此我希望a_record也应该是record_cursor。但是,不清楚为什么要返回引用游标 - 为什么函数不能返回record_name类型呢?

答案 2 :(得分:0)

读取ref光标的pl / sql块对我来说有点奇怪。 Oracle可能无法将光标c_symbols的类型与类型package_name.record_cursor匹配。

建议:

  • c_symbols的声明更改为“c_symbols package_name.record_cursor
  • 将语句“open c_symbols”替换为“c_symbols := package_name.function_name('argument')

只要被调用的函数确实返回了游标,那应该可行。 否则,您可能想发布实际的源代码。