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

ORA-06540
2026년 08월 31일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-06540 PL/SQL: compilation error 는?

ORA-06540 에러는 PL/SQL 코드(프로시저, 함수, 패키지, 트리거 등)를 컴파일하거나 실행하는 과정에서 구문 오류, 객체 참조 오류, 권한 문제 등으로 인해 컴파일에 실패했을 때 발생하는 에러입니다. 이 에러는 주로 EXECUTE IMMEDIATE 또는 동적 SQL을 통해 PL/SQL 블록을 실행할 때, 혹은 이미 INVALID 상태인 오브젝트를 호출할 때 함께 나타납니다. 실제 원인을 파악하려면 ORA-06540 단독으로는 충분하지 않으며, 함께 출력되는 하위 에러 메시지(예: ORA-06550, PLS-00XXX 시리즈)를 반드시 확인해야 합니다.


주요 발생 원인

1. 참조 객체의 INVALID 상태 (가장 빈번한 원인)

운영 환경에서 특정 테이블, 뷰, 시퀀스 등이 변경되거나 삭제되면, 해당 객체를 참조하는 PL/SQL 오브젝트가 자동으로 INVALID 상태로 전환됩니다. INVALID 상태의 프로시저나 패키지를 호출하면 Oracle은 자동 재컴파일을 시도하지만, 의존 객체가 여전히 문제 상태라면 ORA-06540과 함께 컴파일 에러가 발생합니다. 특히 배포 시 테이블 컬럼 추가/삭제, 뷰 재정의 등의 DDL 작업 후 PL/SQL 오브젝트 재컴파일을 누락했을 때 자주 발생합니다.

2. PL/SQL 코드 내 문법 오류 또는 잘못된 객체 참조

프로시저, 함수, 패키지 바디를 작성할 때 오타, 잘못된 변수 선언, 존재하지 않는 컬럼명 참조 등의 구문 오류가 있으면 컴파일 자체가 실패합니다. CREATE OR REPLACE 문으로 오브젝트를 생성할 때는 경고 없이 INVALID 상태로 저장되며, 이후 해당 오브젝트를 실행할 때 ORA-06540이 발생합니다. 이는 개발 단계보다 운영 배포 중에 더 치명적으로 나타나는 경우가 많습니다.

3. 권한 부족으로 인한 컴파일 실패

PL/SQL 오브젝트 내부에서 다른 스키마의 테이블이나 오브젝트를 참조할 때, 컴파일 시점에 해당 객체에 대한 직접 권한(Direct Grant)이 없으면 컴파일에 실패합니다. Role을 통해 부여된 권한은 PL/SQL 컴파일 시에는 적용되지 않으며, 반드시 직접 권한이 있어야 합니다. 특히 DBA 권한을 가진 계정으로 개발할 때는 정상 동작하다가, 일반 계정 환경으로 이관 후 갑자기 에러가 발생하는 경우가 이에 해당합니다.


해결 방법

원인 1 해결: INVALID 객체 확인 및 재컴파일

먼저 INVALID 상태의 오브젝트를 조회합니다.

-- INVALID 상태의 오브젝트 전체 조회
SELECT owner, object_name, object_type, status, last_ddl_time
FROM   dba_objects
WHERE  status = 'INVALID'
ORDER  BY owner, object_type, object_name;

-- 특정 스키마의 INVALID 오브젝트만 조회
SELECT object_name, object_type, status
FROM   user_objects
WHERE  status = 'INVALID';

특정 오브젝트를 수동으로 재컴파일합니다.

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

-- 패키지 스펙 및 바디 재컴파일
ALTER PACKAGE my_package COMPILE;
ALTER PACKAGE BODY my_package COMPILE BODY;

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

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

Oracle이 제공하는 UTL_RECOMP 패키지를 사용해 스키마 전체 또는 DB 전체를 재컴파일할 수 있습니다.

-- 특정 스키마 전체 재컴파일 (직렬)
EXEC UTL_RECOMP.RECOMP_SERIAL('MY_SCHEMA');

-- 병렬로 전체 DB 재컴파일 (CPU 코어 수에 맞게 조정)
EXEC UTL_RECOMP.RECOMP_PARALLEL(4);

Oracle 내장 스크립트를 활용하는 방법도 있습니다.

-- $ORACLE_HOME/rdbms/admin/utlrp.sql 실행 (SYS 계정으로)
@?/rdbms/admin/utlrp.sql

원인 2 해결: 컴파일 에러 상세 내용 확인 및 수정

에러 상세 내용을 확인합니다.

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

-- 특정 오브젝트의 컴파일 에러 확인
SELECT line, position, text
FROM   user_errors
WHERE  name = 'MY_PROCEDURE'
  AND  type = 'PROCEDURE'
ORDER  BY sequence;

-- 모든 에러 상세 확인
SELECT name, type, sequence, line, position, text
FROM   user_errors
ORDER  BY name, type, sequence;

컴파일 에러가 있는 프로시저를 수정하는 예제입니다.

-- 에러가 발생하는 잘못된 코드 예시
CREATE OR REPLACE PROCEDURE bad_procedure AS
  v_name VARCHARR(100);  -- 타입 오타
BEGIN
  SELECT ename INTO v_name FROM emp WHERE empno = 7369;
  DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

-- SHOW ERRORS로 에러 확인
SHOW ERRORS PROCEDURE bad_procedure;
/*
결과 예시:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/3      PLS-00201: identifier 'VARCHARR' must be declared
*/

