今天碰到一个问题很棘手,我更改了存储过程,只是添加个注释,但是存储过程编译就一直在执行,我也不知道具体看那里出错了,看V$SESSION,V$SESSION_WAIT,V$LOCKED_OBJECT好像都不行,那位高手给个解决的方法!

解决方案 »

  1.   

    2 种可能:
    1) plsql developer的BUG, 重启再编译2)有别的Session在执行这个SP。可用dba_ddl_locks查看
      

  2.   

    这个pl/sql developer的问题,强制中止,重启再看一下
      

  3.   

       1 我用的是TOAD ,没有用plsql developer.
       2 我想问的是如果dba_ddl_locks 里面存在锁,如何解锁?
       3 难道通过dba_ddl_locks 的SID 关联V$SESSION SID,再得到SID,SERIAL#,再通过alter system kill session 'sid,serial#'杀掉?
       4 能否告诉我定位到具体的那个存储过程,具体的那张表不?
      

  4.   

    ddl锁:假如有一个SP,我在执行时,就加一个DDL锁。这个DDL锁的作用就是防止别人修改这个SP
    -----------------------------------------------------------------------------------
    解决方式就是:  3 难道通过dba_ddl_locks 的SID 关联V$SESSION SID,再得到SID,SERIAL#,再通过alter system kill session 'sid,serial#'杀掉?
      

  5.   

    如楼上所说DDL锁,你可以做一个测试就是当一个过程在运行过程中(你可以用PL/SQL进行断点调试到中间),通途开启另一个SESSION去修改这个过程,肯定会出现和你一样的情况。此时可能有人在调试过程,可能有程序在调用,类似有些是高频繁调用或者JOB(10秒)调用,而程序几乎执会达到这个周期,此时过程处于一直执行状态,或者有过程在等待一个表的锁没有执行完,如一张表被FOR UPDATE,而过程需要修改这个表的一个字段,就会长期等。
    通过dba_ddl_locks 的确可以查询出该对象被锁住(单机版可以),不过在运行时系统我估计你几乎查询不出来数据,每一个瞬间都有N多对象可能被锁住,所以查询的时候基本都定在那里动都不动,掉不出来数据,一般需要将中端关闭掉才行。如果的确要弄,这种需要排查很多问题,一般可以先把应用程序(可能有多个终端)和JOB停掉,再查询SESSION,将当前用户的干掉(写个循环语句),不要把当前SESSION干掉了,根据登录时间和登录用户过滤。这个时候修改问题不大,不过这个问题是解决掉了,那么要么是程序有点点不对,要么程序员操作习惯不好或者结构设计中将太多分离的东西合并在一起,可以排查一下。
      

  6.   

    看你的操作系统是什么,因为有时候你查看SESSION状态时KILLED的话,其实在系统中是还有进程在调用的。一般UNIX系统的话,可用下面方式解决。1、查看对象是否在调用中:select * from v$access
    where object ='过程名或过程所在的包名';2、查调用过程的系统进程ID:
    --查v$session视图
    select sid,serial#,paddr from v$session where sid='第一步中查到的sid';
    --查v$process视图
    select spid from v$process where addr='刚才查到的paddr';3.再到操作系统中将对应的SPID进程KILL掉就可以了。
      

  7.   

    一般是有人在用,比如debug停在那里了还有一种情况,看一下服务器是否满负荷运行,杀掉占用cpu较高的进程