跨架构的Oracle 11g包重载

跨架构的Oracle 11g包重载,oracle,oracle11g,Oracle,Oracle11g,我在“schema1”中有一个包(带有公共同义词),它被“schema2”中的许多包调用。“schema1”包中函数的签名发生了更改,这破坏了从“schema2”调用该函数的所有代码 我没有任何方法来更改“schema1”,所以我想我可以在“schema2”中重新创建该包,使用与“schema1”中匹配的包相同的规范,并为损坏的函数添加重载。包体只是将参数传递给“schema1.package1”,因此未来对现有函数中的逻辑的更改将不需要对“schema2”中的任何内容进行更改 这非常有效,直到

我在“schema1”中有一个包(带有公共同义词),它被“schema2”中的许多包调用。“schema1”包中函数的签名发生了更改,这破坏了从“schema2”调用该函数的所有代码

我没有任何方法来更改“schema1”,所以我想我可以在“schema2”中重新创建该包,使用与“schema1”中匹配的包相同的规范,并为损坏的函数添加重载。包体只是将参数传递给“schema1.package1”,因此未来对现有函数中的逻辑的更改将不需要对“schema2”中的任何内容进行更改

这非常有效,直到控制“schema1”的邪恶开发人员向package1添加新函数或过程。完成此操作后,“schema2”中的代码将看不到新的函数或过程

例如:

-- Package in schema1, shown here for reference.
create or replace package schema1.package1 as
  function function1(num1 in number, date1 in date) return number;
end package1;

-- Package in scheam2.
create or replace package schema2.package1 as
  function function1(num1 in number) return number;
end package1;

-- Package body in scheam2.
create or replace package body schema2.package1 as
  function function1(num1 in number) return number as begin
    return schema1.package1.function1(num1,sysdate);
  end;
end package1;
当我从“schema2”调用以下内容时,它工作正常:

select package1.function1(123) from dual;
当我从“schema2”调用以下内容时,它失败了:

select package1.function1(123, sysdate) from dual;

ORA-06553: PLS-306: wrong number or types of arguments in call to 'function1'
所以,很明显,它并没有超越本地包而成为第二次通话的同义词,这可能是出于设计,但是,我真的很想看看我是否能让它起作用

我知道我可以在“schema2”的包中添加这两个选项,如下所示:

create or replace package schema2.package1 as
  function function1(num1 in number) return number;
  function function1(num1 in number, date1 in date) return number;
end package1;

create or replace package body schema2.package1 as
  function function1(num1 in number) return number as begin
    return schema1.package1.function1(num1, sysdate);
  end;
  function function1(num1 in number, date1 in date) return number as begin
    return schema1.package1.function1(num1, date1);
  end;
end package1;
但这对我来说不起作用,因为每次在“schema1”中向包中添加另一个函数或过程时,我都需要更新“schema2”中的包,以便使用“schema2”的开发人员可以访问它(没有直接引用它,不幸的是,这不是一个选项)


谢谢

您应该仍然能够从schema2中引用schema1中的package1.newfunction,只需在schema引用前加上前缀:schema1.package1.newfunction或创建本地同义词:
为schema1.package1创建同义词S1\u package1

通过这种方式,您的本地包装包可以隐藏签名更改,从而允许当前代码继续工作,但是希望或需要利用SCHEMA1.PACKAGE1中的新功能的新代码仍然可以使用替代引用


但是,,您确实应该了解SCHEMA1的开发人员的情况,因为包规范表示一个契约,它们通过以不向后兼容的方式更改签名而破坏了该契约。

您应该仍然能够从schema2中引用SCHEMA1中的package1.newfunction,只需在schema引用前面加前缀:SCHEMA1.package1.newfunction或通过创建本地同义词:
为SCHEMA1.PACKAGE1创建同义词S1_PACKAGE1

通过这种方式,您的本地包装包可以隐藏签名更改,从而允许当前代码继续工作,但是希望或需要利用SCHEMA1.PACKAGE1中的新功能的新代码仍然可以使用替代引用


但是,您确实应该关注SCHEMA1的开发人员,因为包规范表示一个契约,他们通过以不向后兼容的方式更改签名而破坏了该契约。

如果您想使用模式2中的包来缓冲对模式1中方法签名的更改,只要添加了希望用户能够调用的新方法,就必须对其进行更新。不过,退一步说,如果要向Schema 1包中具有合理默认值的方法添加新参数,为什么不要求开发人员将其作为可选参数添加呢?这样,您就不需要维护自己的包,而且当添加新的可选参数时,您的代码也不会中断?我的团队的优先级很低,我们试图让他们创建可选参数或重载以保持向后兼容性,他们基本上说不。这将是理想的解决方案。由于我们无法让他们改变,我希望能想出一个替代的解决方案,而不必复制包中的所有内容,只需复制那些改变了的内容。看来这是不可能的。感谢您的反馈。如果您想使用模式2中的包来缓冲对模式1中方法签名的更改,则必须在添加希望用户能够调用的新方法时对其进行更新。不过,退一步说,如果要向Schema 1包中具有合理默认值的方法添加新参数,为什么不要求开发人员将其作为可选参数添加呢?这样,您就不需要维护自己的包,而且当添加新的可选参数时,您的代码也不会中断?我的团队的优先级很低,我们试图让他们创建可选参数或重载以保持向后兼容性,他们基本上说不。这将是理想的解决方案。由于我们无法让他们改变,我希望能想出一个替代的解决方案,而不必复制包中的所有内容,只需复制那些改变了的内容。看来这是不可能的。感谢您的反馈。这是“schema1”开发人员在过去3年左右第二次这样做。不管我们说什么,他们都不会改变。将来通过在模式名称前面加前缀来访问包对我的团队来说是一件很难的事情,而且如果不重新创建所有不需要重新创建的当前代码,就无法使用当前的无前缀调用来处理所有已经存在的代码。我认为我的问题的正确答案是“还不能完成”。我建议对于当前代码,您使用包装包复制丢失的功能;对于使用新schema1功能的新代码,您可以使用本地定义的同义词。然后在将来,如果schema1再次以破坏代码的方式更改这些规范,您可以更新本地包以恢复功能,将本地同义词重新指向本地包,并创建另一个本地同义词以指向schema1的包以获取新功能。这是第二次使用“schema1”在过去3年左右的时间里,开发人员已经这样做了。不管我们说什么,他们