我在"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“的开发人员可以访问它(而不是直接引用它,不幸的是,这不是一个选项)。
谢谢!
发布于 2015-09-04 07:09:45
您应该仍然能够从schema2中引用schema1中的package1.newfunction,只需在模式引用前加上前缀: schema1.package1.newfunction或创建一个本地同义词:CREATE SYNONYM S1_PACKAGE1 FOR SCHEMA1.PACKAGE1;
这样,您的本地包装器包可以隐藏签名更改,从而允许当前代码继续工作,但希望或需要利用SCHEMA1.PACKAGE1中的新功能的新代码仍然可以通过使用替代引用。
然而,你真的应该了解一下SCHEMA1的开发人员的情况,因为包规范代表了他们通过以非向后兼容的方式更改签名而打破的合同。
https://stackoverflow.com/questions/32383171
复制相似问题