You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c:创建与Schema同名表后存储过程调用失败(PLS-00221)

Oracle 19c中Schema同名表引发存储过程调用PLS-00221错误的机制解析

问题现象

在Oracle 19c环境下,登录用户为Schema ABC:

  • 该Schema下存在存储过程a,初始用abc.a()调用完全正常;
  • 创建一张与Schema同名的表ABC后,再次调用abc.a()触发PLS-00221: 'A' is not a procedure or not defined错误。

复现代码

create or replace procedure a as
begin
    null;
end a;
/

-- 首次调用正常
begin
    abc.a();
end;
/

-- 创建与Schema同名的表
create table abc (a number);

-- 再次调用报错
begin
    abc.a();
end;
/

原因解析

这是Oracle命名解析优先级规则导致的:

  • 当使用abc.a()格式时,Oracle会优先在当前Schema范围内解析abc为表/视图这类实体对象,而非Schema名;
  • 表ABC存在后,abc.a()会被解析为表ABC的列a,而非Schema ABC下的存储过程a,因此触发“找不到存储过程”的错误。

简单来说:当前Schema内的表名优先级高于Schema自身的引用,同名标识符会被优先解析为表。

解决办法

有两种可靠的解决方式:

  1. 直接调用存储过程:因为当前登录用户就是ABC,无需加Schema前缀,直接写a()即可;
  2. 强制指定Schema引用:用双引号明确标记Schema名,让Oracle优先解析为Schema而非表,写法为"ABC".a()。

验证代码

-- 方式1:直接调用
begin
    a();
end;
/

-- 方式2:双引号指定Schema
begin
    "ABC".a();
end;
/

内容的提问来源于stack exchange,提问作者Jörg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:50:13