动态调用exist/not-exist包



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

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

我的问题是:在某些环境中,存在kwp_gep包,并且IsRegisterMode标志为true,所以调用了kwp_gep.register,但在另一个环境中,kwp_gep包不存在(不必要),IsRegisterMode标志为false。在第二个环境中有了以上解释,主包没有编译并显示错误:kwp_gep does not exist。我的问题是:这个问题的解决方案是什么?我认为存在一种动态执行kwp_gep过程的解决方案。

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

选项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;

请注意,它没有包主体,因此它永远不会在没有错误的情况下执行。在你的情况下,这并不重要,因为你的旗帜可以确保它不会被调用。如果真的发生了,那么你就知道那个环境有问题。

最新更新