添加具有架构名称的表后,无法调用Oracle过程

jtw3ybtb  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(98)

我们遇到了一个小故障,很容易就找到了。但是我们试图找到这种行为的文档,却无法得到,我们也不明白为什么Oracle会这样做。
我们拥有:

  1. Oracle 19c
    1.名为ABC的架构
    1.该架构中名为
    1.我们用模式前缀调用该过程
    1.一切都很好
    1.只要我们添加一个与模式同名的表,过程调用就不再起作用,我们得到错误PLS-00221
    记住,我们使用的是登录用户ABC模式ABC!!!
create or replace procedure a as
begin
    null;
end a;
/

begin
    abc.a();
end;
/

create table abc (a number);

begin
    abc.a();
end;
/

PLS-00221: 'A' is not a procedure or not defined

很明显,新创建的表会产生问题,但原因是什么?使用模式前缀调用过程不应受到同名表的影响。Oracle文档指出,schema.objects是引用对象的正确方式,我们找不到任何免责声明,为什么这不应该工作。

pjngdqdw

pjngdqdw1#

我猜create table abs实际上应该读create table abc
Oracle的名称解析将在根据名称查找所有者之前找到与名称匹配的对象。它看到一个名为abc的对象,并将.a解释为该对象中的过程(例如,就好像它是一个包),但表没有过程,因此出现错误。
有关文档,请参见:
管理对象名称解析
摘录:
a.在当前模式中,数据库搜索其名称与对象名称的第一部分匹配的对象。如果没有找到这样的对象,则继续步骤b。
B.数据库搜索与名称的第一部分匹配的公共同义词。如果没有找到,则继续步骤c。
c.数据库搜索其名称与对象名称的第一部分匹配的模式。如果找到一个,则返回到步骤B,现在使用名称的第二部分作为要在限定模式中查找的对象。如果第二个部分与先前限定的模式中的对象不对应,或者没有第二个部分,则数据库返回错误。

相关问题