一般情况下,我们如果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的错了。
电神魔傀2街机免费版 官方版v1.2.1
下载三国战纪2手游腾讯渠道服 安卓版v2.41.0.0
下载三国战纪2手游抖音渠道服 安卓版v2.41.0.0
下载三国战纪2折扣服 安卓版v2.41.0.0
下载叫我大掌柜小米版 安卓版v7.4.4
叫我大掌柜小米版是这款模拟经营类手游的渠道服版本,在此版本中
cooking fever正版 安卓最新版v23.0.2
cooking fever正版是一款非常好玩的模拟经营类手游
咖啡厅的生活故事 最新版v1.7
咖啡厅的生活故事是一款模拟经营游戏,玩家们在游戏中可以经营一
迅猛龙模拟器金币不减反增版 v1.1.8
迅猛龙模拟器无限金币版是一款动物模拟类游戏,玩家们将在游戏中
泽塔奥特曼升华器免广告版 v1.4
泽塔奥特曼升华器去广告版是游戏的破解版本,在该版本中为玩家去