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。