number(p,s) : precision, scale ora-01438

2009. 12. 10. 15:46Oracle/Oracle Study

반응형
number(p,s) : 전체 p자리 중 소수점 이하 s자리(p:1~38, s:-84~127)

number 형식 컬럼에 대한 length를 지정하지 않고 사용되는 경우가 있습니다.
예를 들자면 create table num_test (num1 number); 라고 지정을 해놓는데,
데이터가 일정치 않을 경우 엄청난 값의 길이가 들어갈 수 있는 상황이 발생하겠죠.

그래서 흔히들 number(10) 같이 길이를 지정해 주고 사용되고 있습니다.
소수점을 넣을려고 한다면 number(10,2) 이런 식으로 format을 설정해 줍니다.

제가 하고 싶은 말은 얼마전 우연히 number(3,8) 에 대해서 의문을 가지게 되었습니다.
즉, p가 s보다 작을 경우 어떻게 되는가 입니다.
아직까지도 정확하게 잘 모르겠습니다.

테스트를 해본 결과 p가 s보다 작을경우 값이 0을 제외하고는 들어가지 않는다는 거죠!
제 생각으로는 소수점 8자리까지 표시를 가능하게 했으나 길이가 3으로 설정되어, 너무 짧게 
잡아 놓아서 들어가지 않는다고 일단은 결론을 지웠습니다.

그러나 또 다른 의문이 생겼습니다.
그렇다면 insert into num_test values(1.5); 들어가야 하지 않나? 입니다.
저 값의 길이는 2가 되고 소수점도 한자리밖에 차질하지 않으니 들어가야하지 않을까요?
역시나 들어가지 않더군요.
이것 또한 제가 지은 결론은
number(3,8)은 소수점 자리를 제외한 나머지 길이값이 정수값이 된다 입니다.
3-8 = -5가 되니 정수값은 넣어주질 못하는 것이고..
number(6,5) 일 경우는
6-5 = 1 이 되는 한자리의 정수값은 들어가게 됩니다.

여기서 또 다른 의문!! 
number(3,8) 일때는 정수값은 못들어간다 해도 소수점 자리는 3자리까지는 들어가야지 않나? 입니다.
그러나 들어가질 않습니다.

최종 결론을 내리자면 p값이 s보다 작을 경우는 값이 들어가질 않는다 입니다.
애초에 format을 설정할때 만들어지지 않게 했다면 이해를 했겠건만 설정이 되니, 무엇인가가 되는게 아닌가 의심을 해봅니다.

여기저기 찾아봐도 저의 궁금증을 풀어줄 만한 자료는 찾질 못햇습니다.
좀 더 확인 작업을 하고 확실하게 알아봐야 할 것 같습니다.
뭔가 확실한 이유를 찾아서..ㅎㅎ

참고로 아래 사항은 제가 테스트 해본 결과 입니다.

SQL> create table num_test (a number);

Table created.

SQL> alter table num_test modify a number(3,5);

Table altered.

SQL> insert into num_test values(1.1);
insert into num_test values(1.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> alter table num_test modify a number(4,5);

Table altered.

SQL> insert into num_test values(1.1);
insert into num_test values(1.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> alter table num_test modify a number(5,5);

Table altered.

SQL> insert into num_test values(1.1);
insert into num_test values(1.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> insert into num_test values(.1);

1 row created.

SQL> select * from num_test;

         A
----------
         0
         0
        .1

SQL> alter table num_test modify a number(6,5);

Table altered.

SQL> insert into num_test values(0.1);

1 row created.

SQL> insert into num_test values(1.1);

1 row created.

SQL> insert into num_test values(10.1);
insert into num_test values(10.1)
                            *
ERROR at line 1:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> insert into num_test values(1.12);

1 row created.

SQL> insert into num_test values(1.12123141);

1 row created.

SQL> drop table num_test;

Table dropped.

반응형