2017-10-07 73 views
1

我想設置一些私有方法是有條件可見的,但只限於一個特定的架構,其中容納我的單元測試。PL/SQL - 基於調用模式的條件編譯?

在我的研究中,我一直未能找到一種可以實現這一點的方法。一個包常量顯然不起作用,PLSQL_CCFLAGS似乎也無法做到這一點。

我真正想要做的就是像下面 -

$IF USER = 'TEST' $THEN 
    --all my various procedures that should be hidden from all other users 
$END 

我還可以勉強接受的方法是僅在當前登錄的用戶條件下可獲得是我TEST模式,例如SYS_CONTEXT ('USERENV', 'SESSION_USER') = 'TEST'

有什麼辦法可以做到這一點?我的數據庫在Oracle 11g上。我相信這可能超出了CC的能力,因爲似乎只有一個編譯版本可以同時存在於數據庫中。想知道如果我失去了一些東西。

+0

看看你是否可以使用這樣的東西:https://docs.oracle.com/cd/B10500_01/appdev.920/a96624/c_wrap.htm –

回答

1

根據模式名稱創建一個包含布爾常量的動態生成包。然後在創建其他包時引用該常量。 (假設你是從版本控制的文本文件創建你的模式,那麼這個第一步可以很容易地插入到構建腳本中,這種方法不適用於導出和導入模式的老式方法。 )

--Dynamically create a package to hold constants. 
begin 
    execute immediate 
    ' 
create or replace package compilation_constants is 
    c_make_public_for_unit_tests constant boolean := ' 
     ||case when user = 'TEST' then 'true' else 'false' end||'; 
end; 
    '; 
end; 
/

--Example of calling the constant package. 
begin 
    $IF compilation_constants.c_make_public_for_unit_tests $THEN 
     dbms_output.put_line('make them public'); 
    $ELSE 
     dbms_output.put_line('keep them private'); 
    $END 
end; 
/

理論上你可以通過動態生成所有包規範來保存一個步驟。但是這需要重複case when user = 'TEST' ...檢查,並且還會使所有包文件看起來很難看。在這種情況下,爲了保持其他對象的清潔,值得創建一個單獨的對象。