본문 바로가기

BackEnd/DB(SQL)

[Oracle 오류 해결] ORA-01438: 지정된 전체 자릿수보다 큰 값이 허용됩니다

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