我的雇主使用一个应用程序,该应用程序将有关业务案例的元数据存储在一个主表和大约 40 个详细表中。
目前,我维护一个包,它从这些表中读取并为每个主记录生成一个带有 HTML 输出的文件。
我的包裹正文包含以下内容:
type output_text_type is table of varchar(32768);
function fA(mri in master_record_identifier_type)
return output_text_type
is
cursor cA(if1 master_record_identifier_type.if1%type, ...)
is
select tA.f1, tA.f2, ...
from tA
where tA.if1 = if1
...;
begin -- fA
...
for r in cA(mri.if1, mri.if2, ...) loop
<generate HTML using r.f1, r.rf2, mri.if1...>
end loop;
end fA;
... some 40 more function with the same structure ...
顺便说一句,大多数游标返回少于 100 条记录(通常为零或一条),因此fetch ... bulk collect ...
不会导致性能提升。
现在我们计划与其他组织交换业务案例的元数据(当然还有文档本身)。为此,我们必须生成具有 - 实质上 - 相同内容的 xml 数据结构。
为了满足这个要求,我计划将我当前的包(受模型-视图-控制器模式的影响)拆分为一个包 pkg_cursors、一个 pkg_html 和一个(尚未编写的)pkg_xml。
唉,我通过定义如下记录找到了一个可行的解决方案:
create or replace package pkg_cursors
as
type rA is record(
if1 tA.if1%type,
f1 tA.f1%type,
f2 tA.f2%type,
... a dozen more fields ...
);
cursor ca(master_record_identifier_type.if1%type, ...)
return rA;
...
这是不幸的,因为到目前为止,向表中添加列会导致更新游标的 select 子句并将新列添加到游标循环中。从现在开始,我要考虑第三个地方:记录定义。
我还尝试了包规范中的游标:
create package pkg_cursors
as
cursor cA(...) is
select <select-list>
from ... where ...
return cA%rowtype;
但我得到了编译错误。
因此,我的问题是:有没有办法避免游标返回参数的记录定义?
你认为有更好的方法来拆分包裹吗?
(请原谅我的语言错误和这个问题的长度。我对英语的掌握会更扎实吗,这个问题可能会更短。)