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,而非SchemaABC下的存储过程a,因此触发“找不到存储过程”的错误。
简单来说:当前Schema内的表名优先级高于Schema自身的引用,同名标识符会被优先解析为表。
解决办法
有两种可靠的解决方式:
- 直接调用存储过程:因为当前登录用户就是
ABC,无需加Schema前缀,直接写a()即可; - 强制指定Schema引用:用双引号明确标记Schema名,让Oracle优先解析为Schema而非表,写法为
"ABC".a()。
验证代码
-- 方式1:直接调用 begin a(); end; / -- 方式2:双引号指定Schema begin "ABC".a(); end; /
内容的提问来源于stack exchange,提问作者Jörg
相关产品推荐
相关产品推荐

