Oracle 动态调用exist/notexist包
我有一个Oracle 动态调用exist/notexist包,oracle,plsql,Oracle,Plsql,我有一个PL/SQL包,如下所示(一段代码): 我的问题是:在某些环境中,存在kwp\u gep包,并且IsRegisterMode标志为true,因此kwp\u gep.register被调用,但在另一个环境中kwp\u gep包不存在(不必要),并且IsRegisterMode标志为false。 在第二个环境中使用上述说明时,主包不会编译并显示错误:kwp\U gep不存在。 我的问题是:这个问题的解决方案是什么?我认为存在一种动态执行kwp\u gep过程的解决方案 编辑: kwp\u g
PL/SQL
包,如下所示(一段代码):
我的问题是:在某些环境中,存在kwp\u gep
包,并且IsRegisterMode
标志为true,因此kwp\u gep.register
被调用,但在另一个环境中kwp\u gep
包不存在(不必要),并且IsRegisterMode
标志为false。
在第二个环境中使用上述说明时,主包不会编译并显示错误:kwp\U gep不存在
。
我的问题是:这个问题的解决方案是什么?我认为存在一种动态执行kwp\u gep
过程的解决方案
编辑:
kwp\u gep.寄存器
有一个数字作为返回值,bool\u是输入的
和布尔值。选项1:条件编译
if IsRegisterMode then
execute immediate 'kwp_gep.register(:var_name,:var_family)'
using var_name, var_family;
end if;
您可以使用条件编译,例如
$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;
请注意,它没有包体,因此它永远不会执行时没有错误。在您的情况下,这并不重要,因为您的标志确保它不会被调用。如果是,那么您就知道该环境中存在问题。选项1:条件编译
if IsRegisterMode then
execute immediate 'kwp_gep.register(:var_name,:var_family)'
using var_name, var_family;
end if;
您可以使用条件编译,例如
$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;
请注意,它没有包体,因此它永远不会执行时没有错误。在您的情况下,这并不重要,因为您的标志确保它不会被调用。如果是,那么您知道该环境中存在问题。为第二个环境中不存在的包编译存根(带有空实现的包)。为第二个环境中不存在的包编译存根(带有空实现的包)。谢谢。我的包更改了,我编辑了我的问题,请检查它。我的包有返回值和一个输入参数作为布尔值,但您的第二个解决方案不适用于这种情况。@MJM所有选项仍然有效。在我看来,如果您在将答案应用于函数调用而不是过程调用时遇到问题,这是另一个问题。最好的方法是使用动态sql。谢谢。我的包更改了,我编辑了我的问题,请检查它。我的包有返回值和一个输入参数作为布尔值,但您的第二个解决方案不适用于这种情况。@MJM所有选项仍然有效。在我看来,如果您在将答案应用于函数调用而不是过程调用时遇到问题,这是另一个问题。最好的方法是使用动态sql。