ORA-06502: PL/SQL: 숫자 또는 값 오류: 문자열 버퍼가 너무 작습니다.

Oracle RDBMS를 사용하며 개발하다 보면 ORA-06502: PL/SQL: 숫자 또는 값 오류: 문자열 버퍼가 너무 작습니다 오류를 접하는 경우가 많습니다. 이 오류의 주요 원인과 해결 방법을 아래와 같이 정리하였습니다.

ORA-06502: PL/SQL: 숫자 또는 값 오류: 문자열 버퍼가 너무 작습니다.ORA-06502: PL/SQL: 숫자 또는 값 오류: 문자열 버퍼가 너무 작습니다.


ORA-06502 오류의 주요 원인

1. NULL 값 처리 부족

  • NULL 값이 적절히 처리되지 않을 때 발생합니다.
  • 예를 들어, LENGTH(NULL)NULL을 반환하기 때문에 루프 등의 연산에서 문제가 발생할 수 있습니다.

예시 코드

CREATE OR REPLACE PROCEDURE test_null_handling
IS
    vStr VARCHAR2(10);
BEGIN
    -- 정상 동작
    vStr := 'abc';
    FOR i IN 1 .. LENGTH(vStr) LOOP
        DBMS_OUTPUT.PUT_LINE(SUBSTR(vStr, i, 1));
    END LOOP;

    -- 오류 발생
    vStr := NULL;
    FOR i IN 1 .. LENGTH(vStr) LOOP  -- LENGTH(NULL) → NULL
        DBMS_OUTPUT.PUT_LINE(SUBSTR(vStr, i, 1));
    END LOOP;
END;
/

실행 결과

SQL> CALL test_null_handling();
a
b
c
CALL test_null_handling()
*
1행에서 에러가 발생했습니다:
ORA-06502: PL/SQL: 숫자 또는 값의 오류
ORA-06512: "TEST_NULL_HANDLING", 행14

해결 방법

  • NULL 값을 사전에 확인하거나, 기본값을 설정하여 처리합니다.
    vStr := NVL(vStr, '');  -- NULL 대신 빈 문자열로 대체

2. 변수 크기 부족

  • 선언된 변수 크기보다 더 큰 데이터를 할당할 경우 발생합니다.
  • 특히 캐릭터 세트(character set)가 다른 환경으로 데이터를 이관할 경우, 문자 길이가 달라져 발생할 수 있습니다.

예시 코드

CREATE OR REPLACE PROCEDURE test_buffer_size
IS
    vCharStr  VARCHAR2(1 CHAR);
    vByteStr  VARCHAR2(2);
BEGIN
    -- 정상 동작
    vCharStr := '韓';  -- EUC 3 Byte Code
    DBMS_OUTPUT.PUT_LINE(LENGTHB(vCharStr) || ' 바이트');
    DBMS_OUTPUT.PUT_LINE(vCharStr);

    -- 오류 발생
    vByteStr := CONVERT(vCharStr, 'ja16euc');  -- 캐릭터셋 변환
    DBMS_OUTPUT.PUT_LINE(LENGTHB(vByteStr) || ' 바이트');
END;
/

실행 결과

SQL> CALL test_buffer_size();
2 바이트
韓
CALL test_buffer_size()
*
1행에서 에러가 발생했습니다:
ORA-06502: PL/SQL: 숫자 또는 값 오류: 문자열 버퍼가 너무 작습니다.
ORA-06512: "TEST_BUFFER_SIZE", 행12

해결 방법

  1. 변수 크기 늘리기
    • 충분한 크기의 VARCHAR2를 선언합니다.
      vByteStr VARCHAR2(4000);  -- 테이블에서는 4000 byte, PL/SQL에서는 최대 32767 byte
  2. NLS 설정 확인
    • 데이터베이스의 NLS_LENGTH_SEMANTICS 값을 BYTE에서 CHAR로 변경합니다.
      ALTER SESSION SET NLS_LENGTH_SEMANTICS = CHAR;

추가 참고 사항

  • PL/SQL에서 VARCHAR2 최대 크기:
    • 테이블/뷰: 최대 4000 byte
    • PL/SQL 변수: 최대 32K (32767 byte)

위와 같은 방법으로 ORA-06502 오류를 예방하고, 발생 시 효과적으로 해결할 수 있습니다. 데이터와 변수 처리에 특히 주의를 기울여 안정적인 PL/SQL 프로그램을 작성하세요.