我们遇到了一个小故障,我们很容易找到它。但我们试图找到这种行为的文档,但无法得到这一点,我们也不明白为什么 Oracle 会这样。
我们拥有:
请记住,我们正在使用登录用户 ABC 的模式 ABC !!!
create or replace procedure a as
begin
null;
end a;
/
begin
abc.a();
end;
/
create table abs (a number);
begin
abc.a();
end;
/
PLS-00221: 'A' is not a procedure or not defined
很明显,新创建的表会产生问题,但原因是什么?使用架构前缀调用过程不应受到同名表的损害。 Oracle 文档指出,schema.objects 是引用对象的正确方法,我们找不到任何免责声明为什么这不起作用。
我猜
create table abs
实际上应该读为create table abc
。
Oracle 的名称解析会先找到与名称匹配的对象,然后再根据名称查找所有者。它看到一个名为
abc
的对象,并将 .a
解释为该对象内的过程(例如,就好像它是一个包),但表没有过程,因此会出现错误。
有关文档,请参阅:
摘录:
a.在当前模式中,数据库搜索一个对象,其 name 与对象名称的第一部分匹配。如果没有找到 这样的对象,继续步骤 b。
b.数据库搜索与第一个匹配的公共同义词 名字的一部分。如果没有找到,则继续执行步骤 c。
c.数据库搜索名称与第一个匹配的模式 对象名称的一部分。如果找到一个,则返回步骤 b,现在 使用名称的第二部分作为要在中查找的对象 合格的模式。如果第二块不对应一个对象 在先前限定的模式中或者没有第二部分, 数据库返回错误。