我的僱主使用一個應用程序,它將有關商業案例的元數據存儲在主表和大約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 ...
BTW,最光標返回少於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;
但我得到了編譯錯誤。
因此,我的問題是:有沒有辦法避免遊標返回參數的記錄定義?
您是否認爲有更好的方法來拆分包?
(請原諒我的語言錯誤和這個問題的長度。請問我的英語水平更加堅實,這個問題將可能會更短。)
你有沒有考慮過動態html? dbms_sql可以執行此操作(請參閱dbms_sql.describe_columns) – DazzaL