我在一个包中有一个函数,它将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)?
答案 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')
”只要被调用的函数确实返回了游标,那应该可行。 否则,您可能想发布实际的源代码。