오라클입니다.
에러메세지:ORA-01722: 수치가 부적합합니다
지금 '0219' 이런 값에서 앞에 있는 0들을 다 지우려고 하고 있습니다.
t1.MSA 라는 컬럼은 PK이며 VARCHAR2(4byte) 입니다. 보통 값은 '0211' , '2112' , '0021' 이런 값들을 갖습니다.
resultClass 는 new_msa라는 프로퍼티를 가지며 String형식 입니다.
처음에 TO_CHAR(t1.MSA, '9999') NEW_MSA 이렇게 해서 oracle sqldeveloper에서 돌려봤더니
잘됐습니다.
그래서 ibatis로 옮겨서 했더니 'ORA-01722: 수치가 부적합합니다' 라는 오류가 떴습니다.
알아보니 캐스팅을 잘못해서 그렇다는 글이 많았습니다.
그래서 1. TO_CHAR(t1.MSA,'9999') NEW_MSA
2. TO_CHAR(TO_NUMBER(t1.MSA,'9999')) NEW_MSA
3. TO_CHAR(TO_NUMBER(t1.MSA),'9999') NEW_MSA
4. TO_CHAR(TO_NUMBER(t1.MSA)) NEW_MSA
5. TO_NUMBER(t1.MSA) NEW_MSA
6. TO_CHAR(TO_NUMBER(t1.MSA,'9999')) NEW_MSA
이런저런 방법을 다 써봤지만 똑같습니다.
TO_CHAR(TO_NUMBER('0211','9999')) NEW_MSA 이렇게 '0211'이란 값을 직접 넣어보면 잘됩니다.
혹시 문자 인식이 잘 안되나 해서
<![CDATA[ 쿼리 ]]> 이렇게 감싸보았지만 소용 없습니다.
서브쿼리로 만들어서 TO_NUMBER를 수행한 후 위에서 TO_CHAR를 수행하는 방식도 안먹힙니다.
오라클 sqlDevelopment에서 위에서 써놓은 1-6번 중 대부분은 에러없이 실행됩니다.
알아서 유도리 있게 넘어가 주는 것 같은데
ibatis는 좀 엄한것 같습니다 ㅠ
혹시 몰라서 전체 코드도 올려볼게요
서울 강남구 0111 - 2
이런 주소를 111-2 이렇게 바꾸려는 코드입니다.
SELECT tb1.*,
CASE tb1.HH_DSA
WHEN '0000' THEN tb2.EE_CONTENT||' '||TRIM(TO_CHAR(TO_NUMBER(tb1.HH_MSA),'9999'))
ELSE tb2.EE_CONTENT||' '||TRIM(TO_CHAR(tb1.HH_MSA, '9999'))||'- '||TRIM(TO_CHAR(tb1.HH_DSA,'9999'))
END as OLD_JUSO
FROM TB_AA_HH tb1, TB_BB_EE tb2
WHERE tb1.HH_BDO = tb2.EE_BDO AND tb1.HH_BSI = tb2.EE_BSI AND
tb1.HH_BDONG = tb2.EE_BDONG AND tb1.HH_BRI = tb2.EE_BRI;