반응형

Oracle 로고

이번 글에서는 오라클에서 NUMBER 타입의 컬럼이 있을 때 소수점이 초과하면 어떻게 될까?에 대한 글을 기록한다. 결론적으로, 소수점이 초과하면 밑의 자리에서 반올림을 하여 저장을 하게 된다.


목차

1. 테이블 생성
2. 소수점 초과 데이터 INSERT
3. 결론

1. 테이블 생성

제일 먼저 테스트를 하기 위해 테이블을 생성한다. 간략하게 TEST01이라는 이름을 가진 테이블을 생성했고, NUMBER(3,2) 타입을 가진 T01 컬럼을 만들었다.

-- TEST.TEST01 definition

CREATE TABLE "TEST"."TEST01" 
   (	"T01" NUMBER(3,2) DEFAULT 0 NOT NULL ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TTEESSTT" ;

 

2. 소수점 초과 데이터 INSERT

그러면 이제 테이블과 컬럼을 생성하였으니, 테스트를 해보자.

T01이라는 컬럼의 타입은 NUMBER(3,2)다. 즉, 3자리 숫자를 가지고, 소수점은 둘 째자리까지만 가진다라는 소리다.

예를 들어, 123.32 이거는 5자리가 되어 INSERT가 안된다. 1.23은 3자리가 되고, 소수점도 둘 째자리까지 있어서 INSERT가 된다.

 

테스트를 해보자.

1) 123.32

이 숫자를 INSERT를 하게 되면, 아래와 같이 ORA-01438 에러가 발생하게 된다. 3자리만 들어와야 하는데, 5자리가 들어와서 그런다.

INSERT INTO TEST01(T01) VALUES(123.32);

 

2) 1.23

이 숫자를 INSERT하게 되면 정상적으로 INSERT가 수행이 된다.

INSERT INTO TEST01(T01) VALUES(1.23);

 

3) 1.234

이 숫자를  넣으면 어떻게 될까? 바로 INSERT가 된다. 숫자는 3자리지만, 소수점 SCALE은 2로 되어 있기 때문에 소수점을 둘 째짜리까지만 받아들인다. 근데, 소수점을 그냥 버리는게 아니라 반올림을 한다.

INSERT INTO TEST01(T01) VALUES(1.234);

 

4) 1.237

1.237을 넣게 되면, 셋 째자리가 반올림되어 1.24가 INSRT가 된다.

INSERT INTO TEST01(T01) VALUES(1.237);

 

5) 1.2378

그러면, 반올림을 소수점 맨 끝에서부터 하지 않을까라는 의문이 생겨 테스트를 해봤다. 1.2378을 넣었을 경우에는 셋 째자리가 7이어서 1.24가 INSERT가 된다.

INSERT INTO TEST01(T01) VALUES(1.2378);

6) 1.2348

1.2348에서는 넷 째자리가 8이니까 반올림을 하여 셋 째자리는 5가 되고, 결국엔 1.24가 INSERT가 되지 않을까라는 시도를 해봤는데, 그냥 둘 째자리까지 표기가 된다면 그 N-1번 째 자리에서 반올림을 때려서 넣게 된다.

INSERT INTO TEST01(T01) VALUES(1.2348);

3. 결론

NUMBER 타입의 컬럼에서 소수점이 N번째짜리까지만 표기가 된다면 N-1번째 자리에서 반올림을 하여 자리수를 맞춰 준다.


 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기