我有一个返回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)记录的各个元素?
我怀疑你认为光标应从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;
该函数返回一个record_cursor
,所以我希望a_record
也应该是record_cursor
。 为什么不能函数返回一个-但是,为什么你反正返回一个参考光标目前尚不清楚record_name
类型呢?
在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')
只要调用函数确实返回游标,应该工作。 否则,你可能要发布实际的源代码。