Backend Web/SQL · DB 기초

[SQL] ORA-00932 데이터 유형이 일치하지 않습니다

sofiaaa 2025. 4. 22. 09:28
반응형

 


오류 로그가 preparedStatement.setNull(18,1111) 로 계속 났었다.

18번째 컬럼이 오류라는데 전혀 그런 것 같지 않았다. 

원인을 찾아보자

 

🚨 오류 원인

1111은 java.sql.Types.OTHER에 해당하는 값이지만, Oracle에서 이 타입을 사용하는 칼럼이 아니라면 오류가 납니다.
특히, 해당 칼럼이 VARCHAR2, NUMBER, DATE와 같이 일반적인 타입인데 1111을 넣으면 "부적합한 열 유형" 또는 유사한 타입 관련 오류가 발생합니다.

 

✅ #{param, jdbcType=VARCHAR} 형태로 사용

 
<insert id="insertUser" parameterType="User"> 
INSERT INTO users (name, age) 
VALUES (#{name, jdbcType=VARCHAR}, #{age, jdbcType=INTEGER}) 
</insert>
 

💡 왜 jdbcType을 명시해야 하나요?

  • MyBatis는 Java null 값을 SQL에 바인딩할 때 어떤 타입인지 몰라서 오류가 날 수 있어요 (특히 Oracle에서는).
  • 그래서 jdbcType=VARCHAR처럼 명시해주면, 내부적으로 setNull(index, Types.VARCHAR)처럼 동작합니다.

 

✅ 해결 방법

1. jdbcTypeForNull  적용

MybatisSqlSessionFactoryBean을 사용한다면, Configuration 객체를 생성해서 설정해주면 됩니다.    

mybatisConfig.setJdbcTypeForNull(org.apache.ibatis.type.JdbcType.VARCHAR);  // 핵심 부분!

 

mybatis-confg.xml 에 설정한다면,

<configuration>
  <settings>
    <setting name="jdbcTypeForNull" value="NULL" />
  </settings>
</configuration>

 

2. null 체크 추가

if (name == null) {
    preparedStatement.setNull(1, java.sql.Types.VARCHAR);
} else {
    preparedStatement.setString(1, name);
}

 

 

결론적으로는 NULL 값이 들어왔을 때 허용에 관련한 설정이 없는데,

NULL 이 들어가고 있어서 나는 오류였고 

아무래도 NULL 체크를 하는 것보단 설정에 추가하는게 좋겠다.

반응형