SQL*Plus 臨時腳本法
SPOOL ExecCompProc.sql
SELECT 'ALTER PROCEDURE ' || object_name || ' COMPILE;'
FROM all_objects
WHERE status = 'INVALID'
AND object_type = 'PROCEDURE';
SPOOL OFF
@ExecCompProc.sql
永久存儲過程版(含錯誤記錄)
CREATE OR REPLACE PROCEDURE zl_compile_invalid_procedure AS
v_sql VARCHAR2(200);
BEGIN
FOR x IN (SELECT object_name
FROM all_objects
WHERE status = 'INVALID'
AND object_type = 'PROCEDURE') LOOP
v_sql := 'ALTER PROCEDURE ' || x.object_name || ' COMPILE';
BEGIN
EXECUTE IMMEDIATE v_sql;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('FAILED: ' || x.object_name || ' - ' || SQLERRM);
END;
END LOOP;
END;
/
-- 執行前開啟輸出
SET SERVEROUTPUT ON
EXEC zl_compile_invalid_procedure;
擴充建議
- 同理可寫
FUNCTION、PACKAGE、TRIGGER、VIEW 版本。
- 生產庫建議先在測試環境驗證,避免編譯鎖定影響業務。
- 搭配
UTL_RECOMP.RECOMP_SERIAL()(10g+)可遞歸重編譯所有失效物件。