私の雇用主は、ビジネスケースに関するメタデータをマスターテーブルと約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レコード未満(ほとんどの場合0または1)をfetch ... bulk collect ...
返すため、パフォーマンスは向上しません。
今、私たちはビジネスケースのメタデータ(そしてもちろん、ドキュメント自体)を他の組織と交換することを計画しています。このためには、実質的に同じ内容のxmlデータ構造を生成する必要があります。
この要件を満たすために、現在のパッケージ(model-view-controllerパターンのアイデアに影響されます)をパッケージ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句が更新され、新しい列がcursor-for-loopに追加されていました。これから、考慮すべき3番目の場所があります。それはレコード定義です。
パッケージ仕様のカーソルも試してみました。
create package pkg_cursors
as
cursor cA(...) is
select <select-list>
from ... where ...
return cA%rowtype;
しかし、コンパイルエラーが発生しました。
したがって、私の質問は次のとおりです。カーソル戻り引数のレコード定義を回避する方法はありますか?
パッケージを分割するより良い方法があると思いますか?
(私の言語の誤りとこの質問の長さをお詫びしてください。私の英語のコマンドがもっとしっかりしていれば、この質問はおそらくもっと短くなるでしょう。)