问题提出:
  有一个后台自动执行的存储过程,由于它每天晚上要操作至少几百条数据,每条数据执行时要涉及到四五个表,按理来说应该还是蛮快的,可是我执行后,有时候能成功执行,有时候只能执行一半或一部分就一直显示执行状态。我的存储过程是执行一条就commit一条的,所以我可以看出它执行了多少内容。
  比如我有217条数据需要执行,可是执行到100条的时候就不执行了,存储过程执行就一直执行不下去,而此时修改调试存储过程都无反应,想停止执行也不行。
  请大家发表发表意见,看看有啥问题,另外该如何停止该存储过程的执行?问题分析:
  尝试用杀掉该会话的方式使该存储过程释放出来。
  SELECT /*+ rule */ s.username,  decode(l.type,'TM','TABLE LOCK',                'TX','ROW LOCK',                NULL) LOCK_LEVEL,  o.owner,o.object_name,o.object_type,  s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser  FROM v$session s,v$lock l,dba_objects o  WHERE l.sid = s.sid  AND l.id1 = o.object_id(+)  AND s.username is NOT NULL
可以查找被锁定的进程
   或者简单的利用select sid,serial# from v$session where username='WZDBA'来查询出相应的进程。
  
   再利用alter system kill session '44,956'来杀进程。杀完后,进程显示killed,但是存储编译,删除依然无反应。

解决方案 »

  1.   

    建议:
    1.无反应的时候,查询v$session_wait得到无反应的原因
    2.死锁的时候如果杀session,oracle释放资源的速度比杀server process慢
      

  2.   

    有谁能说说v$session_wait这个视图表
      

  3.   

    同意 drabit(square)的说法,应该去找出问题的根本在那里,因为你有时候可以成功,就可以说明一切。看看你执行过程的时候,是不是有其他在操作这几个表!
      

  4.   

    '上次我执行250条数据,执行成功了100条后就再也没有反应了,存储过程执行肯定不会有错误的。' ‘肯定’说的不正确拉
    我基本能够判断是你的存储过程进入了死循环(比如用到游标,退出游标的条件限定不好);也有可能代码产生死锁
    对于死锁,可能你查找到一个锁,再利用alter system kill session '44,956'来杀进程,但是杀掉后,你的代码可能马上又产生一个锁。 至于为什么有时候会成功,这个与表中的数据应该有关系,也就是说,如果你数据库中的某些表具有某些数据,那么你的procedure就会有问题
      

  5.   

    我认为你该从v$session的lockwait找到真正导致死锁的进程,找出这个进程导致死锁的原因,杀掉那个进程。而不是杀掉后来的进程。或者你可以把你的过程paste上来让大家看看。
      

  6.   

    1、先拿出你的处理过程来看看,不要让大家猜
    2、要想快有个馊主意,可以在session中查找出操作系统级的进程ID然后kill掉(强烈建议不要这么做)
      

  7.   

    你首要的工作是要定位故障的瓶刭.
    你可以从 v$session_wait中 查找EVENT , WAIT_TIME  ,   SECONDS_IN_WAIT, STATE  
           从 v$session_cursor_cache 再看看游标的问题最后再决定哪些SESSION是要杀死的,这些SESSION为什么这么讨厌呢