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

Oracle PL/SQL-基于调用模式的条件编译?,oracle,plsql,Oracle,Plsql,我试图将一些私有方法设置为有条件可见,但仅限于包含单元测试的一个特定模式 在我的研究中,我还没有找到一种方法来实现这一点。包常量显然不起作用,PLSQLCCU标志似乎也不起作用 我真正想做的事情如下- $IF USER = 'TEST' $THEN --all my various procedures that should be hidden from all other users $END 如果当前登录的用户是我的TESTschema,例如SYS\u CONTEXT('USER

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

在我的研究中,我还没有找到一种方法来实现这一点。包常量显然不起作用,PLSQLCCU标志似乎也不起作用

我真正想做的事情如下-

$IF USER = 'TEST' $THEN
    --all my various procedures that should be hidden from all other users
$END
如果当前登录的用户是我的
TEST
schema,例如
SYS\u CONTEXT('USERENV','SESSION\u user')='TEST'


有没有办法做到这一点?我的数据库在Oracle 11g上。我相信这可能超出了CC的能力,因为在同一时间段内,数据库上似乎只能存在一个编译版本。想知道我是否遗漏了什么。

创建一个动态生成的包,其中包含基于架构名称的布尔常量。然后在创建其他包时引用该常量

(这假设您是从受版本控制的文本文件创建架构,那么第一步就可以轻松地插入到构建脚本中。这种方法不适用于老式的导出和导入架构的方法。)


理论上,您可以通过动态生成所有包规范来节省步骤。但是,当user='TEST'…检查时,这将需要复制
案例,并且还会使所有的包文件看起来很难看。在这种情况下,创建一个单独的对象以保持其他对象的清洁是值得的。

看看您是否可以使用类似的方法:
--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;
/