728x90
오라클에서 데이터를 입력하거나 수정할 때 다음과 같은 에러를 만난 적 있으신가요?
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.
이번 글에서는 이 오류가 발생하는 원인과 해결 방법을 정리해 보겠습니다.
📌 1. 에러 원인
이 오류는 NUMBER(p, s) 형식의 컬럼에 지정된 정밀도보다 더 큰 숫자를 넣으려고 할 때 발생합니다.
오라클의 NUMBER(p, s)는 아래와 같이 해석됩니다:
- p: 전체 자릿수 (전체 자리수 = 정수부 + 소수부)
- s: 소수 자릿수
예를 들어,
NUMBER(5, 2)
는 총 5자리 숫자 중 소수점 이하가 2자리, 정수부는 최대 3자리까지 허용된다는 의미입니다.
즉, 999.99까지 입력 가능하고, 1000.00은 에러가 납니다.
⚠️ 2. 예시로 보는 오류 상황
아래는 컬럼이 다음과 같은 정의를 가졌다고 가정해봅시다.
ORD_WGT NUMBER(10, 0)
여기에 다음 데이터를 넣으면 문제가 없습니다:
ORD_WGT = 1000000 -- OK
하지만, 만약 실수로 다음과 같이 소수점을 포함한 값을 넣으면 에러가 발생할 수 있습니다:
ORD_WGT = 100.123 -- ❌ 에러 발생
-- NUMBER(10, 0)는 소수 자리를 허용하지 않음
또는, 아래처럼 컬럼 정의는 NUMBER(6,0)인데 값이 너무 클 경우에도 마찬가지입니다.
MATR_WGT NUMBER(6, 0) -- 최대 999999까지 가능
INSERT INTO ... VALUES (..., 1000000, ...) -- ❌ 에러 발생 (7자리)
✅ 3. 해결 방법
✔️ 해결 1: 값 자체를 줄인다
- 숫자를 입력할 때 정수부 또는 소수부가 컬럼 정의 범위 내에 있는지 확인합니다.
- 예를 들어 NUMBER(6, 0) 컬럼이라면 999999를 넘지 않도록 값 자체를 조정합니다.
✔️ 해결 2: 컬럼의 데이터 타입을 변경한다
컬럼의 스펙이 작아서 문제라면 아래처럼 ALTER TABLE로 컬럼의 정밀도를 늘릴 수 있습니다:
ALTER TABLE SQAW6010 MODIFY MATR_WGT NUMBER(7, 0);
✔️ 해결 3: 소수점 처리에 주의
- NUMBER(10,0) 같은 경우 소수점이 포함된 값이 들어갈 수 없음을 유의해야 합니다.
- NUMBER(18,6) 컬럼에는 소수점 6자리까지 허용되지만, 전체 자릿수가 18자리를 넘지 않아야 합니다.
🔎 4. 디버깅 팁
- 입력값 중 NUMBER(정밀도, 소수)와 비교했을 때 어느 컬럼이 초과했는지 찾기 어려울 경우,
→ INSERT문 실행 전에 각 값의 LENGTH나 TO_CHAR를 활용해 로그를 찍는 것도 좋은 방법입니다.
SELECT LENGTH(TO_CHAR(입력값)), 입력값 FROM DUAL;
DBMS_OUTPUT.PUT_LINE 등을 활용하여 PL/SQL 디버깅도 추천됩니다.
에러가 발생해도 당황하지 말고 숫자형 컬럼이 INSERT가 안되었을때
이 에러가 발생했다고 생각할 수 있겠죠?ㅎㅎ
728x90
'BackEnd > DB(SQL)' 카테고리의 다른 글
| [Oracle SQL] NUMBER 데이터 타입 완전 정복(NUMBER(p,s) 제대로 이해하기) (0) | 2025.06.01 |
|---|---|
| [Oracle] 테이블 컬럼명, 데이터 타입, 길이 변경하는 방법 정리 (1) | 2025.05.30 |
| [Oracle] ORA-01438 오류 해결 – 숫자 컬럼 크기 초과 문제 잡기 (0) | 2025.05.22 |
| [Oracle] PL/SQL 로그 사용하기 – DBMS_OUTPUT.PUT_LINE() 완전 정복 (3) | 2025.05.21 |
| [Oracle] 오라클 TO_DATE 함수 – 문자열을 날짜로 정확하게 변환하는 방법 (0) | 2025.05.20 |