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
끝.
아직 배워가는게 많아 사소한것부터 다시 아는 느낌입니다만, 차근차근 배워가면 저의 지식이 될거라 믿어 의심치 않으며, 정리를 마칩니다...ㅋㅋ
'Oracle > 운영' 카테고리의 다른 글
Pivot 함수와 Pivot XML (1) | 2020.08.29 |
---|---|
특정 테이블의 컬럼의 Update만 인식하는 Trigger 생성하기 (0) | 2020.08.27 |
컬럼사이즈 변경 및 데이터타입 변경 (0) | 2020.08.25 |
Restricted Session (0) | 2020.08.22 |
Offset , Limit (페이징 처리) (0) | 2020.08.19 |
댓글