我在“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”的开发人员可以访问对它(没有直接引用它,遗憾的是不是一个选项)。
谢谢!
答案 0 :(得分:0)
您仍然可以通过为架构引用添加前缀:schema1.package1.newfunction或通过创建本地同义词来引用schema2中的schema1中的package1.newfunction:CREATE SYNONYM S1_PACKAGE1 FOR SCHEMA1.PACKAGE1;
这样,本地包装程序包可以隐藏签名更改,允许当前代码继续工作,但是希望或需要利用SCHEMA1.PACKAGE1中的新功能的新代码仍然可以使用备用引用。
但是,您真的应该了解SCHEMA1的开发人员的情况,因为软件包规范代表了他们通过以非向后兼容的方式更改签名而破坏的合同。