我有许多游标都返回具有相同字段的行:一个数字 ID 字段和一个 XMLType 字段。每次我访问这些游标之一(每个游标现在都有自己的访问功能)时,我都会经历相同的模式:
--query behind cursor is designed to no more than one row.
for rec in c_someCursor(in_searchKey => local_search_key_value) loop
v_id := rec.ID
v_someXMLVar := rec.XMLDataField
end loop;
if v_someXMLVar is null then
/* A bunch of mostly-standard error handling and logging goes here */
end if;
exception
/* all cursor access functions have the same error-handling */
end;
随着模式变得更加明显,将其集中在一个函数中是有意义的:
function fn_standardCursorAccess(in_cursor in t_xmlCursorType, in_alt in XMLType) return XMLType is
v_XMLData XMLType;
begin
dbms_application_info.set_module(module_name => $$PLSQL_UNIT, action_name => 'fn_standardCursorAccess');
loop
fetch in_cursor
into v_XMLData;
exit when in_cursor%notfound;
end loop;
/*some additional standard processing goes here*/
return v_XML;
exception
/*standard exception handling happens here*/
end;
我遇到的问题是调用这个函数。我现在必须这样称呼它:
open v_curs for select /*blah blah blah*/ where key_field = x and /*...*/;
v_data := fn_standardCursorAccess(v_curs,alt);
close v_curs;
我想做的是这样称呼它:
open v_curs for c_getSomeData(x);
v_data := fn_standardCursorAccess(v_curs,alt);
close v_curs;
...原因是要尽量减少对我的代码的更改量(我不想将所有这些游标剪切/粘贴到依赖它们的函数,并且在多个函数依赖于同一个游标的情况下,我必须将它包装在一个新函数中)。
不幸的是,这不起作用,Oracle 返回一个错误说
Error: PLS-00222: no function with name 'C_GETSOMEDATA' exists in this scope
我想要做的甚至可能吗?
(Oracle 版本为 10.2)
编辑: 我认为描述我正在做的更好的方法是将显式游标的引用传递给一个函数,该函数将对游标返回的数据执行一些常见的例程。看来我不能使用带有显式游标的 open-for 语句,有没有其他方法可以获取对显式游标的引用,以便我可以将该引用传递给函数?也许还有其他方法可以解决这个问题?
编辑: 复制和粘贴我之前对 R Van Rijn 的回复的回复:
我尝试在包规范中声明光标,并用包名引用它:open v_curs for PKG.c_getSomeData(x);... 这给了我一个新错误,说 PKG.c_getSomeData 必须是一个函数或数组那样使用。
更新: 我在这里与我们的 DBA 交谈过,他说不可能让 ref 游标指向显式游标。看来我毕竟不能这样做。真可惜。:(