2017-10-07 68 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' ...检查,并且还会使所有包文件看起来很难看。在这种情况下,为了保持其他对象的清洁,值得创建一个单独的对象。