搞一游标,取出所有无效的存储过程名,
select object_name from user_objects where object_type='PROCEDURE' and status='INVALID';
然后组装编译的sql语句:
alter procedure xxxxx compile;
然后用execute immediate 运行组装出来的语句。
没问题的自然就编译通过,有问题的那你就改改吧.上面的代码运行两遍应该可以解决“需要注意存储过程间的互相调用关系”这个要求。

解决方案 »

  1.   

    SQL>spool c:\test.txt
    SQL>set heading off
    SQL>set feedback off
    SQL>select 'alter procedure ' || object_name || ' compile;'
    SQL>from user_object where status='INVALID' and object_type='PROCEDURE';
    SQL>spool off;
    SQL>set heading on
    SQL>set feedback on
    SQL>@c:\test.txt
      

  2.   

    declare
    cursor t_sor is
    select object_name from all_objects where object_type='PROCEDURE' AND owner='TEST';
    begin
    for v_sor in t_sor loop
    DBMS_DDL.ALTER_COMPILE ('PROCEDURE', 'TEST',v_sor.object_name);
    end loop;
    end;
    /
      

  3.   

    将这上面做c:\test.txt的这个文件放在.bat文件里,
    再将其放在任务计划里,设定执行时间,可以编译n次;
    或者将上面做的存储过程放在Job里,仍然可以编译n次。