Oracle ORA-06575 오류 원인과 해결 방법 완벽 가이드

ORA-06575
2026년 09월 03일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-06575 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-06575 Package or function is in an invalid state 는?

ORA-06575 에러는 Oracle에서 패키지(Package), 함수(Function), 프로시저(Procedure), 트리거(Trigger) 등의 PL/SQL 객체가 유효하지 않은 상태(INVALID)일 때 해당 객체를 호출하거나 실행하려 할 때 발생합니다. 일반적으로 의존 객체(테이블, 뷰, 다른 패키지 등)가 변경되거나 삭제된 후 재컴파일이 이루어지지 않았을 때 이 에러가 나타납니다. 운영 환경에서 DDL 작업(ALTER, DROP 등) 이후 갑자기 애플리케이션 오류가 발생한다면 이 에러를 가장 먼저 의심해야 합니다.


주요 발생 원인

1. 의존 객체의 변경 또는 삭제

패키지나 함수가 참조하는 테이블, 뷰, 시퀀스, 다른 패키지 등이 ALTER 또는 DROP 명령으로 변경되거나 삭제되면 Oracle은 해당 PL/SQL 객체를 자동으로 INVALID 상태로 표시합니다. 예를 들어, 특정 테이블에 컬럼을 추가하거나 컬럼 타입을 변경한 경우, 그 테이블을 참조하는 모든 패키지와 함수가 INVALID 상태가 될 수 있습니다. 이 경우 객체를 재컴파일해야만 정상 실행이 가능합니다.

2. 컴파일 오류가 있는 상태로 생성된 객체

CREATE OR REPLACE 구문으로 PL/SQL 객체를 생성할 때 문법 오류나 참조 오류가 있더라도 Oracle은 경고(Warning: compiled with compilation errors)를 출력하면서 객체를 INVALID 상태로 저장합니다. 이런 상태에서 해당 객체를 호출하면 즉시 ORA-06575가 발생합니다. 특히 신규 개발자들이 에러 없이 생성된 것으로 착각하고 배포하는 경우가 많아 주의가 필요합니다.

3. 권한(Privilege) 변경 또는 동의어(Synonym) 문제

패키지 내에서 참조하는 객체에 대한 권한이 회수(REVOKE)되거나, 동의어(Synonym)가 삭제·변경된 경우에도 객체는 INVALID 상태가 됩니다. Role을 통해 부여된 권한은 PL/SQL 객체 내에서 직접 사용할 수 없기 때문에, Role 기반 권한만 가진 경우 컴파일은 되더라도 런타임에 오류가 발생할 수 있습니다. 이 경우 직접 권한(Direct Grant)을 부여해야 합니다.


해결 방법

1단계: INVALID 객체 현황 파악

먼저 현재 스키마 또는 전체 데이터베이스에서 INVALID 상태인 객체를 조회합니다.

-- 현재 스키마의 INVALID 객체 조회
SELECT object_name,
       object_type,
       status,
       last_ddl_time
FROM   user_objects
WHERE  status = 'INVALID'
ORDER  BY object_type, object_name;

-- DBA 권한으로 전체 스키마 INVALID 객체 조회
SELECT owner,
       object_name,
       object_type,
       status,
       last_ddl_time
FROM   dba_objects
WHERE  status = 'INVALID'
ORDER  BY owner, object_type, object_name;

2단계: 개별 객체 재컴파일

특정 객체를 수동으로 재컴파일합니다.

-- 패키지 스펙(Spec) 재컴파일
ALTER PACKAGE my_package COMPILE;

-- 패키지 바디(Body) 재컴파일
ALTER PACKAGE my_package COMPILE BODY;

-- 함수 재컴파일
ALTER FUNCTION my_function COMPILE;

-- 프로시저 재컴파일
ALTER PROCEDURE my_procedure COMPILE;

-- 트리거 재컴파일
ALTER TRIGGER my_trigger COMPILE;

-- 뷰 재컴파일
ALTER VIEW my_view COMPILE;

3단계: 컴파일 에러 원인 파악

재컴파일 후에도 INVALID 상태라면 실제 컴파일 에러를 확인합니다.

-- 마지막 컴파일 에러 확인 (현재 세션)
SHOW ERRORS;

-- 특정 객체의 컴파일 에러 상세 조회
SELECT line,
       position,
       text
FROM   user_errors
WHERE  name = 'MY_PACKAGE'
  AND  type = 'PACKAGE BODY'
ORDER  BY sequence;

