2017-10-07 9 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' ...チェックを複製する必要があり、あなたのパッケージファイルもすべて醜いものに見えるでしょう。この場合、他のオブジェクトをきれいに保つために別のオブジェクトを作成する価値があります。

関連する問題