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

ORA-06553
2026년 09월 02일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-06553 PLS: error string 는?

ORA-06553은 Oracle PL/SQL 컴파일러가 PL/SQL 블록, 프로시저, 함수, 패키지 등을 컴파일하는 과정에서 내부적으로 발생하는 PLS(PL/SQL) 계열 오류를 래핑하여 출력하는 에러입니다. 이 에러는 단독으로 발생하기보다는 다른 PLS 에러 메시지와 함께 나타나며, “error string” 부분에 실제 오류 내용이 포함되어 어떤 PL/SQL 구문 문제가 발생했는지를 나타냅니다. 주로 저장 프로시저나 함수를 생성하거나 실행할 때, 혹은 동적 SQL을 통해 PL/SQL 블록을 호출하는 과정에서 나타납니다.


주요 발생 원인

1. 잘못된 파라미터 바인딩 또는 타입 불일치 (EXECUTE IMMEDIATE / DBMS_SQL 사용 시)

동적 SQL(EXECUTE IMMEDIATE 또는 DBMS_SQL 패키지)을 사용하여 PL/SQL 블록을 실행할 때 바인드 변수의 타입이나 개수가 맞지 않으면 ORA-06553이 발생합니다. Oracle 내부에서 PL/SQL 컴파일러가 동적으로 생성된 블록을 파싱할 때 파라미터 바인딩 정보가 불완전하거나 잘못된 경우, 내부 PLS 에러가 발생하고 이를 ORA-06553으로 감싸서 전달합니다. 이 경우 에러 메시지의 “error string” 부분에 구체적인 PLS 오류 번호(예: PLS-00306 등)가 함께 표시되므로 해당 메시지를 반드시 확인해야 합니다.

2. 저장 프로시저/함수의 선언부 또는 구문 오류

PL/SQL 저장 객체(프로시저, 함수, 패키지 등)를 생성하거나 재컴파일할 때 내부 선언부의 변수 타입, 반환 타입, 또는 문법 오류가 있을 경우 ORA-06553이 함께 발생할 수 있습니다. 특히 Oracle 버전 업그레이드 이후 기존 코드와의 호환성 문제로 인해 이전에는 정상적으로 동작하던 객체가 갑자기 이 에러를 발생시키는 경우가 있습니다. 이 경우 USER_ERRORS 또는 ALL_ERRORS 뷰를 조회하여 정확한 오류 위치와 메시지를 확인하는 것이 중요합니다.

3. 잘못된 호출 규약(Calling Convention) 또는 외부 함수 연결 문제

Oracle에서 C 언어로 작성된 외부 라이브러리(External Procedure)를 PL/SQL과 연결하거나, 잘못된 파라미터 모드(IN, OUT, IN OUT)로 외부 함수를 호출할 때 ORA-06553이 발생할 수 있습니다. PL/SQL 컴파일러가 외부 함수의 서명(signature)과 실제 호출 시 전달되는 인자를 매칭하지 못하면 내부 PLS 에러가 발생하며, 이를 ORA-06553으로 노출합니다. 이는 상대적으로 드문 케이스이지만, 레거시 시스템이나 고성능 처리를 위해 외부 라이브러리를 사용하는 환경에서는 반드시 점검해야 할 원인입니다.


해결 방법

원인 1 해결: 동적 SQL 바인드 변수 타입 및 개수 확인

EXECUTE IMMEDIATE를 사용할 때 바인드 변수의 타입과 개수를 PL/SQL 블록 내의 선언과 정확히 일치시켜야 합니다.

-- 잘못된 예시: 바인드 변수 개수 불일치
DECLARE
  v_result NUMBER;
  v_sql    VARCHAR2(500);
BEGIN
  v_sql := 'BEGIN :1 := my_function(:2, :3); END;';
  -- 바인드 변수가 3개인데 2개만 전달 -> ORA-06553 유발 가능
  EXECUTE IMMEDIATE v_sql USING OUT v_result, 100;
END;
/

-- 올바른 예시: 바인드 변수 개수 및 모드 일치
DECLARE
  v_result NUMBER;
  v_sql    VARCHAR2(500);
  v_param1 NUMBER := 100;
  v_param2 VARCHAR2(50) := 'TEST';
BEGIN
  v_sql := 'BEGIN :1 := my_function(:2, :3); END;';
  EXECUTE IMMEDIATE v_sql USING OUT v_result, IN v_param1, IN v_param2;
  DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
END;
/
-- USER_ERRORS를 통해 컴파일 오류 상세 확인
SELECT name, type, sequence, line, position, text
FROM   user_errors
WHERE  name = 'MY_FUNCTION'  -- 대상 객체명 (대문자)
ORDER  BY sequence;

원인 2 해결: 저장 객체 재컴파일 및 오류 수정

먼저 USER_ERRORS 뷰에서 정확한 오류 메시지를 확인하고, 해당 라인의 코드를 수정한 후 재컴파일합니다.

-- 특정 프로시저의 컴파일 오류 확인
SELECT line, position, text
FROM   user_errors
WHERE  name = 'MY_PROCEDURE'
  AND  type = 'PROCEDURE'
