包编译卡住的终极解决办法

本文介绍了数据库开发中遇到包编译卡死的问题及其解决方法。通过查看v$access和DBA_DDL_LOCKS视图,确认并解决持有DDL锁的会话,使用alter system kill session来结束阻碍编译的会话。同时,文章提供了一套实验步骤以验证理论,并提到了在kill会话后可能存在的问题及解决方案。
摘要由CSDN通过智能技术生成

在数据库开发过程中,经常遇到一个很烦躁的现象:刚修改好的包一编译就卡死了,PL/SQL变成一片空白,又不忍心关闭,这可是耗死多少脑细胞才写出来的!!!只好去求DBA帮忙解决,可是人家也不是每次都会耐心帮你解决,结果经常碰一鼻子灰,所以了,求人不如求己,下面就让我们自己学会去解决这个烦人的问题。。

首先我们先了解下与这种卡死现象相关的几个视图:

1)v$access

V$ACCESS displays information about locks that are currently imposed on library cache objects. The locks are imposed to ensure that they are not aged out of the library cache while they are required for SQL execution.

v$access里存放的是数据字典缓存中的对象,包括表,包,游标等(库缓存缓存的是最近执行的代码),所以你当前编译的包是可以查到的,执行完毕后一般就会v$access中消失。不过有种情况要注意下,如果一个session执行了包A后就停下来了(session对应的状态为INACTIVE),执行完毕后,session与包A可能还是存在于v$access中,直到这个session再次执行另外的sql,这种情况是不会影响你包的编译。所以当你看到v$access中有你要编译的包,不要惊慌,它不一定是凶手,去v$session中确认下状态再做判断。

2)DBA_DDL_LOCKS

DBA_DDL_LOCKS lists all DDL locks held in the database and all outstanding requests for a DDL lock.

当你编译包时,oracle就会对这个包加个DDL锁,同时也会这个包所引用的对象加DDL锁(与DDL锁对应的是DML锁,记录在V$locked_object里,sql语句执行完毕后,DML锁不会消失,必须commit或rollback)


下面我们做几个实验来验证上面的理论(其实上面也是我从别处看到的,对不对还得自己去验证)

1. 用PL/SQL随便调试个sp,让它停在调试状态;


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值