oracle中alter package时包含drop操作报错ORA-20008

一般情况下,我们如果alter操作,是不会触发drop操作。但是在某些特别的情况下,alter package的操作在递归SQL中,是能看到drop操作的。

我们这个环境中有trigger,一旦有drop操作的时候,是会报错ORA-20008,且被阻拦的。

我们看到下面,我们只是alter package而已。但是在关系到其关联对象的时候,竟然发生了drop的动作:
SQL> alter package MYUSER1.MYP_IIA_IS_PACKAGE compile body;
alter package MYUSER1.MYP_IIA_IS_PACKAGE compile body
ORA-04045: errors during recompilation/revalidation of MYUSER1.MYP_ABCD_OUN_PACKAGE
ORA-20008: 该对象被其他对象依赖,不能删除,请检查dba_dependencies!
ORA-06512: at line 31

在10046的trace中:

PARSING IN CURSOR #10 len=49 dep=2 uid=353 oct=78 lid=353 tim=24012153459082 hv=0 ad='7d9f7d28'
drop type "MYUSER1".SYS_PLSQL_315410_1679_1 force
END OF STMT

而引起这个问题的原因,是在package中,使用pipelined的管道函数,会自动产生SYS_PLSQL_%s_%c_%v的type。%v表示version 。

这些type在package重新编译的时候,需要regenerate的type,会循环的删除old version的type,再create new version type。也就是说,在编译的时候,会先drop SYS_PLSQL_%s_%c_1,再create SYS_PLSQL_%s_%c_2;如果再编译,会drop SYS_PLSQL_%s_%c_2,再create SYS_PLSQL_%s_%c_1……

即在myuser1.myp_abcd_oun_package中有使用pipelined,所以会产生这样的type:

create or replace package body myuser1.myp_abcd_oun_package is
……
function splitstr(p_string in varchar2, p_delimiter in varchar2)
return str_split
pipelined
as
v_length number := length(p_string);
v_start number := 1;
v_index number;
begin
while(v_start <= v_length)
loop
v_index := instr(p_string,

而我的package,myuser1.MYP_IIA_IS_PACKAGE,是会引用到myp_abcd_oun_package,所以编译MYP_IIA_IS_PACKAGE的时候,也会regenerate的type。

解决方法:

先把myp_abcd_oun_package编译成功,在编译其他的package,就不会需要regenerate type,也就不会再报关于那个trigger的错了。

时间: 2024-11-01 22:09:26

oracle中alter package时包含drop操作报错ORA-20008的相关文章

oracle中alter package时包含drop操作

一般情况下,我们如果alter操作,是不会触发drop操作.但是在某些特别的情况下,alter package的操作在递归SQL中,是能看到drop操作的. 我们这个环境中有trigger,一旦有drop操作的时候,是会报错ORA-20008,且被阻拦的. 我们看到下面,我们只是alter package而已.但是在关系到其关联对象的时候,竟然发生了drop的动作: SQL> alter package MYUSER1.MYP_IIA_IS_PACKAGE compile body; alter

svn-在Myeclipse中保存代码时,SVN总是报错,已百度,答案五花八门。求指导 谢谢!

问题描述 在Myeclipse中保存代码时,SVN总是报错,已百度,答案五花八门.求指导 谢谢! 写完一段代码按保存(CTRL+S)时 总是报这样的错误 解决方案 http://zhidao.baidu.com/link?url=gLO2oBMgYsBRCUQVbUzkuWP3geLbG-_cBa6bdDSnxrVNkrNp8rnli7U0mGz-6SW2_qccL6tVVNPepFEaoCfIu6rApe2lVmVFlKGBAbDlCJ_ http://zhidao.baidu.com/lin

如何取得oracle中日期的时分秒啊?

问题描述 如何取得oracle中日期的时分秒啊?SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(f.format(obj[3]));进行了日期格式转换,打印出来的是 2012-03-19 00:00:00 但是数据库里面有正常的时分秒,怎么处理啊? 问题补充:yeqing4562011 写道 解决方案 LZ可测试下以下代码public static void main

mybatis 向oracle 采用foearch批量插入,如果包含clob字段报错

问题描述 mybatis 向oracle 采用foearch批量插入,如果包含clob字段报错 mybatis 向oracle 采用foearch批量插入 如下代码: insert into (id,name,clobs) SELECT #{item.id},#{item.name},#{item.clobs} FROM DUAL 报错信息:仅能绑定要插入 LONG 列的 LONG 值 可是如果采用普通的insert into (id,name,clobs) values(#{id},#{nam

eclipse启动项目时遇到问题,报错!

问题描述 eclipse启动项目时遇到问题,报错! FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197) ERROR: transport error 202: connect failed: Connection timed out ERROR: JDWP Transport dt_socket failed to initialize,

java中网络编程关于使用ObjetInputStream传输报错的问题,求大神指点

问题描述 java中网络编程关于使用ObjetInputStream传输报错的问题,求大神指点 以下贴出来的代码为通过ObjectInputStream(OutputStream)在客户端与服务器端之间交互时传输的对象,提供的图片中一个是客户端的代码片段,一个是服务器端的代码片段. 现在问题出在当客户端输完账号密码点击确定时,客户端卡死(应该是线程阻塞).服务器端抛出异常 :java.lang.ClassNotFoundException: com.wish.data.TransferObjec

结构体链表-c语言链表,输入输出正确但是删除操作报错

问题描述 c语言链表,输入输出正确但是删除操作报错 #include#include#define len sizeof(struct student) struct student{int num;float score;struct student *next;}; struct student *creat(void) // 建立{struct student *p1*p2*head;int n=0;p1=p2=(struct student *)malloc(len);scanf("&q

Android线程中设置控件的值提示报错的解决方法_Android

本文实例讲述了Android线程中设置控件的值提示报错的解决方法.分享给大家供大家参考,具体如下: 在Android线程中设置控件的值一般会与Handler联合使用,如下: package com.yarin.android.Examples_04_15; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import andro

Android线程中设置控件的值提示报错的解决方法

本文实例讲述了Android线程中设置控件的值提示报错的解决方法.分享给大家供大家参考,具体如下: 在Android线程中设置控件的值一般会与Handler联合使用,如下: package com.yarin.android.Examples_04_15; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import andro