2026년 09월 01일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-06550 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-06550 PL/SQL compilation error 는?
ORA-06550은 PL/SQL 블록이나 저장 프로시저, 함수, 패키지 등을 컴파일할 때 발생하는 에러로, PL/SQL 코드 내에 문법적 오류나 참조 객체의 문제가 있을 때 Oracle 엔진이 이를 감지하여 발생시키는 컴파일 타임 에러입니다. 이 에러는 단독으로 발생하지 않고, 대부분 PLS-00xxx 계열의 세부 에러 메시지와 함께 나타나며, 정확히 몇 번째 줄(LINE)의 몇 번째 컬럼(COL)에서 문제가 발생했는지도 함께 알려줍니다. 실무에서는 객체 이름 오타, 선언되지 않은 변수 참조, 패키지 스펙과 바디의 불일치 등 다양한 원인으로 발생하며, 개발 단계에서 빈번하게 마주치는 에러 중 하나입니다.
주요 발생 원인
1. 선언되지 않은 변수 또는 잘못된 식별자 참조 (PLS-00201)
가장 흔한 원인 중 하나로, PL/SQL 블록 내에서 선언되지 않은 변수를 사용하거나 존재하지 않는 테이블, 컬럼, 프로시저 이름을 참조할 때 발생합니다. 예를 들어 변수명에 오타가 있거나, 다른 스키마에 있는 객체에 대한 권한이 없는 경우에도 동일한 에러가 발생할 수 있으므로, 변수 선언부와 객체 권한을 반드시 먼저 확인해야 합니다.
2. 문법 오류 (PLS-00103 – Encountered the symbol …)
PL/SQL 키워드를 잘못 사용하거나 세미콜론, 괄호, END 키워드 누락 등 기본적인 문법 오류로 인해 발생합니다. 특히 IF-THEN-END IF, LOOP-END LOOP, BEGIN-END 블록의 쌍이 맞지 않는 경우가 실무에서 매우 자주 발생하며, 중첩된 블록이 많을수록 이런 오류를 찾기 어려워집니다. 에러 메시지에 포함된 LINE과 COL 정보를 활용하면 빠르게 위치를 찾을 수 있습니다.
3. 패키지 스펙과 바디의 불일치 또는 무효화된 객체 참조
패키지 스펙(SPEC)에 선언된 프로시저나 함수의 시그니처(파라미터 이름, 타입, 순서)와 패키지 바디(BODY)의 구현부가 일치하지 않을 때 발생합니다. 또한, PL/SQL 코드가 참조하는 테이블이나 뷰가 변경(DDL)되면 해당 객체를 참조하는 저장 프로시저나 패키지가 INVALID 상태가 되어 재컴파일 시 ORA-06550이 발생할 수 있습니다. 이 경우 USER_OBJECTS 또는 ALL_OBJECTS 뷰를 통해 INVALID 객체를 조회하고 재컴파일하는 것이 핵심 해결책입니다.
해결 방법
원인 1: 선언되지 않은 변수 또는 잘못된 식별자 해결
먼저 USER_ERRORS 뷰를 통해 정확한 에러 위치와 메시지를 확인합니다.
-- 에러 상세 정보 조회
SELECT name, type, line, position, text
FROM user_errors
WHERE name = 'YOUR_PROCEDURE_NAME' -- 대상 객체명 (대문자)
ORDER BY sequence;
변수 선언 누락으로 인한 에러 예시와 수정:
-- 잘못된 코드 (v_count 변수 선언 누락)
CREATE OR REPLACE PROCEDURE test_proc AS
BEGIN
v_count := 0; -- ORA-06550: PLS-00201 identifier 'V_COUNT' must be declared
DBMS_OUTPUT.PUT_LINE(v_count);
END;
/
-- 올바른 코드 (DECLARE 섹션에 변수 선언 추가)
CREATE OR REPLACE PROCEDURE test_proc AS
v_count NUMBER := 0; -- 변수 선언
BEGIN
v_count := 10;
DBMS_OUTPUT.PUT_LINE('Count: ' || v_count);
END;
/
존재하지 않는 테이블 또는 컬럼 참조 확인:
-- 테이블 존재 여부 확인
SELECT table_name
FROM user_tables
WHERE table_name = 'EMP'; -- 참조 테이블명
-- 컬럼 존재 여부 확인
SELECT column_name, data_type
FROM user_tab_columns
WHERE table_name = 'EMP'
AND column_name = 'SALARY';
원인 2: 문법 오류 해결
IF-THEN-END IF 누락 패턴 수정 예시:
-- 잘못된 코드 (END IF 누락)
CREATE OR REPLACE PROCEDURE check_salary(p_empno IN NUMBER) AS
v_sal NUMBER;
BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno = p_empno;
IF v_sal < 3000 THEN
DBMS_OUTPUT.PUT_LINE('Low salary');
-- END IF; 누락!
END;
/
-- 올바른 코드
CREATE OR REPLACE PROCEDURE check_salary(p_empno IN NUMBER) AS
v_sal NUMBER;
BEGIN
SELECT sal INTO v_sal
FROM emp
WHERE empno = p_empno;
IF v_sal < 3000 THEN
DBMS_OUTPUT.PUT_LINE('Low salary: ' || v_sal);
ELSIF v_sal < 5000 THEN
DBMS_OUTPUT.PUT_LINE('Mid salary: ' || v_sal);
ELSE
DBMS_OUTPUT.PUT_LINE('High salary: ' || v_sal);
END IF; -- END IF 반드시 필요
END;
/
원인 3: INVALID 객체 재컴파일
-- 현재 INVALID 상태인 객체 전체 조회
SELECT object_name, object_type, status, last_ddl_time
FROM user_objects
WHERE status = 'INVALID'
ORDER BY object_type, object_name;
-- 특정 프로시저 수동 재컴파일
ALTER PROCEDURE your_procedure_name COMPILE;
-- 특정 패키지 재컴파일 (스펙 + 바디 순서 중요)
ALTER PACKAGE your_package_name COMPILE SPECIFICATION;
ALTER PACKAGE your_package_name COMPILE BODY;
-- 스키마 전체 INVALID 객체 일괄 재컴파일 (Oracle 제공 유틸리티)
EXEC DBMS_UTILITY.COMPILE_SCHEMA(schema => 'YOUR_SCHEMA_NAME', compile_all => FALSE);
-- UTL_RECOMP 패키지를 이용한 병렬 재컴파일 (대량 객체 처리 시 권장)
EXEC UTL_RECOMP.RECOMP_PARALLEL(threads => 4, schema => 'YOUR_SCHEMA_NAME');
패키지 스펙과 바디 불일치 확인 및 수정:
-- 잘못된 패키지 예시 (스펙과 바디 파라미터 불일치)
-- SPEC
CREATE OR REPLACE PACKAGE emp_pkg AS
PROCEDURE get_emp_info(p_empno IN NUMBER, p_name OUT VARCHAR2);
END emp_pkg;
/
-- BODY (파라미터 타입이 다름 - 불일치!)
CREATE OR REPLACE PACKAGE BODY emp_pkg AS
PROCEDURE get_emp_info(p_empno IN VARCHAR2, p_name OUT VARCHAR2) AS
-- ORA-06550 발생: 파라미터 타입 NUMBER vs VARCHAR2 불일치
BEGIN
SELECT ename INTO p_name FROM emp WHERE empno = TO_NUMBER(p_empno);
END get_emp_info;
END emp_pkg;
/
-- 올바른 BODY (스펙과 동일한 파라미터 타입 사용)
CREATE OR REPLACE PACKAGE BODY emp_pkg AS
PROCEDURE get_emp_info(p_empno IN NUMBER, p_name OUT VARCHAR2) AS
BEGIN
SELECT ename INTO p_name
FROM emp
WHERE empno = p_empno;
END get_emp_info;
END emp_pkg;
/
예방 방법
1. IDE 및 정적 분석 도구 활용
SQL Developer, PL/SQL Developer, Toad 등의 IDE는 코드 작성 중 실시간으로 문법 오류를 감지하고 하이라이팅해주는 기능을 제공합니다. 이러한 도구의 컴파일 기능과 코드 검증 기능을 적극 활용하고, 가능하다면 PL/Scope나 DBMS_METADATA를 이용해 코드 품질을 정기적으로 점검하는 루틴을 팀 개발 프로세스에 포함시키는 것이 중요합니다. 또한 DDL 변경 후에는 반드시 DBMS_UTILITY.COMPILE_SCHEMA를 수행하여 INVALID 객체를 즉시 재컴파일하는 습관을 들여야 합니다.
2. 개발 표준 및 코드 리뷰 프로세스 정착
변수명 명명 규칙(예: v_ 접두사, p_ 파라미터 접두사), 선언부 정리, 블록 구조 들여쓰기 등의 코딩 표준을 팀 단위로 정의하고 준수하면 단순 오타나 선언 누락으로 인한 ORA-06550을 크게 줄일 수 있습니다. 배포 전 반드시 동료 개발자의 코드 리뷰를 거치고, 개발/테스트/운영 환경 간 객체 동기화 상태를 주기적으로 점검하는 절차를 표준화하면 운영 환경에서의 컴파일 에러를 사전에 예방할 수 있습니다.
관련 에러
- PLS-00201:
identifier must be declared— 선언되지 않은 식별자 참조 시 ORA-06550과 함께 발생하는 가장 대표적인 세부 에러입니다. - PLS-00103:
Encountered the symbol ...— 예상치 못한 키워드나 심볼을 만났을 때 발생하는 문법 오류 에러입니다. - ORA-04068:
existing state of packages has been discarded— 패키지 바디 재컴파일 후 기존 세션의 패키지 상태가 무효화될 때 발생하며, ORA-06550과 연계되어 나타날 수 있습니다. - ORA-04067:
not executed, stored procedure has errors— INVALID 상태의 저장 프로시저를 실행하려 할 때 발생하며, 내부적으로 ORA-06550 컴파일 에러가 원인인 경우가 많습니다. - ORA-00942:
table or view does not exist— PL/SQL 내에서 존재하지 않는 테이블을 참조할 때 컴파일 에러로 이어지는 관련 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.