删除包时,报ORA-04043: object SYS_PLSQL×× dose not exists

来源:互联网 发布:逃犯 熊孩子 知乎 编辑:程序博客网 时间:2024/06/13 18:10
今天删除一个包时,发生如下错误,怎么也删除不了
ORA-04043: object SYS_PLSQL_215395_9_2 does not exist
 
在google中找到如下文章,问题解决
http://pingshx.itpub.net/post/39434/496353

环境
OS: SunOS HOSTNAME 5.10 Generic_127111-11 sun4u sparc SUNW,Sun-Fire-V890
DB:Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production

问题:一个包处于无效状态,通常直接用命令编译一下,就行了,但这个简单的操作,却碰到:
SQL> alter package SCHEMA.PACKAGENAME compile;
alter package SCHEMA.PACKAGENAME compile
*
ERROR at line 1:
ORA-04043: object SYS_PLSQL_6459_DUMMY_2 does not exist


这个错误,其实在9i里这是比较常见的错误,在SP里定义:TYPE和TABLE OF TYPE的数据对象时.Oracle就会自动的在系统内生成SYS_PLSQL_<ID of SP>%对象,好象Pipeline也会产生.当找到不这些SYS_PLSQL对象时,这个SP就无法通过编译了.

SQL> select 'drop type SCHEMA.'||object_name||' force;' from dba_objects where object_name like 'SYS_PLSQL_6459%';
drop type SCHEMA.SYS_PLSQL_6459_15_1 force;
drop type SCHEMA.SYS_PLSQL_6459_DUMMY_1 force;

这里确实没有错误提示里所指的对象。

解决办法,把这个SP对应的SYS_PLSQL对象全删除:
SQL> drop type SCHEMA.SYS_PLSQL_6459_15_1 force;

Type dropped.

SQL> drop type SCHEMA.SYS_PLSQL_6459_DUMMY_1 force;

Type dropped.

SQL> alter package SCHEMA.PACKAGENAME compile;

Package altered.

确认一下,有没有重新生成SYS_PLSQL:

SQL> select 'drop type SCHEMA.'||object_name||' force;' from dba_objects where object_name like 'SYS_PLSQL_6459%';
drop type SCHEMA.SYS_PLSQL_6459_DUMMY_2 force;
drop type SCHEMA.SYS_PLSQL_6459_15_2 force;
drop type SCHEMA.SYS_PLSQL_6459_DUMMY_2 force;

这就对应Package header里定义了三个TYPE:
TYPE invcur_t IS REF CURSOR RETURN trinvoicemaster%ROWTYPE;
TYPE inv_lines IS TABLE OF trinvoicemaster%ROWTYPE;
FUNCTION split_invoice ( cur_invoicemast in invcur_t ) RETURN inv_lines pipelined;

要删除这些SYS_PLSQL有时比较难的,记得有次用命令死活也删除不了,最后借助TOAD,在图形里把它删除了。Package所引用的SYS_PLSQL对象怎么会不见了,我记得这是一个BUG. 10G之后,就没有碰到这个问题了。

 来源:http://blog.itpub.net/195110/viewspace-713862/
0 0