리터럴이 형식 문자열과 일치하지 않음 에러. 0 1 684

by 삑사리통 [Oracle 기초] [2020.10.06 23:53:02]


안녕하세요.

오늘도 열심히 일하는 초보 개발자 입니다.

오늘은 다름이 아니라 개발이 완료된 프로그램을 지금까지 한글 버전으로 테스트 하며 진행했었는데

영어버전으로 프로그램을 실행시켜 테스트를 했더니 리터럴 형식 에러가 발생합니다.

한글 버전일때는 문제 없이 조회가 되던것들이 영어버전으로 바꿔 진행했더니

에러가 발생하여 리터럴 에러를 인터넷에 찾아보니 거의 TO_CHAR(), TO_DATE() 를 사용할때 

포맷 형식을 명시하지 않아서 에러가 발생한다는것을 알게 되어 수정을 하여 실행을 했더니

몇몇은 에러 없이 실행이 되었고 나머지들은 에러가 계속 발생합니다.

그래서 첫번째 질문은 왜 한글 버전에서는 잘 되던것들이 영어 버전으로 바뀌어서 실행했을때

에러가 나는지에 대해 궁금합니다. 그리고 두번째는 TO_CHAR(), TO_DATE() 를 사용할때 'YYYY-MM-DD'

이런식으로 포맷형식을 명시해줬는데 되는것은 되고 안되는것은 아무리 쿼리를 찾아봐도

안되는데 이유가 궁금합니다. 이런 에러가 나는것을 하나하나 찾아 바꾸는 방법 이외에

한번의 설정으로 바꿔 수정을 하는 방법이 있을지도 궁금합니다.

혹시 아신다면 답글을 달아주신다면 너무 감사하겠습니다.

by 마농 [2020.10.07 08:18:29]

케이스 바이 케이스 입니다.
에러가 발생하는 각각의 상황별로 에러 원인을 명확하게 파악하셔야 합니다.
설정을 바꾸어 에러를 회피하기 보다는 에러가 발생되지 않도록 원천 봉쇄하는게 맞습니다.
에러가 발생하는 예를 들어 보면
1. TO_DATE(sysdate) 했다면?
 - TO_DATE 는 문자를 날짜로 바꾸는 구문인데. 문자가 와야 할 부분에 날짜가 와버렸네요.
 - 이게 에러가 나야 정상인데 에러가 나기도 하고 안나기도 합니다.
 - 날짜를 문자로 자동 치환한 뒤 다시 to_date 하기 때문입니다.
 - 잘못된 사용법이고, 이렇게 사용한 목적이 시분초를 제거한 일자만 출력할 목적이라면
 - 다음과 같이 바꾸면 됩니다. TRUNC(sysdate) 또는 TRUNC(sysdate, 'dd')
2. TO_DATE('2020-10-07') 하면?
 - 포멧을 지정 안했기 때문에 에러가 나기도 하고 안나기도 합니다.
 - 포멧이 지정되지 않으면 nls_date_format 을 적용하여 변환하는데.
 - 우리나라는 년월일 포멧을 사용하지만, 외국은 월일연 포멧이 사용되거나, 월도 숫자가 아닌 영문을 사용하는게 다반사죠.
 - 정확하게 포멧을 지정하는게 맞습니다. TO_DATE('2020-10-07', 'yyyy-mm-dd')
3. TO_DATE(dt, 'yyyymmdd') 포멧을 지정했는데도 에러가 난다면?
 - 해당 컬럼에 오류 데이터가 포함된 경우입니다.
4. 언어에 따른 에러
 - 한글에서는 잘되던게 영문에서는 안된다면?
 - TO_DATE('2020-10월-07', 'yyyy-Mon-dd')
 - TO_DATE('2020-10월-07', 'yyyy-Mon-dd', 'nls_date_language=Korean')
 - 영문에서는 잘되던게 한글에서는 안된다면?
 - TO_DATE('2020-Oct-07', 'yyyy-Mon-dd')
 - TO_DATE('2020-Oct-07', 'yyyy-Mon-dd', 'nls_date_language=English')
5. 설정 바꾸기
 - ALTER SESSION SET NLS_DATE_LANGUAGE=AMERICAN;
 - ALTER SESSION SET NLS_DATE_LANGUAGE=KOREAN;
 - ALTER SESSION SET NLS_DATE_FORMAT='yyyy-mm-dd';

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입