티스토리 뷰
[개발시 에러] ORA-06502:PL/SQL:수치 또는 값 오류:문자열 버퍼가 너무 작습니다.
kr98gyeongim 2020. 12. 18. 13:15■ 에러
ORA-06502:PL/SQL:수치 또는 값 오류:문자열 버퍼가 너무 작습니다.
■ 원인1 : 수치 또는 값의 에러가 발생했습니다.
NULL 데이터 처리가 불충분할 때
ORA-06502와 숫자의 조합의 경우에 흔히 있는 에러가 NULL의 핸들링이 부족한 것으로 인해 발생하는 에러이다.
예를 들면 아래의 소수코드로 간단하게 재현할 수 있다.
다만, 실제 개발에서는 난해한 처리와 NULL 데이터의 특수성으로부터 테스트를 빠져나와 부정한 데이터가 입력될 때까지 아무 일도 없는 경우도 적지않게 있다.
<예시>
CREATE OR REPLACE PROCEDURE RIVUS.ORA_06502_NUM
IS
vStr VARCHAR2(10);
BEGIN
-- OK
vStr := 'abc';
FOR i in 1 .. LENGTH(vStr) LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(vStr,i,1));
END LOOP;
-- NG
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 ORA_06502_NUM();
a
b
c
CALL ORA_06502_NUM()
*
1행에서 에러가 발생했습니다.:
ORA-06502: PL/SQL: 수치 또는 값의 에러가 발생했습니다.
ORA-06512: "RIVUS.ORA_06502_NUM", 행14
■ 원인2 - 수치 또는 값의 에러 : 문자열 버퍼가 너무 작습니다.
프로시저(PROCEDURE)나 함수(FUNCTION) 내에 선언된 변수의 크기보다 더 큰 값을 대입할 때 발생하는 에러이다.
새로운 환경에 데이터를 이행한 경우 등에는 캐릭터 세트의 차이에 의해
캐릭터 라인 길이의 바이트 사이즈가 다른 것으로 발생한다.
즉, 문자열을 담으려는 변수 A를 VARCHAR2(2048)로 선언 후에 실제 문자열의 크기가 3000인 값을 대입하면
해당 [ORA-06502]에러가 발생한다.
참고 : 문자 코드 문자 세트 / NLS_LENGTH_SEMANTICS
아래의 예시는 데이터베이스 캐릭터세트가 Shift-JIS로 작성된 데이터베이스에서 실행했다.
<예시>
CREATE OR REPLACE PROCEDURE RIVUS.ORA_06502_CHAR
IS
vCharStr VARCHAR2(1 CHAR);
vByteStr VARCHAR2(2);
-- vByteStr VARCHAR2(3);
BEGIN
vCharStr := '韓'; -- EUC 3 Byte Code
DBMS_OUTPUT.PUT_LINE(lengthb(vCharStr) || '바이트');
DBMS_OUTPUT.PUT_LINE(vCharStr);
-- SJIS에서는 2바이트이지만 EUC에서는 3바이트가 필요하다.
vByteStr := convert(vCharStr,'ja16euc');
DBMS_OUTPUT.PUT_LINE(lengthb(vByteStr) || '바이트');
END;
/
<실행결과>
SQL> CALL ORA_06502_CHAR();
2 바이트
韓
CALL ORA_06502_CHAR()
*
1행에서 에러가 발생했습니다. :
ORA-06502 : PL / SQL : 숫자 또는 값 오류 : 문자열 버퍼가 너무 작습니다.
ORA-06512 : " RIVUS.ORA_06502_CHAR" , 12 행
<추가설명>
오라클(Oracle)에서 VARCHAR2의 byte 최대 크기에 대하여.
SQL의(테이블(Table)이나 뷰(View)의) 최대크기는 4000byte까지 지원,
PL/SQL의 최대크기는 32K(32767byle)까지 지원한다.
'Oracle > [oracle] Error' 카테고리의 다른 글
[유틸리티 에러]KUP-04020: 지원되는 버퍼 크기 524288보다 긴 레코드가 <filename>에서 발견되었습니다. (0) | 2022.03.28 |
---|---|
[유틸리티 에러] EXP-00091: 의심스러운 통계를 내보내는 중입니다. (0) | 2022.03.28 |
[유틸리티 에러] IMP-00032: SQL문이 버퍼 길이를 초과했습니다. (0) | 2022.03.25 |
[개발시 에러] ORA-01481 : 숫자 형식 모델이 잘못되었습니다. (0) | 2021.02.24 |
[개발시 에러] ORA-00932 : 일관성 없는 데이터유형 : -이(가) 필요하지만 -임 (0) | 2020.12.22 |
- Total
- Today
- Yesterday
- in/out/ref
- VB.Net
- grant
- vba
- in/out/ref 예제
- PL/SQL 실행문
- C#
- 후나빙
- Oracle
- 유틸리티
- pl/sql
- DBA_SYS_PRIVS
- TrimEnd
- NLog
- BEGIN절
- REVOKE
- 초기화파라미터파일
- PL/SQL 예외처리문
- USER_SYS_PRIVS
- EXCEPTION절
- rollback
- 유틸리티에러
- 동기통신
- 시간차이
- commit
- in/out/ref 공통점
- DECLARE절
- 참조전달
- 에러
- in/out/ref 차이점
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |