写了一个包,在执行时一执行就死掉,PL/SQL无响应,在当前用户下发现死锁,后来将包中的存储过程留下一个(其他都注释掉了),只执行非常简单的一个游标,还是不行,在Toad9.7下发生同样的事情,即使将oracle服务重启后在编译还是如此,找不到解决办法,各位高手多多帮忙,在线等,包代码如下:
包头:
create or replace package IMP_CTAIS_0215 AS
procedure p_main;
END IMP_CTAIS_0215;包体:
create or replace package body IMP_CTAIS_0215 is  procedure p_main is
begin
  p_imp_organ_stru;
 commit;
end p_main;
--------------存储过程-------------
procedure p_imp_organ_stru is  cursor cur_jg is 
     select * 
    from table_name
    where yxbz = 'Y'
    and xybz = 'Y'
    and jg_id!='244000000' 
    order by jg_id;  c_jg_count     integer; -- 是否存在begin
  for jg_rec in cur_jg loop    select count(a.organ_id) -- 是否已经存在
    into c_jg_count
    from pub_organ a
    where a.organ_id=jg_rec.jg_id;
    if (c_jg_count=0) then
    dbms_output.put_line('[p_imp_organ_stru]是否已经存在:'||jg_rec.jg_id||'~~count值'||c_jg_count);
    end if;
  end loop;
end p_imp_organ_stru ;
-------------------存储过程结束---------------------
end IMP_CTAIS_0215 ;

解决方案 »

  1.   

    是不是dbms_output.put_line超长了。你单独执行过程,看看有没有错误提示
      

  2.   

    单独执行语句都没有问题,而且我在执行dbms_output.put_line前加了
    dbms_output.enable(999999999999);  
    如果是这个超长了肯定报错了,也不会出现不响应的情况吧。
    继续等待……
      

  3.   

    这些我都试过了,似乎不是语句的问题,查看了一些关于锁的资料,好像是在进行DML操作时数据库加锁导致的,没有仔细研究,等休息时间再仔细的研究一下吧,现在把包分解了,在慢慢的调试呢,谢谢你了。
      

  4.   

    这种情况是因为包体的前台程序在调用,所以后台再编译包体时会无响应,解决办法:
    以sys身份登录,查询SELECT DISTINCT '(' || s.sid || ') - ' || username AS "(session) - username"
        FROM V$SESSION s, sys.x$kglob o, sys.x$kglpn p
       WHERE upper(o.kglnaobj) LIKE upper('%不能编译的包体%')
         AND p.kglpnhdl = o.kglhdadr
         AND s.SADDR = p.kglpnuse;
    找出这个sid,kill掉,应该就可以编译了。