我有一个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
和布尔值。
答案 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;
请注意,它没有包体,因此它永远不会在没有错误的情况下执行。在你的情况下,它并不重要,因为你的旗帜确保它不会被召唤。如果确实如此,那么你就知道那个环境存在问题。