-- 의존성 확인: 어떤 객체가 INVALID 객체에 의존하는지
SELECT name,
       type,
       referenced_name,
       referenced_type
FROM   user_dependencies
WHERE  referenced_name = 'MY_TABLE'
ORDER  BY type, name;

4단계: UTL_RECOMP를 이용한 일괄 재컴파일 (권장)

대규모 DDL 작업 후 여러 객체가 INVALID 상태가 되었을 때 Oracle이 제공하는 UTL_RECOMP 패키지를 사용하면 일괄 재컴파일이 가능합니다.

-- 특정 스키마의 INVALID 객체 일괄 재컴파일 (순차적)
EXEC UTL_RECOMP.RECOMP_SERIAL('SCOTT');

-- 전체 데이터베이스 INVALID 객체 일괄 재컴파일 (병렬, 스레드 4개)
EXEC UTL_RECOMP.RECOMP_PARALLEL(4);

-- 재컴파일 후 잔여 INVALID 객체 확인
SELECT COUNT(*) AS invalid_count
FROM   dba_objects
WHERE  status = 'INVALID';

5단계: 권한 문제 해결

권한 부족으로 INVALID가 된 경우 직접 권한을 부여합니다.

-- Role이 아닌 직접 권한 부여
GRANT SELECT ON hr.employees TO scott;
GRANT EXECUTE ON dbms_crypto TO scott;

-- 권한 부여 후 재컴파일
ALTER PACKAGE scott.my_package COMPILE BODY;

예방 방법

1. DDL 작업 후 자동 재컴파일 절차 수립

운영 환경에서 테이블 구조 변경(ALTER TABLE), 뷰 재생성, 패키지 배포 등의 DDL 작업 후에는 반드시 INVALID 객체 점검 및 재컴파일 스크립트를 배포 프로세스에 포함시켜야 합니다. 아래 스크립트를 배포 후 자동 실행되도록 스케줄링하면 운영 장애를 사전에 예방할 수 있습니다.

-- 배포 후 자동 재컴파일 스크립트 예시 (쉘 스크립트와 연동)
BEGIN
  -- 1차 재컴파일 시도
  UTL_RECOMP.RECOMP_SERIAL('APP_SCHEMA');
  
  -- 재컴파일 후 잔여 INVALID 객체 로깅
  INSERT INTO deploy_log (log_date, invalid_count, log_msg)
  SELECT SYSDATE,
         COUNT(*),
         'Post-deploy recompile check'
  FROM   dba_objects
  WHERE  status = 'INVALID'
    AND  owner  = 'APP_SCHEMA';
  
  COMMIT;
END;
/

2. 개발 및 배포 시 컴파일 상태 검증 자동화

PL/SQL 객체를 생성하거나 수정한 직후 반드시 컴파일 상태를 확인하는 검증 단계를 CI/CD 파이프라인 또는 배포 스크립트에 포함시켜야 합니다. 아래와 같이 INVALID 객체가 존재하면 배포를 중단하는 로직을 추가하면 운영 환경으로의 불완전한 배포를 차단할 수 있습니다.

-- 배포 검증: INVALID 객체 존재 시 예외 발생
DECLARE
  v_invalid_count NUMBER;
BEGIN
  SELECT COUNT(*)
  INTO   v_invalid_count
  FROM   user_objects
  WHERE  status = 'INVALID';
  
  IF v_invalid_count > 0 THEN
    RAISE_APPLICATION_ERROR(
      -20001,
      'Deployment failed: ' || v_invalid_count || 
      ' INVALID object(s) found. Please check user_errors.'
    );
  END IF;
  
  DBMS_OUTPUT.PUT_LINE('All objects are VALID. Deployment successful.');
END;
/

관련 에러

  • ORA-04063: view 'SCHEMA.VIEW_NAME' has errors — 뷰가 INVALID 상태일 때 발생하며 ORA-06575와 유사한 맥락
  • ORA-04068: existing state of packages has been discarded — 패키지가 재컴파일된 후 기존 세션에서 패키지 상태 변수가 초기화될 때 발생
  • ORA-04065: not executed, altered or dropped stored procedure — 저장 프로시저가 변경되거나 삭제된 후 호출할 때 발생
  • ORA-00942: table or view does not exist — 참조 테이블이 삭제되어 패키지가 INVALID가 되는 근본 원인이 되기도 함
  • ORA-06550: line X, column Y: PLS-XXXXX — PL/SQL 컴파일 에러의 세부 원인을 나타내며 ORA-06575 발생 시 함께 확인해야 함

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기