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

ORA-04040
2026년 08월 21일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-04040 stored procedure, function, package, or package body not found 는?

ORA-04040은 Oracle 데이터베이스에서 호출하려는 저장 프로시저(Stored Procedure), 함수(Function), 패키지(Package) 또는 패키지 바디(Package Body)를 찾을 수 없을 때 발생하는 에러입니다. 주로 객체 이름이 잘못 지정되었거나, 해당 객체가 데이터베이스에 존재하지 않거나, 현재 사용자가 해당 객체에 접근할 권한이 없는 경우에 발생합니다. 특히 애플리케이션 배포 이후 스키마 변경이나 객체 누락 시 운영 환경에서 자주 마주치는 에러 중 하나입니다.


주요 발생 원인

1. 객체가 데이터베이스에 존재하지 않음

가장 흔한 원인은 호출하려는 프로시저, 함수, 패키지 자체가 데이터베이스에 생성되어 있지 않은 경우입니다. 배포 스크립트 누락, 실수로 인한 객체 삭제, 또는 개발 환경과 운영 환경 간의 동기화 오류 등이 대표적인 상황입니다. 특히 대규모 릴리즈 이후 일부 DDL 스크립트가 누락되는 경우가 실무에서 매우 빈번하게 발생합니다.

2. 객체 이름 오타 또는 스키마 지정 오류

프로시저나 패키지를 호출할 때 이름을 잘못 입력하거나, 스키마 이름을 빠뜨리거나 잘못 지정하는 경우에도 이 에러가 발생합니다. 예를 들어 HR.CALCULATE_SALARY를 호출해야 하는데 CALCULATE_SALARY만 입력하거나, HRR.CALCULATE_SALARY처럼 스키마 이름에 오타가 있을 때 발생합니다. 대소문자 구분이 적용된 객체명(큰따옴표로 생성된 객체)을 소문자로 호출하는 경우도 이 에러를 유발할 수 있습니다.

3. 권한 부족 또는 시노님(Synonym) 미설정

현재 세션의 사용자가 해당 객체에 대한 EXECUTE 권한이 없거나, 다른 스키마의 객체를 참조하기 위한 시노님이 생성되어 있지 않은 경우에도 ORA-04040이 발생할 수 있습니다. 멀티 스키마 환경에서 특히 자주 발생하며, 권한이 없는 경우 Oracle은 객체가 없는 것처럼 에러를 반환합니다. 이는 보안 정책상 Oracle이 의도적으로 객체 존재 여부를 숨기는 동작이기도 합니다.


해결 방법

원인 1: 객체 존재 여부 확인

먼저 DBA_OBJECTS 또는 ALL_OBJECTS 뷰를 통해 객체가 실제로 존재하는지 확인합니다.

-- 객체 존재 여부 확인 (DBA 권한 필요)
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS, OWNER
FROM   DBA_OBJECTS
WHERE  OBJECT_NAME = 'CALCULATE_SALARY'
  AND  OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');

-- 현재 사용자 접근 가능 객체 확인
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM   ALL_OBJECTS
WHERE  OBJECT_NAME = 'CALCULATE_SALARY';

-- 객체가 INVALID 상태인지 확인
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM   DBA_OBJECTS
WHERE  STATUS = 'INVALID'
  AND  OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');

객체가 없다면 아래와 같이 프로시저를 재생성합니다.

-- 프로시저 재생성 예시
CREATE OR REPLACE PROCEDURE CALCULATE_SALARY (
    p_emp_id   IN  NUMBER,
    p_salary   OUT NUMBER
)
AS
BEGIN
    SELECT SALARY
    INTO   p_salary
    FROM   EMPLOYEES
    WHERE  EMPLOYEE_ID = p_emp_id;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        p_salary := 0;
END CALCULATE_SALARY;
/

원인 2: 객체 이름 및 스키마 확인

올바른 스키마와 객체명을 확인하고 정확히 호출합니다.

-- 정확한 스키마 및 객체명 검색
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM   DBA_OBJECTS
WHERE  UPPER(OBJECT_NAME) LIKE '%CALCULATE%'
  AND  OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');

-- 스키마를 명시한 올바른 호출 방법
BEGIN
    HR.CALCULATE_SALARY(p_emp_id => 100, p_salary => :v_salary);
END;
/

