PL / SQL - 基于调用模式的条件编译?

时间:2017-10-07 00:22:03

标签: oracle plsql

我试图将某些私有方法设置为有条件可见,但仅限于一个特定的架构,它包含我的单元测试。

在我的研究中,我找不到能够实现这一目标的方法。包装常数显然不会起作用,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功能,因为似乎只有一个编译版本可以同时存在于数据库中。想知道我是否遗漏了一些东西。

1 个答案:

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