본문 바로가기

BackEnd/DB(SQL)

[Oracle SQL] NUMBER 데이터 타입 완전 정복(NUMBER(p,s) 제대로 이해하기)

728x90

Oracle SQL에서 가장 많이 사용되는 숫자 데이터 타입은 바로 NUMBER입니다.
이번 글에서는 NUMBER(p, s)의 구조와 실무에서 자주 겪는 오류까지 정리해보겠습니다.

 

 

🔢 1. NUMBER 타입이란?

Oracle에서 숫자 데이터를 저장할 때 가장 기본이 되는 타입이 NUMBER입니다.

NUMBER(p, s)

 

 

  • p (precision, 정밀도): 숫자의 전체 자릿수 (정수부 + 소수부 포함)
  • s (scale, 소수 자릿수): 소수점 이하 자릿수

 

예를 들어,

NUMBER(5, 2)

 

  • 최대 5자리까지 저장 가능
  • 소수점 아래는 2자리까지 허용
  • 입력 가능한 범위: -999.99 ~ 999.99
  • 1000.00을 입력하면 ORA-01438 오류 발생

 

 

🧮 2. 다양한 예시로 이해하기

 

정의 허용값 예시 허용 여부 설명
NUMBER(6, 0) 123456 정수 6자리
NUMBER(6, 0) 1234567 7자리로 초과
NUMBER(6, 2) 1234.56 정수 4자리 + 소수 2자리
NUMBER(6, 2) 12345.67 정수 5자리로 초과
NUMBER(5, -2) 12000 소수 자릿수 음수 → 반올림 기준
NUMBER 제한 없음 정밀도, 소수 제한 없음 (가변형)

 

 

 

⚠️ 3. 실무에서 자주 겪는 오류

❗ ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다

이 오류는 주로 아래와 같은 경우 발생합니다:

컬럼 정의: NUMBER(6, 0)
입력값: 1000000 → ❌ (7자리)

또는

컬럼 정의: NUMBER(10, 0)
입력값: 123.45 → ❌ (소수 허용 안 됨)

✅ 해결 방법

  • 컬럼 정의 변경: ALTER TABLE ... MODIFY로 정밀도 확장
  • 값 검증: 입력 전에 자릿수 체크 또는 TRUNC, ROUND 사용

 

 

🔍 4. 숫자 타입 관련 팁

  • NUMBER만 쓰면 거의 모든 숫자를 저장할 수 있지만, 성능 및 저장 효율을 고려해 NUMBER(p,s)를 정의하는 것이 좋음
  • 소수 자릿수를 사용하는 컬럼은 계산 시 주의 필요 (ROUND, TRUNC 등과 함께 사용)
  • PL/SQL에서 숫자 변수도 동일한 방식으로 정의 가능

 

✅ 마무리

Oracle의 NUMBER 타입은 단순한 숫자 저장을 넘어, 정밀한 계산과 데이터 무결성을 책임지는 중요한 요소입니다.
정의 방식에 따라 데이터가 저장되지 않거나, 예기치 못한 오류가 발생할 수 있기 때문에 NUMBER(p, s)의 의미를 정확히 이해하고 사용하는 것이 매우 중요합니다.

 

특히 ORA-01438 오류처럼 사소한 실수로도 시스템에 영향을 줄 수 있으니, 정의된 자릿수보다 큰 값을 입력하지 않도록 항상 주의하세요!

 

728x90