資料庫升級、Patch 套用、Schema 變更等操作後,常導致 PL/SQL 物件(Procedure、Function、Package、Trigger、Type、View)變為 INVALID 狀態。Oracle 提供兩種主要方式重新編譯:自動化腳本 utlrp.sql 以及手動 ALTER ... COMPILE 指令。
適用版本:Oracle 8i 及以上版本
腳本位置:$ORACLE_HOME/rdbms/admin/utlrp.sql
執行步驟:
@$ORACLE_HOME/rdbms/admin/utlrp.sql腳本會平行編譯資料庫中所有現有的 PL/SQL 模組,並自動處理相依關係,是資料庫升級後的標準作業。
當僅需修復少數物件,或 utlrp.sql 執行後仍有殘留無效物件時,使用手動指令:
ALTER PROCEDURE procedure_name COMPILE;
ALTER FUNCTION function_name COMPILE;
ALTER PACKAGE package_name COMPILE;
ALTER PACKAGE package_name COMPILE BODY;
ALTER TRIGGER trigger_name COMPILE;
ALTER VIEW view_name COMPILE;
ALTER TYPE type_name COMPILE;
ALTER PROCEDURE p1 COMPILE DEBUG; 保留除錯資訊。ALTER PROCEDURE p1 COMPILE PLSQL_CODE_TYPE=NATIVE; 切換為原生編譯。SELECT * FROM USER_ERRORS WHERE NAME = 'OBJECT_NAME'; 查看詳細錯誤訊息。SELECT 'ALTER ' || OBJECT_TYPE || ' ' || OBJECT_NAME || ' COMPILE;'
FROM USER_OBJECTS
WHERE STATUS = 'INVALID'
ORDER BY OBJECT_TYPE, OBJECT_NAME;
utlrp.sql。DBA_OBJECTS 中 STATUS = 'INVALID' 的物件。掌握 utlrp.sql 與 ALTER COMPILE 兩套機制,能快速恢復 PL/SQL 物件效能,確保應用程式穩定運行。