动态调用存在/不存在包

时间:2014-04-16 05:51:04

标签: oracle plsql

我有一个PL/SQL包,如下(一段代码):

if(IsRegisterMode)
    num_result := kwp_gep.register(var_name,var_family, bool_is_incomming);

我的问题是:在某些环境kwp_gep包中存在并且IsRegisterMode标志为真,因此kwp_gep.register被调用但在另一个环境中kwp_gep包不存在(不是必需的) )并且IsRegisterMode标志为false。 在第二个环境中有上述说明,主程序包不会编译并显示错误:kwp_gep does not exist。 我的问题是:这个问题的解决方案是什么?我认为存在一个动态执行kwp_gep过程的解决方案。

编辑: kwp_gep.register有一个数字作为返回值,bool_is_incomming和布尔值。

1 个答案:

答案 0 :(得分:4)

选项1:条件编译

您可以使用条件编译,例如

$IF $$isregistermode $THEN
  kwp_gep.register(var_name,var_family);
$ENDIF

编译包时,您可以在包存在的环境中执行以下操作:

ALTER SESSION SET PLSQL_CCFLAGS = 'isregistermode:true'

选项2:动态执行

if IsRegisterMode then
  execute immediate 'kwp_gep.register(:var_name,:var_family)'
  using var_name, var_family;
end if;

选项3:存根

(根据Egor的建议)在没有kwp_gep.register的环境中,创建一个永远不会被调用的存根,例如

CREATE OR REPLACE PACKAGE kwp_gep IS
PROCEDURE register (var_name in varchar2, var_family in varchar2);
END kwp_gep;

请注意,它没有包体,因此它永远不会在没有错误的情况下执行。在你的情况下,它并不重要,因为你的旗帜确保它不会被召唤。如果确实如此,那么你就知道那个环境存在问题。