본문 바로가기
Oracle/운영

NUMBER 데이터타입과 데이터타입 변경

by 취미툰 2020. 8. 26.
반응형

NUMBER데이터타입은 NUMBER (precision, scale)형식으로 지정할수도 있고, NUMBER(precision)만 사용할수도 있습니다.

precision(정밀도)란 정수 +소수점을 포함하여 표현할 수 있는 자릿수를 이야기하는것이고,

scale(배율)은 소수점 몇자리까지 표현하느냐를 이야기하는것입니다.

 

999.99는 총5자리에 소수점 2자리이기 때문에 NUMBER(5,2)로 표현이 되어야 합니다.

(이부분이 헷갈려서 컬럼데이터타입 변경할 떄, 에러가 나왔는데 왜 나왔는지 한참을 생각했습니다..)

 

NUMBER에서 NUMBER로 변경 시 큰 제약사항 없이 바로 적용되는줄 알았는데, 소수점이 들어가버리면서 총표현자릿수가 줄어들어 결국엔 기존값들보다 작은 데이터타입이 만들어지려하니 에러를 발생시킨것이었습니다.

 

테스트 테이블에서 NUMBER(4) -> NUMBER(4,2)로 변경하는 작업을 했는데 에러가 발생하였습니다.

 

desc EMP_2

MGR                                      NUMBER(4)

 

SQL> select mgr from emp_2;

       MGR
----------
      7902
      7698
      7698
      7839
      7698
      7839
      7839
      7566

      7698
      7788
      7698
      7566
      7782

14 rows selected

SQL> alter table emp_2 modify (MGR NUMBER(4,2));

ORA-01440: Specified column 'EMP_2'.'MGR' must be empty to decrease precision or scale.

 

에러가 발생하여 CTAS로 백업테이블 변경 후 데이터타입을 변경하고 INSERT작업을 수행하였습니다.

 

SQL> create table emp as select * from emp_2;

 

SQL> truncate table emp_2;

SQL> alter table emp_2 modify (mgr number(4,2));

 

SQL> insert into emp_2 select * from emp;
ORA-01438: value larger than specified precision allowed for this column

(이부분입니다.)

 

그래서 제가 원래 데이터 값을 넣으려면 NUMBER(4,2)가아니라 NUMBER(6,2)로 변경을 해야했던 것이었습니다.

(기존에 들어가있던값이 최대 4자리수의 NUMBER이기 떄문입니다.)

 

 

SQL> alter table emp_2 modify (mgr number(6,2));

(이 부분은 TRUNCATE TABLE 작업 없이 컬럼에 데이터가 있어도 가능한 작업입니다. )

 

SQL> insert into emp_2 select * from emp; 

 

 

desc EMP_2

MGR                                      NUMBER(6,2)

 

 

SQL> select mgr from emp_2;

       MGR
----------
      7902
      7698
      7698
      7839
      7698
      7839
      7839
      7566

      7698
      7788
      7698
      7566
      7782

 

끝.

 

아직 배워가는게 많아 사소한것부터 다시 아는 느낌입니다만, 차근차근 배워가면 저의 지식이 될거라 믿어 의심치 않으며, 정리를 마칩니다...ㅋㅋ

반응형

댓글