ORA-01722: 수치가 부적합합니다, 01722. 00000 - "invalid number" 해결방법이 궁금합니다 0 5 2,114

by 날아라갑을 [SQL Developer] 수치부적합 xml쿼리 [2018.10.15 15:03:14]


안녕하세요.. 질문 제목과 같은 에러가 계속나타나서 해결법을 찾고싶습니다

해당 쿼리는 아래와같이 이루어져있습니다

 

 

SELECT A.* FROM(    SELECT A.USER_ID, A.USER_NM, A.COMP_SEQ || '' AS COMP_SEQ, B.COMP_NM , C.CUST_SEQ        FROM CM_USER_TB A,          (SELECT      A.MINOR_NM AS COMP_NM, A.MINOR_SEQ, B.VALUE_TEXT AS COMP_SEQ  
FROM CM_ENV_MINOR_TB A, CM_ENV_MINOR_VALUE_TB B 
WHERE 1=1  
AND A.MAJOR_SEQ=1009  
AND A.USE_YN=1 
AND A.MINOR_SEQ=B.MINOR_SEQ
AND B.TITLE_SERL=6) B, CM_USER_SITE_TB C      
WHERE 1=1      
--AND A.USER_TYPE = 10070005
AND A.USE_YN = 1    
AND A.COMP_SEQ(+) = B.COMP_SEQ    
AND A.USER_SEQ = C.USER_SEQ) A, MA_CUST_TB B    
WHERE 1=1         
AND A.CUST_SEQ = B.CUST_SEQ    
AND B.COMP_SEQ = '1'
--AND B.CUST_CLS2 = '10080010'         
AND B.COMP_SEQ NOT IN('77','99')  
ORDER BY A.COMP_SEQ DESC 
;

 

글자색상이 들어간부분만 수치부적합 에러가 나타납니다

FROM 절에 들어가있는 테이블들에 AND조건의 컬럼을 보면 NUMBER(12,0) 상태입니다

그렇지만.. 조건 = '값'이 들어간다고 수치부적합이 나타나는지 궁금합니다 ;;

by 신이만든지기 [2018.10.15 16:27:20]

조건 = '값' 중에서 조건컬럼이 number 타입이라면, 오라클이 묵시적 형변환을 해줍니다.

조건 = TO_NUMBER('값') 이런식으로요. 그런데 '값' 에 해당하는 문자열에 0~9 이외의 문자열이 들어가면 위와 같은 오류가 발생합니다.

그러니 먼저 입력되는 '값'에 문자열이 들어가는지 확인해보시기 바랍니다. 

특별한 일이 없다면 조건 = TO_NUMBER('값') 형태로 바꾸는게 좋습니다.


by 마농 [2018.10.15 16:31:24]

1. 정확하게 최종 에러나는 구문인가요?
  - 이것 저것 시도해 보다가 질문 따로 쿼리 따로인 경우를 많이 봤습니다.
  - 정확하게 최종 에러 구문인지 다시 한번 더 확인 바랍니다.
2. 빨간색 주석에서 에러난다는 건 어떻게 확인했나요?
  - 빨간색 주석을 풀었을 때 에러나나요?
  - 주석을 했을 때 에러나나요?
3. 비교조건에 사용되는 모든 컬럼의 자료형을 조사해 보세요.
  - 상수 비교 뿐만 아니라 조인 비교에 사용되는 컬럼들도 모두 조사하세요.


by 날아라갑을 [2018.10.15 17:31:16]

신이만든지기 // 네, 저도 묵시적으로 변환해주는것으로 알고있습니다

값에 문자열들어가있는지를 체크를 안해보았군요 .. 확인해보겠습니다

 

마농 // 빨간색 주석을 해제했을때 나타납니다 두군데 한곳이라도 풀면 수치부적합 에러가 나타납니다

조인비교도 영향을 미치는지 확인을 못했군요 감사합니다!


by 마농 [2018.10.15 17:42:16]

1. 조건을 주었을 때 에러가 안나고 조건을 빼면 에러가 난다면?
  - 조건에 해당하는 자료중에는 에러자료가 없었던 것입니다.
  - 해당 조건이 원인이 아니라 다른 조건이 원인입니다.
  - 의심가는 구문은 (A.COMP_SEQ(+) = B.COMP_SEQ) 입니다.
2. A.COMP_SEQ || '' AS COMP_SEQ 구문을 보면 숫자를 문자로 바꾸려는 시도로 보입니다.
  - 따라서 좌변의 A.COMP_SEQ 는 숫자인 듯 하고.
3. B.VALUE_TEXT AS COMP_SEQ 구문의 컬럼명을 보면 문자형인 것 처럼 보입니다.
  - 따라서 우변의 B.COMP_SEQ 는 문자인 듯 하네요.
4. 문자와 숫자를 비교하면
  - 문자가 숫자로 자동형변환 됩니다.
  - 이 과정에서 오류가 발생하는 거구요.
5. 따라서 문자끼리 비교하도록 조건을 바꿔보세요.
  - 변경전 : AND A.COMP_SEQ(+) = B.COMP_SEQ
  - 변경후 : AND A.COMP_SEQ(+)||'' = B.COMP_SEQ


by 날아라갑을 [2018.10.16 11:37:08]

마농 // 정확한 문제점과 해결방법제시 .. 정말 감사합니다!

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