|
|
1.查找无效对象
SELECT owner, object_name, object_type, status
FROM all_objects
WHERE status = 'INVALID'
ORDER BY owner, object_type, object_name;
2.编译无效对象
-- 重新编译存储过程
ALTER PROCEDURE schema_name.procedure_name COMPILE;
-- 重新编译函数
ALTER FUNCTION schema_name.function_name COMPILE;
-- 重新编译包
ALTER PACKAGE schema_name.package_name COMPILE;
-- 重新编译视图
ALTER VIEW schema_name.view_name COMPILE;
--定时编译
vim invalid_compile.sh
sqlplus / as sysdba << EOF
@?/rdbms/admin/utlrp.sql
EOF
crontab -e
30 23 * * * su - oracle -c 'sh /home/oracle/invalid_compile.sh' --如果是使用的oracle用户则不用写 su - oracle -c
--批量编译所有无效对象:(使用UTL_RECOMP包(Oracle自带)或动态SQL批量编译所有无效对象)
---方法1:用数据库自带脚本编译全库无效对象(需要DBA权限)
@?/rdbms/admin/utlrp.sql
或:
BEGIN
UTL_RECOMP.RECOMP_SERIAL();
END;
/
--- 方法2:动态生成并执行编译脚本(还没测)
BEGIN
FOR obj IN (
SELECT owner, object_name, object_type
FROM all_objects
WHERE status = 'INVALID'
AND owner = 'YOUR_SCHEMA_NAME' -- 替换为实际模式名
) LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER ' || obj.object_type ||
' ' || obj.owner || '.' || obj.object_name || ' COMPILE';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('编译失败: ' || obj.object_type || ' ' || obj.owner || '.' || obj.object_name);
END;
END LOOP;
END;
/
|
|