诡异的 ORA-06550 PLS-00302错误

今天接到一个朋友的求助:

一个用户创建测试库存储过程时,以存储过程所有者登录后,执行过程时正常,但是如果执行过程的命令中带上schema名后,则报错 ORA-06550 PLS-00302错误。

场景:

SQL> show user

USER is "JOHN"

SQL> create or replace procedure p1

2  authid current_user

3  as

4  begin

5    null;

6  end p1;

7  /

Procedure created.

SQL>

SQL> exec p1;

PL/SQL procedure successfully completed.

SQL> exec john.p1;

BEGIN john.p1; END;

*

ERROR at line 1:

ORA-06550: line 1, column 12:

PLS-00302: component ‘P1‘ must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

SQL>

解决思路:

第一个想到的就是权限问题,即使是执行自己的procedure,也需要显式赋权?于是给自己赋权了:

SQL> grant execute on p1 to john;

Grant succeeded.

SQL> exec john.p1;

BEGIN john.p1; END;

*

ERROR at line 1:

ORA-06550: line 1, column 12:

PLS-00302: component ‘P1‘ must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

SQL> exec p1;

PL/SQL procedure successfully completed.

SQL>

依旧报错,于是查看john的系统权限:

SQL> select * from dba_sys_privs where grantee=‘JOHN‘;

GRANTEE                        PRIVILEGE                      ADMIN_OPTION

------------------------------ ------------------------------ -----------------------------

JOHN                           UNLIMITED TABLESPACE               NO

SQL> select * from dba_role_privs where grantee=‘JOHN‘;

GRANTEE    GRANTED_ROLE                   ADMIN_OPTION                   DEFAUL

---------- ------------------------------ ------------------------------ ------

JOHN       CONNECT                        NO                             YES

JOHN       RESOURCE                       NO                             YES

怀疑是不是因为存储过程是以调用者方式创建的,导致需要执行用户有execute any procedure权限,于是给john用户增加权限:

SQL> select * from dba_role_privs where grantee=‘JOHN‘;

GRANTEE    GRANTED_ROLE                   ADMIN_OPTION                   DEFAUL

---------- ------------------------------ ------------------------------ ------

JOHN       CONNECT                        NO                             YES

JOHN       RESOURCE                       NO                             YES

SQL> select * from dba_sys_privs where grantee=‘JOHN‘;

GRANTEE    PRIVILEGE                      ADMIN_OPTION

---------- ------------------------------ ------------------------------

JOHN       CREATE TRIGGER                 NO

JOHN       EXECUTE ANY PROCEDURE          NO

JOHN       CREATE VIEW                    NO

JOHN       ALTER ANY PROCEDURE            NO

JOHN       CREATE TABLE                   NO

JOHN       SELECT ANY DICTIONARY          NO

JOHN       CREATE ANY PROCEDURE           NO

7 rows selected.

再次尝试:

SQL> exec p1;

PL/SQL procedure successfully completed.

SQL> exec john.p1;

BEGIN john.p1; END;

*

ERROR at line 1:

ORA-06550: line 1, column 12:

PLS-00302: component ‘P1‘ must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

SQL>

情况依旧。

还是怀疑跟以调用者方式创建的有关,于是尝试默认创建的方式创建:

SQL> create or replace procedure p2 as begin null;end p2;

2  /

Procedure created.

SQL> exec p2;

PL/SQL procedure successfully completed.

SQL> exec john.p2;

BEGIN john.p2; END;

*

ERROR at line 1:

ORA-06550: line 1, column 12:

PLS-00302: component ‘P2‘ must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

SQL>

到这里基本可以判断,跟以调用者创建的方式是无关的了。

开始网上查一把,查到类似文章:

http://www.itpub.net/thread-1834519-1-1.html

情况类似,它产生问题的原因是PUBLIC角色中,有一个同义词跟schema同名了。

于是,开始查看PUBLIC的同义词:

SQL> select owner,synonym_name from dba_synonyms where synonym_name=‘JOHN‘;

no rows selected

没有类似同义词。到这里,笔者基本猜到了,有可能相同的名字空间中有跟schema_name同名的对象,于是查看之:

SQL> select owner,object_name,object_type from dba_objects where object_name=‘JOHN‘;

OWNER      OBJECT_NAME                    OBJECT_TYPE

---------- ------------------------------ --------------------------------------

JOHN       JOHN                           TABLE

果然有一条记录,欣喜,像是抓到救命稻草。

于是rename之(因为是测试环境):

SQL> alter table john rename to john_bak;

Table altered.

SQL> exec p1;

PL/SQL procedure successfully completed.

SQL> exec john.p1;

PL/SQL procedure successfully completed.

SQL>

果然,原因找到了。

警示:

现网环境的对象命名时需要注意,不要跟schema_name同名,否则很容易引起歧义,执行时因为名字空间的问题,导致一些存储过程、函数等执行起来会有问题。

延伸测试:

SQL> show user

USER is "JOHN"

VIEW:

SQL> select owner,object_name,object_type from dba_objects where object_name=‘JOHN‘;

OWNER      OBJECT_NAME                    OBJECT_TYPE

---------- ------------------------------ --------------------------------------

JOHN       JOHN                           VIEW

SQL> exec p1;

PL/SQL procedure successfully completed.

SQL> exec john.p1;

BEGIN john.p1; END;

*

ERROR at line 1:

ORA-06550: line 1, column 12:

PLS-00302: component ‘P1‘ must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

SQL> drop view john;

SYNONYM:

SQL> create synonym john for test;

SQL>  select owner,object_name,object_type from dba_objects where object_name=‘JOHN‘;

OWNER      OBJECT_NAME                    OBJECT_TYPE