-- 수정된 코드
CREATE OR REPLACE PROCEDURE bad_procedure AS
  v_name VARCHAR2(100);  -- 올바른 타입
BEGIN
  SELECT ename INTO v_name FROM emp WHERE empno = 7369;
  DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

원인 3 해결: 권한 문제 해결

Role이 아닌 직접 권한(Direct Grant)을 부여합니다.

-- Role을 통한 권한 부여 (PL/SQL 컴파일에 효과 없음 - 잘못된 방법)
-- GRANT DBA TO my_user; -- Role 부여로는 해결 안 됨

-- 올바른 방법: 직접 권한 부여
GRANT SELECT ON other_schema.target_table TO my_user;
GRANT EXECUTE ON other_schema.target_package TO my_user;

-- 권한 확인
SELECT grantee, owner, table_name, privilege, grantable
FROM   dba_tab_privs
WHERE  grantee = 'MY_USER'
ORDER  BY owner, table_name;

-- 컴파일 에러 권한 관련 확인
SELECT *
FROM   session_privs
WHERE  privilege LIKE '%CREATE%';

AUTHID CURRENT_USER를 활용한 Invoker Rights 방식으로 전환하는 방법도 있습니다.

-- Definer Rights (기본값, 컴파일 시 권한 확인)
CREATE OR REPLACE PROCEDURE definer_proc
  AUTHID DEFINER
AS
BEGIN
  -- 프로시저 소유자의 권한으로 실행
  NULL;
END;
/

-- Invoker Rights (호출자의 권한으로 실행, 유연한 권한 관리)
CREATE OR REPLACE PROCEDURE invoker_proc
  AUTHID CURRENT_USER
AS
BEGIN
  -- 호출하는 사용자의 권한으로 실행
  NULL;
END;
/

예방 방법

1. 배포 프로세스에 재컴파일 단계 의무화

DDL 작업(테이블 구조 변경, 뷰 재정의 등)이 포함된 배포 스크립트에는 반드시 관련 PL/SQL 오브젝트 재컴파일 단계를 포함시켜야 합니다. 배포 완료 후 INVALID 오브젝트 조회 쿼리를 자동으로 실행하여 0건임을 확인하는 검증 단계를 CI/CD 파이프라인에 통합하세요. 아래 스크립트를 배포 후 자동 검증에 활용할 수 있습니다.

-- 배포 후 INVALID 오브젝트 검증 쿼리 (결과가 0건이어야 정상)
SELECT COUNT(*) AS invalid_count
FROM   dba_objects
WHERE  status   = 'INVALID'
  AND  owner    = 'MY_SCHEMA';

-- INVALID 오브젝트가 있으면 자동 재컴파일 수행
BEGIN
  FOR r IN (SELECT object_name, object_type
            FROM   user_objects
            WHERE  status = 'INVALID') LOOP
    BEGIN
      EXECUTE IMMEDIATE
        'ALTER ' || r.object_type || ' ' || r.object_name || ' COMPILE';
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('재컴파일 실패: ' || r.object_name ||
                             ' - ' || SQLERRM);
    END;
  END LOOP;
END;
/

2. 개발 단계에서 컴파일 경고(WARNING) 설정 활성화

Oracle의 PLSQL_WARNINGS 파라미터를 활성화하여 잠재적 문제를 컴파일 시점에 미리 감지하세요. 이를 통해 운영 환경으로 넘어가기 전에 코드 품질 이슈를 조기에 발견하고, 예상치 못한 ORA-06540 발생을 예방할 수 있습니다.

-- 세션 레벨 컴파일 경고 활성화
ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL';

-- 또는 특정 카테고리만 활성화
ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:SEVERE, ENABLE:PERFORMANCE, ENABLE:INFORMATIONAL';

-- 개별 오브젝트에 경고 설정 적용 후 컴파일
ALTER PROCEDURE my_procedure COMPILE PLSQL_WARNINGS='ENABLE:ALL' REUSE SETTINGS;

-- 컴파일 경고 확인
SELECT line, position, text, attribute
FROM   user_errors
WHERE  name      = 'MY_PROCEDURE'
  AND  attribute = 'WARNING';

-- 프로젝트 표준 설정 예시 (개발 DB 시스템 레벨)
-- ALTER SYSTEM SET PLSQL_WARNINGS = 'ENABLE:ALL' SCOPE=BOTH;

관련 에러

  • ORA-06550: PL/SQL 컴파일 에러의 세부 위치(라인, 컬럼)와 구체적인 에러 메시지를 함께 출력하며, ORA-06540과 항상 쌍으로 나타납니다.
  • PLS-00103: 예상치 못한 토큰 발견 시 발생하는 문법 오류로, 세미콜론 누락, 잘못된 키워드 사용 등이 원인입니다.
  • PLS-00201: 식별자(변수명, 타입명, 객체명 등)가 선언되지 않았거나 접근 권한이 없을 때 발생합니다.
  • ORA-04068: 패키지 상태가 무효화되어 현재 세션의 패키지 상태가 초기화될 때 발생하며, 주로 패키지 재컴파일 후 기존 세션에서 나타납니다.
  • ORA-04021: 컴파일을 위해 오브젝트 잠금을 기다리는 타임아웃 시 발생하며, 다른 세션이 해당 오브젝트를 사용 중일 때 나타납니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기