-- 대소문자 구분 객체 확인 (큰따옴표 생성 객체)
SELECT OBJECT_NAME, OBJECT_TYPE
FROM   DBA_OBJECTS
WHERE  OBJECT_NAME = 'calculate_salary';  -- 소문자 그대로 검색

원인 3: 권한 및 시노님 설정

EXECUTE 권한을 부여하고 필요 시 시노님을 생성합니다.

-- 특정 사용자에게 EXECUTE 권한 부여
GRANT EXECUTE ON HR.CALCULATE_SALARY TO APP_USER;

-- Public 시노님 생성 (모든 사용자 접근 가능)
CREATE PUBLIC SYNONYM CALCULATE_SALARY
    FOR HR.CALCULATE_SALARY;

-- Private 시노님 생성 (특정 사용자 전용)
CREATE SYNONYM APP_USER.CALCULATE_SALARY
    FOR HR.CALCULATE_SALARY;

-- 현재 사용자의 권한 확인
SELECT PRIVILEGE, TABLE_NAME, GRANTOR
FROM   USER_TAB_PRIVS
WHERE  TABLE_NAME = 'CALCULATE_SALARY';

-- 역할(Role)을 통한 권한 확인
SELECT GRANTED_ROLE
FROM   USER_ROLE_PRIVS;

INVALID 상태 객체 재컴파일

객체가 존재하지만 INVALID 상태인 경우 재컴파일이 필요합니다.

-- 특정 객체 재컴파일
ALTER PROCEDURE CALCULATE_SALARY COMPILE;
ALTER PACKAGE HR_PKG COMPILE;
ALTER PACKAGE HR_PKG COMPILE BODY;

-- 스키마 내 모든 INVALID 객체 재컴파일 (DBMS_UTILITY 활용)
EXEC DBMS_UTILITY.COMPILE_SCHEMA(SCHEMA => 'HR', COMPILE_ALL => FALSE);

-- UTL_RECOMP 패키지로 병렬 재컴파일 (Oracle 10g 이상)
EXEC UTL_RECOMP.RECOMP_SERIAL('HR');

예방 방법

1. 배포 전 객체 유효성 검증 스크립트 자동화

릴리즈 배포 파이프라인(CI/CD)에 객체 유효성 검사 스크립트를 포함하여, 배포 이후 INVALID 객체나 누락된 객체를 즉시 감지할 수 있도록 합니다. 아래 스크립트를 배포 후 자동 실행하도록 설정하면 운영 장애를 사전에 방지할 수 있습니다.

-- 배포 후 유효성 검증 스크립트 예시
SELECT COUNT(*) AS INVALID_COUNT
FROM   DBA_OBJECTS
WHERE  STATUS = 'INVALID'
  AND  OWNER = 'HR'
  AND  OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');
-- 결과가 0이 아니면 배포 실패 처리

2. 권한 관리 표준화 및 체크리스트 운영

멀티 스키마 환경에서는 객체 생성 시 권한 부여 및 시노님 생성을 표준 절차로 문서화하고, 배포 체크리스트에 반드시 포함시킵니다. 또한 주기적으로 DBA_TAB_PRIVSDBA_SYNONYMS를 점검하여 누락된 권한이나 깨진 시노님(Broken Synonym)이 없는지 모니터링하는 것이 중요합니다.

-- 깨진 시노님(Broken Synonym) 탐지
SELECT S.SYNONYM_NAME, S.TABLE_OWNER, S.TABLE_NAME
FROM   DBA_SYNONYMS S
WHERE  NOT EXISTS (
    SELECT 1
    FROM   DBA_OBJECTS O
    WHERE  O.OWNER       = S.TABLE_OWNER
      AND  O.OBJECT_NAME = S.TABLE_NAME
);

관련 에러

  • ORA-06550: PL/SQL 컴파일 에러로, 잘못된 객체 참조 시 ORA-04040과 함께 발생하는 경우가 많습니다.
  • ORA-04043: object [name] does not exist — 뷰, 테이블 등 다른 객체 유형에서 유사하게 발생하는 에러입니다.
  • ORA-00942: table or view does not exist — 프로시저 내부에서 참조하는 테이블이 없을 때 발생하며, INVALID 객체의 원인이 됩니다.
  • ORA-04068: existing state of packages has been discarded — 패키지 재컴파일 이후 세션 상태 초기화 시 발생하는 관련 에러입니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기