---------- ------------------------------ --------------------------------------

JOHN       JOHN                           SYNONYM

SQL> exec p1;

PL/SQL procedure successfully completed.

SQL> exec john.p1;

BEGIN john.p1; END;

*

ERROR at line 1:

ORA-06550: line 1, column 12:

PLS-00302: component ‘P1‘ must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

SQL>

时间: 2024-08-06 23:11:06

诡异的 ORA-06550 PLS-00302错误的相关文章

ora 00600 [kcratr_nab_less_than_odr] [4194]错误

业务场景:公司电缆被挖断,突然断电导致的宕机. [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Mon Apr 17 11:09:59 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release

技术培训 | RAC 宕机罪犯案情探析之子游标

大家好,我是云和恩墨的李轶楠,不过网上的朋友更习惯叫我600,所以我也慢慢熟悉了这个称呼,其实这个称呼来自于ITPUB论坛上当时我注册的论坛ID"ORA-600",因为这个ID跟Oracle的著名错误号一样,很容易给大家留下深刻印象,所以被我借用了过来,呵呵.这些年通过论坛上认识了很多朋友,也结识了现在与我一起奋战的恩墨小伙伴们. 闲话不多说,我们来看看我们今天要分享的主题吧,这些年我们积累了大量的客户群体,也意味着我们面对着各种复杂的环境与事件,后续我会把我们小伙伴们所遭遇到的各种或

如何搜索Oracle的学习资料

前言:只有跟着大师入门,才能走更少的弯路,英文文档是最权威的学习资料. (1).查找Oracle数据库的官方在线文档 以下是Oracle 11g R2.Oracle 10g R2.Oracle 9i R2的官方在线文档: Oracle Database Online Documentation 11g Release 2 (11.2) Oracle Database Online Documentation 10g Release 2 (10.2) Oracle9i Database Onlin

[转]什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查

1 什么是Pro*C/C++ 1.通过在过程编程语言C/C++中嵌入SQL语句而开发出的应用程序 2.什么是嵌入式SQL 1.在通用编程语言中使用的SQL称为嵌入式SQL 2.在SQL标准中定义了很多中语言的嵌入式SQL 3.各个厂商对嵌入式SQL的具体实现不同 3.什么是Pro*C/C++ 1.在C/C++语言中嵌入SQL语句而开发出的应用程序. 2.目的:使c/c++这种效率语言称为访问数据库的工具. 4.嵌入式SQL的载体是宿主语言 宿主语言 Pro程序 C/C++ Pro*C/C++ F

什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查

 1 什么是Pro*C/C++ 1.通过在过程编程语言C/C++中嵌入SQL语句而开发出的应用程序 2.什么是嵌入式SQL 1.在通用编程语言中使用的SQL称为嵌入式SQL 2.在SQL标准中定义了很多中语言的嵌入式SQL 3.各个厂商对嵌入式SQL的具体实现不同 3.什么是Pro*C/C++ 1.在C/C++语言中嵌入SQL语句而开发出的应用程序. 2.目的:使c/c++这种效率语言称为访问数据库的工具. 4.嵌入式SQL的载体是宿主语言 宿主语言          Pro程序 C/C++

Oracle 项目就是那回事 ----数据库迁移(1)

做数据库迁移是一件蛋疼的事,做数据库设计的人,往往不考虑数据构架的可扩展性,因为做数据库迁移的人不是做数据库设计的人. 之前做了这样的一个数据库迁移,要求大概如下 1.晚上大概有5个小时的宕机时间,可以做整库(A机)迁移操作. 2.数据的数据量在900G左右. 3.同样的操作系统和数据库版本 4.迁移的时候,需要更改数据库名和实例名. 5.客户现场没有数据备份磁带或磁盘设备. 6.可用的就是一台硬件升级过的小机(B机),用来运行迁移后的数据库,没有共享存储. 看到这个要求我心里大概有些谱了. 5

Windows平台下Oracle 11g R2监听文件日志过大,造成客户端无法连接的问题处理

近期部署在生产环境的应用突然无法访问,查看应用日志发现无法获取数据库连接. SystemErr R Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection SystemErr R at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:359) SystemErr R at oracle.net.resolve

ORA-12520: TNS:listener could not find available handler for requested type of server

当你碰到ORA-12520错误时,如下所示: 英文错误提示: 中文错误提示: ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序 一般你应该从下面两个方面去检查出错原因并解决问题: 1:数据库是专用服务器,但是在tnsname.ora配置文件中设置的连接方式是shared,这种情况需要修改tnsname.ora配置文件,这种错误情况一般发生在第一次连接数据库服务器. 2:运行正常的数据库服务器,突然报ORA-12520错误,一般是因为process不够引起的.需要增

EXP/IMP迁移数据

迁移数据 注意事项: Log= 加这个是为了看有没有导入成功.这个导入导出是会100%丢失数据的.这个只能当迁移,不能做为备份. Buffer=把这个放大,一般10M,这个是为了提速的 Rows=n 不导数据 字体集NLS 这个是必须要设置的. 数据坏了显示方式:??列宽度不够,这个是立刻报错的.我就知道迁移失败了 Select * from v$nls_database_parameters; Exp  system/sys  file=/oracle/qyl.dmp  owner=qyl  

rac环境修改spfile后遭遇ora-29250小例

原创作品,出自 "深蓝的blog" 博客,转载时请务必注明出处,否则有权追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46863931 环境: 操作系统:CENTOS6.4 64BIT 数据库:RAC ORACLE 11.2.0.3 64BIT 启库后出现错误,之前修改过参数:filesystemio_options参数,但是重启库后,报如下错误: SQL> startup ORA-3200