오류 로그가 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 체크를 하는 것보단 설정에 추가하는게 좋겠다.
'Backend Web > SQL · DB 기초' 카테고리의 다른 글
[SQL] ORA-01461: LONG 값은 LONG 열에 삽입할 때만 바인드할 수 있습니다 (0) | 2025.04.07 |
---|---|
[SQL] ORA-01427 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. (0) | 2024.04.29 |
[SQL] ORA-01461 LONG 값은 LONG 열에 삽일할 때만 바인드할 수 있습니다. (0) | 2024.04.11 |
[SQL] ORA-00923 FROM 키워드가 필요한 위치에 없습니다. (0) | 2023.06.05 |
[SQL] cron(크론) (0) | 2023.06.05 |