2026년 08월 21일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-04042 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-04042 procedure, function, package, or package body does not exist 는?
ORA-04042는 Oracle 데이터베이스에서 존재하지 않는 프로시저(Procedure), 함수(Function), 패키지(Package), 또는 패키지 바디(Package Body)를 참조하거나 실행하려 할 때 발생하는 에러입니다. 주로 오브젝트 이름의 오타, 잘못된 스키마 참조, 혹은 해당 오브젝트가 실제로 데이터베이스에 생성되지 않았거나 삭제된 경우에 나타납니다. 대규모 운영 환경에서는 배포 누락이나 권한 문제로 인해 특정 스키마에서만 오브젝트가 보이지 않아 이 에러가 발생하는 경우도 빈번하게 겪게 됩니다.
주요 발생 원인
1. 오브젝트가 실제로 존재하지 않거나 다른 스키마에 존재하는 경우
가장 흔한 원인으로, 오브젝트 이름의 철자 오류이거나 오브젝트가 다른 스키마(Schema)에 생성되어 있는 경우입니다. 예를 들어 HR 스키마에 프로시저가 생성되어 있는데 현재 세션이 SCOTT 스키마로 접속하여 스키마 명시 없이 호출하면 이 에러가 발생합니다. 또한 오브젝트가 아예 생성되지 않은 채로 호출을 시도하는 실수도 실무에서 매우 자주 발생합니다.
2. 오브젝트가 INVALID 상태이거나 컴파일 오류가 있는 경우
패키지 스펙(Spec)은 존재하지만 패키지 바디(Body)가 컴파일 오류로 인해 INVALID 상태인 경우, 해당 패키지를 호출하면 ORA-04042가 발생할 수 있습니다. 의존 오브젝트(예: 테이블, 타입 등)가 변경되거나 삭제되어 연관된 프로시저나 함수가 자동으로 INVALID 처리된 경우에도 동일한 에러가 나타납니다. 이 경우 단순히 오브젝트가 없는 것처럼 보이지만 실제로는 재컴파일이 필요한 상태입니다.
3. 실행 권한(EXECUTE Privilege) 부재 또는 Public Synonym 미설정
현재 사용자가 해당 오브젝트에 대한 EXECUTE 권한을 부여받지 못한 경우, Oracle은 ORA-04042를 반환합니다. 이는 보안상 오브젝트의 존재 자체를 노출하지 않기 위한 Oracle의 의도적인 설계입니다. Public Synonym이 설정되어 있지 않거나 Private Synonym이 만료된 경우에도 동일하게 오브젝트를 찾을 수 없다는 에러로 나타납니다.
해결 방법
원인 1 해결: 오브젝트 존재 여부 및 스키마 확인
먼저 DBA_OBJECTS 뷰를 조회하여 해당 오브젝트가 데이터베이스에 실제로 존재하는지 확인합니다.
-- 오브젝트 존재 여부 및 소유 스키마 확인
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS
FROM DBA_OBJECTS
WHERE OBJECT_NAME = 'YOUR_PROCEDURE_NAME' -- 대문자로 입력
AND OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');
-- 현재 사용자 스키마 확인
SELECT USER FROM DUAL;
-- 스키마를 명시하여 호출 (예: HR 스키마의 프로시저 호출)
EXEC HR.YOUR_PROCEDURE_NAME(param1, param2);
오브젝트가 다른 스키마에 있다면 위처럼 스키마명을 명시하거나, Synonym을 생성하여 편리하게 접근할 수 있습니다.
-- Private Synonym 생성
CREATE SYNONYM your_procedure_name FOR HR.YOUR_PROCEDURE_NAME;
-- Public Synonym 생성 (DBA 권한 필요)
CREATE PUBLIC SYNONYM your_procedure_name FOR HR.YOUR_PROCEDURE_NAME;
원인 2 해결: INVALID 오브젝트 재컴파일
INVALID 상태의 오브젝트를 확인하고 재컴파일합니다.
-- INVALID 상태 오브젝트 확인
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS, LAST_DDL_TIME
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY')
ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;
-- 특정 프로시저 재컴파일
ALTER PROCEDURE HR.YOUR_PROCEDURE_NAME COMPILE;
-- 특정 패키지 스펙 재컴파일
ALTER PACKAGE HR.YOUR_PACKAGE_NAME COMPILE SPECIFICATION;
-- 특정 패키지 바디 재컴파일
ALTER PACKAGE HR.YOUR_PACKAGE_NAME COMPILE BODY;
-- 함수 재컴파일
ALTER FUNCTION HR.YOUR_FUNCTION_NAME COMPILE;
데이터베이스 전체의 INVALID 오브젝트를 한 번에 재컴파일하려면 Oracle에서 제공하는 UTL_RECOMP 패키지를 활용합니다.
-- 전체 스키마 INVALID 오브젝트 일괄 재컴파일 (병렬 처리)
EXEC UTL_RECOMP.RECOMP_PARALLEL(4); -- 4: 병렬 스레드 수
-- 특정 스키마만 재컴파일
EXEC UTL_RECOMP.RECOMP_SERIAL('HR');
-- 컴파일 에러 내용 확인
SELECT NAME, TYPE, LINE, POSITION, TEXT
FROM DBA_ERRORS
WHERE NAME = 'YOUR_PACKAGE_NAME'
AND OWNER = 'HR'
ORDER BY SEQUENCE;
원인 3 해결: 권한 부여 및 Synonym 설정
-- EXECUTE 권한 확인
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'YOUR_PROCEDURE_NAME'
AND PRIVILEGE = 'EXECUTE';
-- EXECUTE 권한 부여
GRANT EXECUTE ON HR.YOUR_PROCEDURE_NAME TO SCOTT;
-- 롤(Role)을 통한 권한 부여
GRANT EXECUTE ON HR.YOUR_PACKAGE_NAME TO APP_ROLE;
GRANT APP_ROLE TO SCOTT;
-- 모든 사용자에게 권한 부여
GRANT EXECUTE ON HR.YOUR_PROCEDURE_NAME TO PUBLIC;
예방 방법
1. 배포 전 오브젝트 유효성 검증 스크립트 자동화
CI/CD 파이프라인 또는 배포 스크립트에 아래와 같은 유효성 검증 쿼리를 포함시켜, 배포 후 INVALID 오브젝트가 없는지 자동으로 확인하는 프로세스를 구축하는 것이 중요합니다. 이를 통해 배포 누락이나 컴파일 실패를 운영 환경 반영 전에 사전 차단할 수 있습니다.
-- 배포 후 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. 정기적인 의존성 관리 및 모니터링
오브젝트 간 의존성(Dependency)을 주기적으로 점검하고, 테이블 구조 변경(ALTER TABLE, DROP COLUMN 등) 시 연관된 오브젝트가 INVALID 처리되는지 DBA_DEPENDENCIES 뷰를 통해 사전에 파악해두는 것이 좋습니다. 운영 환경에서는 INVALID 오브젝트 발생 시 즉시 알람을 받을 수 있도록 모니터링 스크립트를 Scheduler Job으로 등록하여 선제적으로 대응하는 것을 권장합니다.
-- 특정 테이블에 의존하는 오브젝트 조회
SELECT OWNER, NAME, TYPE, REFERENCED_OWNER, REFERENCED_NAME, REFERENCED_TYPE
FROM DBA_DEPENDENCIES
WHERE REFERENCED_NAME = 'YOUR_TABLE_NAME'
AND REFERENCED_OWNER = 'HR';
관련 에러
- ORA-00942:
table or view does not exist— 오브젝트 참조 에러의 가장 유사한 형태로, 테이블이나 뷰가 존재하지 않을 때 발생합니다. - ORA-06550:
line X, column Y: PLS-XXXX— 패키지나 프로시저 호출 시 PL/SQL 컴파일 오류와 함께 발생하는 에러로, ORA-04042와 함께 자주 나타납니다. - ORA-04043:
object— ORA-04042와 유사하며, DESCRIBE 명령어 실행 시 오브젝트를 찾지 못할 때 발생합니다.does not exist - ORA-01031:
insufficient privileges— 권한 부재 시 발생하는 에러로, ORA-04042가 권한 문제로 발생하는 경우와 맥락이 연결됩니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.