도대체 에러가 왜 나는지 갈피를 못잡겠습니다 ㅠㅠ 0 2 1,480

by 개리끼리 [2016.09.12 17:44:00]


오라클입니다.

에러메세지: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;

 
by 마농 [2016.09.13 08:32:37]

문자를 숫자로 바꿀 때. 숫자로 변경 불가한 문자가 있어서 나는 에러죠.
원하시는것이 0을 제거하기 위함이라면?
굳이 숫자로 바꿀 필요가 없습니다.
그냥 문자 상태로 0 만 제거하세요.
LTRIM(msa, '0')


by 개리끼리 [2016.09.13 13:26:05]

마농님 감사합니다!

그렇게 간단한 방법이 있다니... 

공부 좀 해야겠네요 ㅎ

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