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

ORA-06507
2026년 08월 29일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-06507 PL/SQL: could not find program unit being called 는?

ORA-06507 에러는 PL/SQL 런타임 엔진이 호출하려는 프로그램 유닛(프로시저, 함수, 패키지 등)을 데이터베이스에서 찾지 못할 때 발생하는 오류입니다. 주로 동적 SQL, 패키지 내부 참조, 또는 컴파일된 PL/SQL 객체가 의존하는 다른 객체가 삭제되거나 무효화(INVALID)된 상황에서 나타납니다. 단순히 객체가 없는 경우뿐만 아니라, 권한 문제나 스키마 불일치로 인해 객체를 찾지 못하는 경우에도 이 에러가 발생할 수 있어 원인 파악이 중요합니다.


주요 발생 원인

1. 참조 객체의 삭제 또는 무효화(INVALID 상태)

가장 흔한 원인으로, 호출 대상인 프로시저·함수·패키지 등이 데이터베이스에서 삭제되었거나 의존 객체의 변경으로 인해 INVALID 상태가 된 경우입니다. Oracle은 의존성 관리를 자동으로 수행하지만, 기반 테이블이나 참조 객체가 변경되면 상위 PL/SQL 객체가 자동으로 INVALID로 표시됩니다. 이 상태에서 해당 객체를 호출하면 ORA-06507이 발생합니다.

2. 스키마(Schema) 불일치 및 동의어(Synonym) 오류

PL/SQL 코드에서 다른 스키마의 객체를 호출할 때 스키마명을 누락하거나 잘못된 동의어를 통해 참조하는 경우 발생합니다. 예를 들어 PUBLIC SYNONYM이 삭제되었거나 잘못된 스키마를 가리키고 있을 때, 런타임 시점에 프로그램 유닛을 찾지 못해 에러가 발생합니다. 특히 여러 환경(개발·스테이징·운영)에서 스키마 구조가 다른 경우 이 문제가 자주 발생합니다.

3. 실행 권한(EXECUTE Privilege) 부재

호출 대상 프로그램 유닛에 대한 EXECUTE 권한이 없거나, 권한이 롤(ROLE)을 통해 부여되어 있어서 PL/SQL 컨텍스트에서 인식되지 않는 경우입니다. Oracle PL/SQL에서는 롤을 통해 부여된 권한이 런타임 시점에 적용되지 않는 특성이 있어, 직접 GRANT가 필요합니다. 이 경우 해당 유저는 SQL*Plus에서는 실행할 수 있지만 PL/SQL 블록 내에서는 ORA-06507과 함께 실패할 수 있습니다.


해결 방법

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

먼저 INVALID 상태의 객체를 조회합니다.

-- INVALID 상태의 PL/SQL 객체 전체 조회
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', 'TRIGGER')
ORDER BY owner, object_type, object_name;

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

-- 개별 객체 재컴파일
ALTER PROCEDURE my_schema.my_procedure COMPILE;
ALTER FUNCTION  my_schema.my_function  COMPILE;
ALTER PACKAGE   my_schema.my_package   COMPILE;
ALTER PACKAGE   my_schema.my_package   COMPILE BODY;

Oracle에서 제공하는 UTL_RECOMP 패키지를 사용하면 스키마 전체 또는 데이터베이스 전체의 INVALID 객체를 일괄 재컴파일할 수 있습니다.

-- 특정 스키마의 모든 INVALID 객체 재컴파일 (병렬 처리)
EXEC UTL_RECOMP.RECOMP_PARALLEL(4, 'MY_SCHEMA');

-- 데이터베이스 전체 재컴파일
EXEC UTL_RECOMP.RECOMP_PARALLEL(4);

재컴파일 후에도 INVALID가 남아 있다면 컴파일 에러 원인을 확인합니다.

-- 컴파일 에러 상세 확인
SELECT line, position, text
FROM   user_errors
WHERE  name = 'MY_PROCEDURE'
  AND  type = 'PROCEDURE'
ORDER BY sequence;

원인 2: 스키마 및 동의어 확인

호출 대상 객체의 실제 존재 여부와 동의어를 점검합니다.