ORDER  BY sequence;

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

-- 패키지의 경우 스펙과 바디를 모두 재컴파일
ALTER PACKAGE my_package COMPILE SPECIFICATION;
ALTER PACKAGE my_package COMPILE BODY;

-- 함수 재컴파일
ALTER FUNCTION my_function COMPILE;
-- 전체 Invalid 객체 확인 및 일괄 재컴파일 (DBA 권한 필요)
SELECT object_name, object_type, status
FROM   dba_objects
WHERE  status = 'INVALID'
  AND  owner  = 'MY_SCHEMA'
ORDER  BY object_type, object_name;

-- UTL_RECOMP 패키지를 이용한 스키마 전체 재컴파일
EXEC UTL_RECOMP.RECOMP_SERIAL('MY_SCHEMA');
-- 또는 병렬 재컴파일 (다중 CPU 환경 권장)
EXEC UTL_RECOMP.RECOMP_PARALLEL(4, 'MY_SCHEMA');

원인 3 해결: 파라미터 모드 및 외부 함수 서명 점검

-- 외부 프로시저 호출 시 파라미터 모드 정확히 지정
CREATE OR REPLACE PROCEDURE call_external_proc (
  p_input  IN  NUMBER,
  p_output OUT VARCHAR2
)
AS LANGUAGE C
  NAME "c_external_function"
  LIBRARY my_ext_lib
  PARAMETERS (
    p_input  BY VALUE,
    p_output BY REFERENCE
  );
/

-- 잘못된 모드로 호출하는 경우를 방지하기 위한 래퍼 프로시저 작성
CREATE OR REPLACE PROCEDURE safe_external_wrapper (
  p_in  IN  NUMBER,
  p_out OUT VARCHAR2
) IS
BEGIN
  -- 파라미터 유효성 검사 후 외부 프로시저 호출
  IF p_in IS NULL OR p_in < 0 THEN
    RAISE_APPLICATION_ERROR(-20001, 'Invalid input parameter');
  END IF;
  call_external_proc(p_in, p_out);
END safe_external_wrapper;
/

예방 방법

1. PL/SQL 객체 개발 시 컴파일 오류 즉시 점검 루틴 내재화

PL/SQL 객체를 생성하거나 수정한 직후에는 반드시 USER_ERRORS 또는 SHOW ERRORS 명령어를 통해 컴파일 결과를 확인하는 습관을 들여야 합니다. CI/CD 파이프라인이나 배포 스크립트에 아래와 같은 검증 단계를 포함시켜 운영 환경 배포 전에 오류를 사전 차단하는 것이 이상적입니다.

-- 배포 후 자동 오류 점검 스크립트
DECLARE
  v_error_count NUMBER;
BEGIN
  SELECT COUNT(*)
  INTO   v_error_count
  FROM   user_errors
  WHERE  name IN ('MY_PROCEDURE', 'MY_PACKAGE', 'MY_FUNCTION');

  IF v_error_count > 0 THEN
    RAISE_APPLICATION_ERROR(-20099,
      'PL/SQL compilation errors detected. Count: ' || v_error_count);
  END IF;
  DBMS_OUTPUT.PUT_LINE('All objects compiled successfully.');
END;
/

2. 동적 SQL 사용 최소화 및 바인드 변수 관리 체계화

동적 SQL은 유연성을 제공하지만 컴파일 타임에 오류를 잡을 수 없어 런타임에 ORA-06553과 같은 에러가 발생하기 쉽습니다. 가능하면 정적 SQL로 대체하고, 동적 SQL이 반드시 필요한 경우에는 바인드 변수의 타입, 개수, 모드를 명시적으로 관리하는 헬퍼 패키지를 만들어 사용하는 것을 권장합니다. 또한 동적 SQL 실행 전에 DBMS_SQL.PARSEDBMS_SQL.DESCRIBE_COLUMNS를 활용하여 SQL 유효성을 사전 검증하면 런타임 에러를 크게 줄일 수 있습니다.


관련 에러

  • ORA-06550: PL/SQL 블록 내 구문 오류를 나타내며 ORA-06553과 함께 빈번히 발생합니다. 라인 번호와 컬럼 위치 정보를 포함하므로 오류 위치 파악에 유용합니다.
  • PLS-00306: “wrong number or types of arguments” 오류로, 함수나 프로시저 호출 시 파라미터 불일치가 발생할 때 ORA-06553의 “error string” 부분에 표시됩니다.
  • ORA-04068: 패키지 상태가 무효화된 경우 발생하며, 세션 중 패키지가 재컴파일된 후 기존 세션에서 호출 시 ORA-06553을 유발할 수 있습니다.
  • ORA-06512: 스택 트레이스(Stack Trace) 정보를 제공하며, ORA-06553 발생 시 함께 출력되어 에러 발생 위치를 역추적하는 데 도움이 됩니다.
  • ORA-00600: Oracle 내부 에러로, ORA-06553이 내부 버그와 연관된 경우 함께 발생할 수 있으며, 이 경우 Oracle Support에 SR을 통해 패치를 요청해야 합니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기