Oracle数据库 编译全库失效对象的几种方式

一.使用Oracle自带脚本编译

正常sqlplus中我们可以调用数据库自带的脚本来编译全库失效对象

@?/rdbms/admin/utlrp.sql

也可以在数据库服务器中通过crontab调用此脚本达到定时编译
编写编译脚本

vim invalid_compile.sh

sqlplus / as sysdba << EOF
@?/rdbms/admin/utlrp.sql
EOF

添加定时任务(这里我用的是root用户,如果是oracle用户不用写su - oracle -c)

crontab -e
30 23 * * * su - oracle -c 'sh /home/oracle/invalid_compile.sh'

二.编写拼接SQL编译

编写拼接sql 来批量手动编译

select 'ALTER ' || OBJECT_TYPE || ' ' || OWNER || '.' || OBJECT_NAME || ' COMPILE;' from dba_objects where status = 'INVALID'; 

三.存储过程+调度任务定时编译

– 编译失效对象的存储过程

CREATE OR REPLACE PROCEDURE compile_all_invalid_objects AS
BEGIN
  FOR obj IN (SELECT object_name, object_type,owner
              FROM all_objects
              WHERE status = 'INVALID')
  LOOP
    EXECUTE IMMEDIATE 'ALTER ' || obj.object_type || ' "' || obj.owner || '"."' || obj.object_name || '" COMPILE';
  END LOOP;
END;

– 创建调度任务

BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'compile_invalid_objects_job',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN compile_all_invalid_objects; END;',
    start_date      => TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD') || ' 23:30', 'YYYY-MM-DD HH24:MI'),
    repeat_interval => 'FREQ=DAILY; BYHOUR=23; BYMINUTE=30;',
    enabled         => TRUE);

– 打开输出结果

  DBMS_SCHEDULER.ENABLE('compile_invalid_objects_job');

– 提交更改

  COMMIT;
  -- 输出成功消息
  DBMS_OUTPUT.PUT_LINE('Scheduled job "compile_invalid_objects_job" has been created.');
EXCEPTION
  WHEN OTHERS THEN
    -- 输出错误消息
    DBMS_OUTPUT.PUT_LINE('Error creating scheduled job: ' || SQLERRM);
    -- 回滚更改
    ROLLBACK;
END;
/
posted @   学无止境的小一  阅读(38)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示