搞一游标,取出所有无效的存储过程名,
select object_name from user_objects where object_type='PROCEDURE' and status='INVALID';
然后组装编译的sql语句:
alter procedure xxxxx compile;
然后用execute immediate 运行组装出来的语句。
没问题的自然就编译通过,有问题的那你就改改吧.上面的代码运行两遍应该可以解决“需要注意存储过程间的互相调用关系”这个要求。
select object_name from user_objects where object_type='PROCEDURE' and status='INVALID';
然后组装编译的sql语句:
alter procedure xxxxx compile;
然后用execute immediate 运行组装出来的语句。
没问题的自然就编译通过,有问题的那你就改改吧.上面的代码运行两遍应该可以解决“需要注意存储过程间的互相调用关系”这个要求。
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
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;
/
再将其放在任务计划里,设定执行时间,可以编译n次;
或者将上面做的存储过程放在Job里,仍然可以编译n次。