-- 객체 존재 여부 확인
SELECT owner, object_name, object_type, status
FROM   dba_objects
WHERE  object_name = 'MY_PROCEDURE'
  AND  object_type IN ('PROCEDURE', 'PACKAGE');

-- PUBLIC SYNONYM 확인
SELECT synonym_name, table_owner, table_name
FROM   dba_synonyms
WHERE  synonym_name = 'MY_PROCEDURE';

-- 잘못된 동의어 재생성 예시
DROP PUBLIC SYNONYM my_procedure;
CREATE PUBLIC SYNONYM my_procedure FOR correct_schema.my_procedure;

PL/SQL 코드 내에서 스키마명을 명시적으로 지정하여 호출하는 것이 가장 안전합니다.

-- 스키마명 명시적 지정 (권장)
BEGIN
  target_schema.my_procedure(p_param1 => 'VALUE');
END;
/

원인 3: 실행 권한 부여

롤이 아닌 직접 GRANT 방식으로 권한을 부여합니다.

-- 현재 권한 확인
SELECT grantee, owner, table_name, privilege, grantable
FROM   dba_tab_privs
WHERE  table_name  = 'MY_PROCEDURE'
  AND  privilege   = 'EXECUTE';

-- 직접 EXECUTE 권한 부여 (롤 아닌 직접 부여)
GRANT EXECUTE ON my_schema.my_procedure TO target_user;

-- 여러 사용자에게 일괄 부여 시 예시
GRANT EXECUTE ON my_schema.my_package TO user_a;
GRANT EXECUTE ON my_schema.my_package TO user_b;

권한 확인 후 PL/SQL 블록에서 호출을 테스트합니다.

-- 권한 부여 후 테스트
BEGIN
  my_schema.my_procedure('TEST_VALUE');
  DBMS_OUTPUT.PUT_LINE('호출 성공');
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('에러: ' || SQLERRM);
END;
/

예방 방법

1. 정기적인 INVALID 객체 모니터링 및 자동화

운영 환경에서는 INVALID 객체가 발생했을 때 즉시 감지할 수 있도록 모니터링 쿼리를 스케줄러(DBMS_SCHEDULER 또는 OS 크론)에 등록하여 주기적으로 실행하고, 결과를 DBA에게 알림으로 전달하는 체계를 구축해야 합니다. DDL 변경 작업 이후에는 반드시 UTL_RECOMP를 통한 재컴파일을 배포 절차에 포함시켜, 변경 작업이 다른 객체에 미치는 영향을 즉시 복구할 수 있도록 합니다.

-- 모니터링용 쿼리 예시 (스케줄러 등록 용도)
SELECT COUNT(*) AS invalid_count
FROM   dba_objects
WHERE  status = 'INVALID'
  AND  object_type IN ('PROCEDURE','FUNCTION','PACKAGE','PACKAGE BODY');

2. 권한은 반드시 직접 GRANT, 롤 의존 금지

PL/SQL 객체 간 호출에 필요한 EXECUTE 권한은 롤(ROLE)을 통하지 않고 반드시 직접 GRANT로 부여하는 정책을 표준으로 정착시켜야 합니다. 권한 관리 문서를 별도로 유지하고, 신규 객체 배포 시 권한 부여 스크립트를 함께 작성하여 배포 패키지에 포함시키는 것이 좋습니다.


관련 에러

  • ORA-04068: 패키지 상태가 무효화되어 기존 세션에서 패키지를 다시 실행할 때 발생합니다. ORA-06507과 함께 나타나는 경우가 많습니다.
  • ORA-06550: PL/SQL 컴파일 에러로, 구문 오류나 객체 참조 실패 시 발생하며 ORA-06507의 선행 에러로 나타날 수 있습니다.
  • ORA-00942: 테이블 또는 뷰가 존재하지 않을 때 발생하며, 이로 인해 PL/SQL 객체가 INVALID 상태가 되면 ORA-06507로 이어질 수 있습니다.
  • ORA-01031: 권한 부족 에러로, EXECUTE 권한 미부여 시 ORA-06507과 유사한 맥락에서 발생합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기