添加 schema 名称的表后无法调用 Oracle 过程

问题描述 投票:0回答:1

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

我们拥有:

  1. Oracle 19c
  2. 名为 ABC 的模式
  3. 该模式中名为 a 的过程
  4. 我们用模式前缀来调用该过程
  5. 一切都很好
  6. 一旦我们添加与架构同名的表,过程调用就不再起作用,并且我们会收到错误 PLS-00221

请记住,我们正在使用登录用户 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 是引用对象的正确方法,我们找不到任何免责声明为什么这不起作用。

oracle compiler-errors procedure fully-qualified-naming
1个回答
0
投票

我猜

create table abs
实际上应该读为
create table abc

Oracle 的名称解析会先找到与名称匹配的对象,然后再根据名称查找所有者。它看到一个名为

abc
的对象,并将
.a
解释为该对象内的过程(例如,就好像它是一个包),但表没有过程,因此会出现错误。

有关文档,请参阅:

管理对象名称解析

摘录:

a.在当前模式中,数据库搜索一个对象,其 name 与对象名称的第一部分匹配。如果没有找到 这样的对象,继续步骤 b。

b.数据库搜索与第一个匹配的公共同义词 名字的一部分。如果没有找到,则继续执行步骤 c。

c.数据库搜索名称与第一个匹配的模式 对象名称的一部分。如果找到一个,则返回步骤 b,现在 使用名称的第二部分作为要在中查找的对象 合格的模式。如果第二块不对应一个对象 在先前限定的模式中或者没有第二部分, 数据库返回错误。

© www.soinside.com 2019 - 2024. All rights reserved.