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;
/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?