Spring + myBatis를 이용하여 Oracle DB작업을 하는중 insert문에서 아래와 같은 오류가 발생합니다.

 

error code [17004]; Invalid column type;

 

org.springframework.jdbc.UncategorizedSQLException: Error setting null for parameter #11 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: Invalid column type
; uncategorized SQLException for SQL []; SQL state [null]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
        at $Proxy18.insert(Unknown Source)
        at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:237)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:79)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
        at $Proxy27.insertDailyReport(Unknown Source)

 

입력되는 변수들의 값을 디버깅으로 찍어보니 몇몇 컬럼의 값이 null로 넘어갑니다.

이상하다? null을 넣을수 없는건 아닐텐데... 물론 컬럼은 Nullable형태입니다.

 

쿼리와 변수를 조합해서 직접 쿼리를 날리면 정상적으로 insert됩니다.

 

검색을 해보니 myBatis의 특성(?) 때문인것 같습니다.

 

이전 MySQL 을 사용할때는 전혀 고려하지 않았는데, 이상합니다.

 

iBatis, myBatis 모두 Oracle을 사용할때는 다음과 같이 nullable column을 사용하기 위한 처리를 해줘야 합니다.

 

jdbcType=VARCHAR

 

예제를 보면 다음과 같습니다

 

insert into (emp_no, emp_name) values ( #{empNo, jdbcType=INTEGER}, #{empName, jdbcType=VARCHAR})

 

iBatis에서는 다음과 같이 사용합니다.

 

(#id:VARCHAR#, #name:VARCHAR#, #title:VARCHAR#)

 

insert into (emp_no, emp_name) values ( #empNo:INTEGER#, #empName:VARCHAR#)

 

자세한 내용은 아래 사이트에서 참고하면 됩니다.

 

http://mybatis.github.io/mybatis-3/ko/index.html

 

mybatis-config settings를 이용해서도 위의 사항을 처리할수 있습니다.

>>> Added by UncleJoe