大侠们好:
    我在oracle里写了一个后台的package,结果前两天自己invalid掉了,但当时没有发现这个问题,结果造成前台查询时,有关调用这个包的sql均很慢,很长时间都不响应!
    我想知道的那位大侠提供一个追踪过程的思路,即从前台出问题时起,可以追踪到是因为package invalid 了,造成前台的查询很慢!
   谢谢!

解决方案 »

  1.   

    select * from dba_objects 这个系统视图里记录这个状态的。。
    建议从这里读取,最简单。
      

  2.   

    当sql执行很慢时,我还不知道是因为package invalid了呢!我就是要根据sql执行很慢这个现象,然后追踪发现至,原来是由于package invalid了!
      

  3.   

    1、不管是包,还是存储过程invalid,在其被调用时,会自动被重新编译的。
    除非自动重新编译不通过,则会出现问题。
    2、当然,最好不要依赖自动重新编译,在多用户并发环境中,可能会造成因对象
    锁定等并发问题。
    3、可以编写一个程序编译无效对象,并通过JOB定时调用,并可发送告警邮件。
    简单思路:
    1)通过视图dba_objects取得无效对象。
    2)使用alter <对象类型> <名称> compile;语句进行编译。
      注意,如果有依赖关系对象级联失效,需要通过dba_dependencies视图取得最底层失效对象先进行编译,
      然后才能编译上层对象。
    3)使用utl_smtp中的方法发送邮件。
    4)另外,oracle还提供了包dbms_utility.compile_schema来编译整个schema(用户)下的无效对象,
      省去了1)2)步的麻烦。
      

  4.   

    谢谢tangren的回复,有一个小问题问一下:
       如何查看那些对象被锁定了,然后再看一下这个锁定的对象正大被那些session请求呢?
      

  5.   

       我知道了,通过查询v$locked_object视图即可知道那些对象被锁定了,被那个用户及os用户锁定的,并可以查看到有那些在等待中的session!