myBatis 쿼리실행시 이해가 안되는 ORA-00932 오류가 납니다. 0 8 9,166

by 아플라 [SQL Query] Oracle MyBatis [2019.05.27 13:57:05]


INSERT    INTO TABLE
(
    A (Number(19,6) 입니다..)
)
VALUES
(
    COALESCE(#{PARAM}, 0)
)

Java에서 위의 쿼리를 myBatis를 이용해 실행하는데 에러가 발생합니다. 
파라미터 대입이 끝나고 실행되는 실제 쿼리는 이러했습니다.
 

INSERT INTO TABLE
(
  A
)
VALUES
(
  COALESCE(NULL, 0)
)

이 쿼리를 실행했더니 Java 콘솔창에 " ORA-00932 : 일관성 없는 데이터 유형 CHAR가 필요한데 NUMBER임 " 이런 에러로그가 남았습니다.
그런데 Toad에서 직접 쿼리실행을 해보니 아무런 오류 없이 쿼리가 정상 실행되었습니다.
컬럼 데이터타입도 수도없이 확인해봤지만 Number가 들어가는게 맞는데 자꾸 CHAR가 필요하다고 하니 이유는 잘 모르겠지만 CHAR를 필요로하니 쿼리를 바꿔보았습니다. 
COALESCE(#{PARAM}, '0') 로 변경해주니까 잘 되더군요.
왜 이런 현상이 발생하는걸까요 ?? 

PS. SQL은 문제가 발생하는 부분만 간략하게 올렸습니다.

 

by DarkBee [2019.05.27 14:00:52]

NULL 이 실제 NULL 이 아니고 String 'NULL' 이 아닐지 예상해봅니다.


by 아플라 [2019.05.27 14:05:09]

음... 그렇다면 오류메세지가 'NUMBER가 필요한데 CHAR임' 이렇게 나와야하지 않을까요?


by 마농 [2019.05.27 14:11:07]

앞쪽 타입 기준입니다.
앞이 문자이므로 뒤에도 문자가 와야 하므로
현재 에러 메시지가 맞습니다.


by 아플라 [2019.05.27 14:17:18]

아아 그런거군요 ... COALESCE에서 형이 안맞아서 발생하는 문제였네요.
 

SELECT COALESCE('1', 2)
FROM DUAL

위 쿼리로 테스트해보니 같은 오류를 확인할 수 있었습니다... 
그런데 쿼리 로그에는 분명 'NULL' 이 아닌 NULL 이라고 나오는데 이상합니다.
#{PARAM}, ${PARAM} 두 경우 모두안되네요... 
조언해주신덕에 가닥은 잡힌것 같습니다. 감사합니다.


by 마농 [2019.05.27 14:19:51]
-- 동일 에러 재현 --
SELECT  COALESCE('', 0) FROM dual;
SELECT  COALESCE(TO_CHAR(NULL), 0) FROM dual;

 


by 마농 [2019.05.27 14:26:29]

# 이 숫자, $ 가 문자를 의미하는게 아닙니다.
# 은 변수처리 $ 는 상수처리 인걸로 압니다.
# 이나 $ 가 아닌 PARAM 자체의 자료형을 바꿔야 할 듯 한데요?


by 아플라 [2019.05.27 14:30:38]

다른경우는 모르겠지만, 현재 사용중인 개발환경에서는 prepared statement를 만드는데 전부 문자열로 만들어 보내는것 같습니다. Statement의 경우 그대로 나오네요.
PARAM=123 ::: #{PARAM}-> '123' , ${PARAM} -> 123 이런식으로 변환됩니다. PARAM 자체의 자료형에 직접 접근할 수 있는지는 모르겠는데 한번 알아봐야할것같습니다 ㅎㅎ.


by 마농 [2019.05.27 14:03:33]

변수가 문자형 변수가 아닐지 예상해봅니다.
대안
1. 변수를 실수형 변수로 변경하기.
2. 형변환 함수 사용 : COALESCE(TO_NUMBER(#{PARAM}), 0)
3. NVL 로 대체 : NVL(#{PARAM}, 0)

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