개발자가 가장 미치는 상황중 하나는
내꺼에선 잘되는데 서버에 올리는 포팅만 하면 안되는 상황일 것이다.
그중 대표적인것중 하나가
ORA-01861: 리터럴이 형식 문자열과 일치하지 않음
ORA-01861: literal does not match format string
바로 이 에러...
toad나 sqlgate 에선 잘만되는게 서버에만 올리면 안되는 미치는 상황이다.
일단, 원인은 TO_DATE와 TO_CHAR의 함수에 날짜형식을 지정하지 않았을 때
기본값으로 지정되는 형식이 달라서 그렇다.
TO_DATE('2014-01-01', 'YYYY-MM-DD') 이런식으로 쓰는데 두번째 인수인 'YYYY-MM-DD'를
생략해버리면 환경에 따라 서로 다른값이 지정되므로 최악의 경우
TO_DATE('2014-01-01', 'DD-MON-RR') 이런식으로 기본값이 들어가며 실행되는 경우가 생겨서
위와같은 ORA-01861 오류가 생기는 것이다.
물론 최선의 해결책은 TO_DATE와 TO_CHAR를 쓸 때에는 항상 데이터형식을 지정하는 것이지만,
개발이라는게 어찌그리 되는가? 분명 어딘가에서는 빼먹기 마련인데,
빼먹은것이 서버에 올라갈때까지 발견 안된다는건 너무 위험한 상황이다.
게다가 저 에러는 뷰 내부나 저장프로시저 내부에서 빼먹어도 에러가 난다!
한마디로 내 소스 전체에서 TO_DATE나 TO_CHAR로 전체검색 한다고 찾아지는 문제가 아니란 의미.
그러므로 서버 환경을 내 로컬환경에도 맞춰서(!!) 서버에서 나는 에러는 나도 나는 상황이
더 좋은 개발환경이라고 생각된다.
그러니 한번이라도 서버에 sqlplus로 접속을 해서
SELECT * FROM nls_session_parameters WHERE PARAMETER LIKE '%DATE%' OR PARAMETER LIKE '%LANG%';
이 쿼리를 한번 날려서 서버가 어떤값들이 사용되고 있는지 알아내자.
서버 sqlplus로 접속하기 어렵다면,
저쿼리를 실행하는 프로그램을 짜서 서버에 포팅해서 실행해 버리자.
아무튼 그런식으로 서버 환경값을 다 알아낸 다음에
내 환경도 서버랑 같게 맞춘다.
여기서 주의할것은 NLS_DATE_FORMAT 값 한개만 맞춘다고 되는게 아니라
NLS_LANGUAGE, NLS_DATE_LANGUAGE 까지 총 3개 전부 맞춰야 한다.
일단 토드에서도 서버랑 같은 에러가 나는것이 속편함으로
토드 실행 후에
ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
이런식으로 한번 쿼리를 (물론 저 값을은 서버값으로 맞춘다) 날린다음에
오류가 나는 쿼리를 실행해보면 서버에서 나던 오류가 내 토드에서도 나는것을 확인할 수 있다.
아에 세션 전체나 접속환경차원에서 저값을 고정시키는 방법도 있지만
그 방법은 검색하면 나온다....... 하지만
TO_CHAR, TO_DATE의 두번째 인수를 항상 지정하는 버릇을 들이기 위해서라도
나는 일부러 고정하지 않고 있다.
출처 : https://m.blog.naver.com/PostView.nhn?blogId=jeemin5&logNo=220141590502&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F