Oracle存储过程INVALID,重新编译很慢解决方案
1、查询对象表 db_object_cache ,name为对象名(表名/方法名/过程名)
--检查对象是否被锁
select * from v$db_object_cache where name=upper('proc_wip_al_tran_inf_half_back') and locks!=0;
发现有5个lock

2、查询被锁对象的SID
先设置数据库session _optimizer_cartesian_enabled 为 false,解决后再开启
这一步查询 v\(access 可能会卡住 解决方案: 查询视图v\)access很慢: https://blog.csdn.net/weiwangsisoftstone/article/details/39154873
--得到被锁对象的SID等信息
select * from v$access where object=upper('proc_wip_al_tran_inf_half_back');
-- 设置session _optimizer_cartesian_enabled 为 false
alter session set "_optimizer_cartesian_enabled"=false;

3、通过 SID 查到 SERIAL# 等详细信息
--通过SID查询到 SERIAL# ,此处用子查询会很慢,直接写查询结果 比较快
select sid,serial#,paddr from v$session where sid in(
--select sid from v$access where owner='ALMES' and object=upper('proc_wip_al_tran_inf_half_back')
'404',
'3820',
'3830',
'2816'
);
4、结束致使对象被锁的会话
--alter system kill session 'SID,SERIAL#' immediate; --杀掉会话
alter system kill session '404, 2050' immediate;
alter system kill session '2816,29326' immediate;
alter system kill session '3820,16795' immediate;
alter system kill session '3830,24513' immediate;

浙公网安备 33010602011771号