본문 바로가기
  • AI (Artificial Intelligence)
Skills/Database

TO_CHAR 에 대한 문제점

by 로샤스 2014. 6. 27.
변환형 함수
TO_CHAR : 숫자나 날짜를 문자열로 변환
TO_NUMBER : 문자를 숫자로 변환
TO_DATE : 문자를 날짜로 변환

- TO_CHAR에서 숫자를 문자로 변환시에 형식에 사용되는 요소
9 : 일반적인 숫자를 나타냄
0 : 앞의 빈자리를 0으로 채움
$ : dollar를 표시함
L : 지역 통화 단위(ex )
. : 소숫점을 표시함
, : 천단위를 표시함
- TO_CHAR에서 날짜를 문자로 변환시에 형식에 사용되는 요소
SCC : 세기를 표시 S는 기원전(BC)
YEAR : 연도를 알파벳으로 spelling
YYYY : 4자리 연도로 표시
YY : 끝의 2자리 연도로 표시
MONTH : 월을 알파벳으로 spelling
MON : 월의 알파벳 약어
MM : 월을 2자리 숫자로 표시
DAY : 일에 해당하는 요일
DY : 일에 해당하는 요일의 약어
DDD,DD,D : 연도,월,일 중의 날짜를 숫자로 표시
HH , HH24 : (1-12) , (0-23)중의 시간을 표시
MI : 분을 표시
SS : 초를 표시
AM(A.M.),PM(P.M.) : 오전인지 오후인지를 표시


TO_CHAR(문자값,‘형식’)
숫자를 문자로 변환 : TO_CHAR(350000,'$999,999')→ $350,000
숫자를 날짜로 변환 : TO_CHAR(SYSDATE,'YY/MM/DD')→ 95/05/25
TO_DATE(문자값, ‘형식’) : TO_DATE('10 SEPTEMBER 1992','DD MONTH YYYY')→10-SEP-92
TO_NUMBER(문자값) : TO_NUMBER('1234')→ 1234

 

========================================================================

 

검색을 해서 TO_CHAR의 기능을 보니 이렇게 나와있더군요..

 

제가 시퀀스를 생성해서 CHAR(12)의 컬럼에 시퀀스로 값이 들어가는데 시퀀스가 들어가고 나머지는 0으로 채워지는것을 넣어야했습니다.

 

저는 NCA라는 아답터를 통해 DB TO DB를 하고있는데..

 

컬럼정보를 넣어둔 뒤에 DB를 연결해서 시퀀스의 값을 받아온후 그것을 컬럼에 넣어야 하는 상황이었어요.

 

시퀀스명이 E_SEQ였는데..

 

SELECT TO_CHAR(E_SEQ.NEXTVAL,'000000000000') SEQ FROM DUAL; 을 하게 되면

 

이론상으로는 '000000000001' 이라는 값이 넘어와야 합니다.

 

당연한듯이 코딩을 해놓고 돌려보니 왠걸.. 12자리 범위를 넘어섰습니다 (13) 이라고 하는 오류메세지가 뜨더군요..

 

이게 뭔가..뭔가 하면서 끙끙 앓고 있다가 시퀀스가 제대로 받아오는지부터 확인해보기로 했어요..

 

SELECT '['||TO_CHAR(E_SEQ.NEXTVAL,'000000000000')||']' SEQ FROM DUAL;

 

했더니 나오는 값이 [ 000000000001] 더라구요.. 정확하게 보기위해서..

 

SELECT LENGTH(TO_CHAR(E_SEQ.NEXTVAL,'000000000000')) SEQ FROM DUAL;

 

을 해서 보니 13 이 나오더라구요..

 

맨 앞에 공백 ' ' 이 한개 들어가는거에요..

 

왜그런가 궁금해 하다가 봉의누님께 여쭤보니.. TO_CHAR에서 0은 무효를 시키는기능이 있다고 하면서

 

1 을 0000 식으로 컨버트할때 '00001' 이 되었다가  ' 0001' (앞에공백으로 변함)이 된다고 하더군요..

 

그러면서 11을 0000식으로 컨버트할때는 '000011' 이 되었다가 ' 00011' 이 되고 다시 '00011'이 되었다가 ' 0011' 이 된다는얘길 들었어요

 

이게 어떻게 보면 대수롭지않게 넘길수있는 문제같지만.. 데이터타입의 BYTE가 딱 맞게 설계되있는 프로그래밍을 할때에

 

값이 컬럼BYTE를 초과해버리는 일이 발생... TO_CHAR를 사용할땐 TRIM과 함께...

 

SELECT TRIM(TO_CHAR(E_SEQ.NEXTVAL,'000000000000')) SEQ FROM DUAL;

 

이렇게 사용해야 한다는 요령이 생기게 되는겁니다..

 

 

 

 

 

 

 

 

 

 

출처 : http://blog.naver.com/kaise2k/10070479719

 

 

Tip : 시퀀스 0에대한 처리와 자릿수 오버에 관련하여 Trim 사용하는 법에 대해서 나와있음.

 

 

 

 

 

댓글