본문 바로가기

데이터베이스/Oracle

[오라클] INVALID 상태 OBJECT 컴파일 방법

오라클 사용자의 경우 INVALID 상태인 OBJECT들을 종종 볼 수 있는데, 연관있는 OBJECT들이 ALTER나 DROP 되었을 경우 의존관계가 깨지면서 발생합니다.

대게는 실행 시 자동으로 컴파일 되지만, 오류가 있다면 컴파일이 되지 않고 에러가 발생합니다.

해당 OBJECT들이 INVALID 상태가 되면 실행이 불가하기 때문에 모니터링 프로시저를 작성해 INVALID 상태인 OBJECT들이 있는지 주기적으로 확인하는 것도 하나의 방법입니다.

 

- OBJECT TPYE : VIEW, FUNCTION, TRIGGER, PROCEDURE, PACKAGE, PACKAGE BODY

 

그럼 INVALID 상태의 OBJECT를 확인하는 방법을 알아보겠습니다.

 

1. INVALID 상태의 OBJECT 확인

SELECT OBJECT_TYPE,OWNER,OBJECT_NAME, STATUS
FROM ALL_OBJECTS
WHERE OBJECT_TYPE IN ('VIEW','FUNCTION','TRIGGER','PROCEDURE','PACKAGE','PACKAGE BODY')
	AND STATUS='INVALID' ORDER BY 1;

위 쿼리를 실행하면 OBJECT 종류, 스키마, 오브젝트명, 상태를 확인할 수 있습니다.

2. INVALID 상태 OBJECT 컴파일

ALTER VIEW "뷰명" COMPILE;
ALTER FUNCTION "함수명" COMPILE;
ALTER TRIGGER "트리거명" COMPILE;
ALTER PROCEDURE "프로시저명" COMPILE;
ALTER PACKAGE "패키지명" COMPILE;

뷰, 함수, 트리거, 프로시저, 패키지 등을 위 쿼리와 같이 컴파일을 할 수 있습니다.

 

INVALID 상태의 OBJECT들을 조회하고 하나하나 컴파일을 하기에는 시간이 오래 걸리니, 아래 쿼리로 컴파일 구문을 조회해 실행하는 것도 방법입니다.

SELECT'ALTER '||DECODE(OBJECT_TYPE,'PACKAGE BODY','PACKAGE',OBJECT_TYPE)||' '||OWNER||'.'||OBJECT_NAME||' COMPILE'||DECODE(OBJECT_TYPE,'PACKAGE BODY',' BODY;',';') AS QUERY
FROM DBA_OBJECTS
WHERE OBJECT_TYPE IN ('VIEW','FUNCTION','TRIGGER','PROCEDURE','PACKAGE','PACKAGE BODY')
	AND STATUS = 'INVALID'
ORDER BY OWNER, DECODE(OBJECT_TYPE,'VIEW','A','FUNCTION','B','TRIGGER','C','PROCEDURE','D','PACKAGE','E','PACKAGE BODY','F'), OBJECT_NAME;

특정 OBJECT들만 컴파일을 할 경우에는 WHERE절에 조건을 하나 추가해서 해당 OBJECT들만 컴파일을 해도 됩니다.

 

이렇게 오라클에서 INVALID 상태인 OBJECT들을 확인하는 방법과 컴파일 하는 방법에 대해 알아보았습니다.

특정 OBJECT들이 동작하지 않을 때 INVALID 상태인지 여부를 확인해보시기 바랍니다.