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