Oracle RDBMS를 사용하며 개발하다 보면 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
해결 방법
- 변수 크기 늘리기
- 충분한 크기의
VARCHAR2
를 선언합니다.vByteStr VARCHAR2(4000); -- 테이블에서는 4000 byte, PL/SQL에서는 최대 32767 byte
- 충분한 크기의
- 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 프로그램을 작성하세요.