假設我有一個只公開公開一個過程的包。但是,此過程的目的是根據傳遞給它的參數在包中調用私有過程。從包中動態調用私有過程
理想情況下,我希望定義一個哈希表(例如,關聯數組甚至表)映射參數的內部程序,然後像做:
execute immediate 'begin ' || internalProc(myArgument) || '; end;';
然而,此次榮獲」因爲在包的範圍之外執行了動態的PL/SQL塊。我甚至不能做'begin myPkg.' || internalProc...
,因爲內部程序都是私人的。
因此,我能做到這一點(不暴露私人程序)的唯一方法是通過一個大規模的硬編碼開關?
case myArgument
when 'something' then someProc;
when 'foo' then fooProc;
when 'bar' then barProc;
...
else raise_application_error('-20001, 'No such process.')
end case;
鑑於您必須將參數顯式映射到內部程序*某處*爲什麼大量的case語句如此有問題? – APC
@APC有趣的是,我會說一個將參數映射到過程的表格*稍微容易維護。人們也可以使用內部程序的命名約定,以便有直接的對應關係(例如,'something'' - >'somethingProc','foo'' - >'fooProc'等) – Xophmeister
我想我們有「可維護」的不同定義。我更喜歡將自己的控制邏輯放在我面前,而不必去別處看。另外,將參數值鏈接到內部過程的名稱會違反Demeter法則:http://en.wikipedia.org/wiki/Law_of_Demeter這意味着重新組織被調用程序的* internal *結構可能會產生影響在呼叫方案,這是可維護的(根據我的經驗,YMMV)相反。 – APC