首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨架构的Oracle 11g包重载

跨架构的Oracle 11g包重载
EN

Stack Overflow用户
提问于 2015-09-04 02:41:43
回答 1查看 68关注 0票数 1

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

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

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

例如:

代码语言:javascript
复制
-- 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“调用以下代码时,它工作得很好:

代码语言:javascript
复制
select package1.function1(123) from dual;

当我从"schema2“调用以下代码时,它失败了:

代码语言:javascript
复制
select package1.function1(123, sysdate) from dual;

ORA-06553: PLS-306: wrong number or types of arguments in call to 'function1'

因此,它显然没有忽略本地包,而是第二个调用的公共同义词,这可能是设计上的,但我真的很想看看我是否能让它工作。

我知道我可以像这样将它们添加到"schema2“包中:

代码语言:javascript
复制
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“的开发人员可以访问它(而不是直接引用它,不幸的是,这不是一个选项)。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-09-04 07:09:45

您应该仍然能够从schema2中引用schema1中的package1.newfunction,只需在模式引用前加上前缀: schema1.package1.newfunction或创建一个本地同义词:CREATE SYNONYM S1_PACKAGE1 FOR SCHEMA1.PACKAGE1;

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

然而,你真的应该了解一下SCHEMA1的开发人员的情况,因为包规范代表了他们通过以非向后兼容的方式更改签名而打破的合同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32383171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档