IT/Oracle

오라클 넘버 타입의 DATA_LENGTH, DATA_PRECISION, DATA_SCALE 등 중요 주의사항에 대해 실습 및 정리 (Oracle Number Type, 숫자)

귀차니즘 극복 2023. 2. 7. 17:29
728x90
반응형

회사에선 오라클 DB를 오랫동안 사용하고 있습니다. 최근 Number 타입과 관련된 장애가 발생하면서 관련된 원리를 정확히 이해하고자 공부차원에서 아래 내역을 남겨봅니다.

 

먼저 NUMBER Type에 대한 기본적인 속성입니다.

 

 . 가변숫자
 . 십진수 기준
 . 최대 22 byte

 

세부적인 내용을 한번 살펴볼까요?

 

USER_TAB_COLUMNS 를 조회하면 아래와 같은 좀 더 세부적인 내용이 나옵니다.

 

DATA_LENGTH는 위에서 설명한 내용과 동일하게 22로 지정된 것을 볼 수 있습니다.

 

평소에는 큰 관심이 없었지만, DATA_PRECISION과 DATA_SCALE 내역이 조회되고 있습니다. 이는 NUMBER 타입의 컬럼은 십진수를 기준으로 소수점을 저장할 수도 있기 때문에 이와 관련된 값입니다.

 

 

DATA_PRECISION의 경우 소수점을 포함한 전체 자릿수이며 1~38까지의 값을 가질 수 있고 별도의 값을 지정하지 않으면 기본적으로 38을 가집니다.

 

DATA_SCALE은 소수점 자릿수이며 -84~127 값을 가지며 기본적으로 0을 가집니다.

 

NUMBER의 경우 가변숫자이므로 precision과 scale을 입력하지 않으면 저장 데이터의 크게에 맞게 조정되며 scale을 이미 지정한 경우 지정된 소수점 자릿수에 맞게 저장 데이터가 반올림 됩니다.

 

 

위의 내용이 잘 이해가 가질 않으니 직접 실습을 해봅니다.

 

아래와 같이 TEST03이라는 테이블을 만들고 DECIMAL_POINT_TEST 컬럼을 NUMBER(3,1)로 생성했습니다.

 

생성한 테이블의 컬럼을 USER_TAB_COLUMNS를 통해 조회해보면, DATA_PRECISION에 3의 값이 조회되고 DATA_SCALE은 1이 저장되어 테이블을 생성할 때 정의한 NUMBER(3,1)의 의미를 알수 있습니다.

 

 

여기서 중요한 부분은 DATA_PRECISION은 소숫점을 포함한 자릿수라는 점이죠. 이렇게 설명하면 이해가 잘 안가니 아래 직접 INSERT를 진행하면서 확인한 과정을 한번 살펴보죠.

반응형

 

NUMBER(3,1)로 컬럼이 생성되었기 때문에 당연히 123.4라는 숫자는 4자리라 지정한 3자리를 넘어가니 당연히 INSERT되지 않고 오류가 발생합니다.

 

 

그 다음으로 123 이라는 숫자는 대충 보기에 소수점이 없고 3자리이니 DECIMAL_POINT_TEST NUMBER(3,1)  이라고 지정한 컬럼에 데이터가 정상적으로 들어갈 것 같지만 아래와 같이 오류가 발생시킵니다.

 

 

즉 여기서 정확히 알 수 있는 부분은 NUMBER(3,1)의 의미는 정확히 정수부분이 2자리여야 한다는 것이죠.

 

이 자릿수를 넘기면 "ORA-01438 : 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다." 애러 메세지가 나오는데요. 애러 메세지가 참으로 이해 안가게 작성되었다는 것을 다시 한번 느낍니다.

 

 

암튼, 아래에서 보듯 12이라는 정수는 정수 자릿수가 2개라 INSERT가 잘 되고, 12.3 역시 정수는 2자리 소수점은 1자리 총 3자리로 정상적으로 INSERT가 됩니다.

 

 

 

그럼 여기서 문제 하나를 내볼게요.

 

12.4633이라는 숫자는 NUMBER(3,1)이라고 지정된 컬럼에 정상적으로 저장이 될까요? 안될까요?

 

SCALE이 1로 지정되었기 때문에 소수점 자릿수를 초과하는 숫자를 INSERT하면 애러가 발생할 것으로 예상했지만, 아래와 같이 정상적으로 INSERT가 되고 반올림되여 소수점 1자리만 반영된 것을 알 수 있습니다.

 

 

애러는 발생하지 않았지만, 만약 테이블의 설계 시 의도가 위와 같지 않으면 예상하지 못한 반올림된 데이터를 저장할 수 있기에 신경을 써야할 것 같습니다.

 

 

위 내역을 요약하자면,

 

NUMBER(3,1)은 정수 2자리 소수점 1자리 숫자가 저장되며, 해당 컬럼에 입력되는 정수는 자릿수 초과시 애러를 발생시키지만 소수점은 자릿수가 초과되어도 애러를 발생시키지 않고 지정된 자릿수로 반올림 처리가 된다는 것입니다. 

728x90
반응형