Oracle BLOB 매핑 오류 해결 가이드
- 에러가 발생했다. 에러 없는 세상에서 살고 싶다.
- 이상하다 로컬에서는 에러가 나지 않던게 서버에 적용시키니까 에러가 난다.
- Blob 데이터를 select 할때 에러가 난다.
- 오류 내용을 살펴 보자.
💥 오류 내용
org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL [];
SQL state [99999]; error code [17004];
Cause: java.sql.SQLException: 부적합한 열 유형: getString not implemented for class oracle.jdbc.driver.T4CBlobAccessor❓ 원인 분석
- Oracle의
BLOB컬럼을 Java에서getString()으로 읽으려 했기 때문에 발생한 오류입니다. T4CBlobAccessor는getString()호출을 지원하지 않으며,byte[]또는java.sql.Blob형태로 처리해야 합니다.
✅ 해결 방법
1. resultMap에서 jdbcType="BLOB" 설정 및 VO 수정
iBATIS XML 예시
<resultMap id="exampleResultMap" class="com.example.YourVO">
<result property="id" column="ID"/>
<result property="blobData" column="BLOB_COLUMN" jdbcType="BLOB"/>
</resultMap>
VO 클래스 예시
// BLOB을 byte 배열로 처리
private byte[] blobData;
또는
// java.sql.Blob으로 처리
private java.sql.Blob blobData;
2. Custom TypeHandler 사용 (String으로 변환하려는 경우)
TypeHandler 클래스
public class BlobToStringTypeHandler extends BaseTypeHandler<String> {
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
Blob blob = rs.getBlob(columnName);
return new String(blob.getBytes(1, (int) blob.length()));
}
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setBytes(i, parameter.getBytes());
}
// 기타 getNullableResult 오버라이드 생략
}
iBATIS 설정
<typeHandler javaType="java.lang.String" jdbcType="BLOB" handler="com.example.BlobToStringTypeHandler"/>
3. 디버깅: BLOB 컬럼을 SELECT에서 일시적으로 제외
SELECT ID, NAME FROM YOUR_TABLE -- BLOB 컬럼 제외
정상 동작하면, BLOB 컬럼 매핑 문제로 확정할 수 있습니다.
📌 요약
| 항목 | 설명 |
|---|---|
| 문제 | BLOB 컬럼을 getString()으로 처리하려 해서 발생 |
| 해결 방법 1 | VO에서 byte[] 또는 Blob 타입 사용 |
| 해결 방법 2 | Custom TypeHandler로 변환 처리 |
| 해결 방법 3 | 일시적으로 BLOB 제외하여 문제 확인 |
| 기타 | JDBC 드라이버 버전 확인 필요 |
생각정리
- 사실 아직도 로컬환경과 서버환경에서의 차이가 뭔지 파악은 못했다.
- ojdbc 버전도 모두 같고, 자바 버전도 같다. 프로젝트 환경도 똑같다.
- 일단... 주석처리하고 테스트를 진행하는 방향으로 마음을 먹었다.
'개발 > DB' 카테고리의 다른 글
| [oracle Like In 절] 오라클 LIKE를 IN절처럼 사용하는 방법 (IN-LIKE 구현 팁) (4) | 2025.08.10 |
|---|---|
| [Oracle 문법 merge into] 문법, 예제, 활용도에 대해 기록 (0) | 2025.07.09 |
| 오라클 BETWEEN과 LIKE 스캔 범위를 비교 해보자 (0) | 2022.08.31 |
| 오라클(oracle) 등 DB에서 IN절과 '=' 개념 차이 확인 (0) | 2022.08.30 |
| [oracle] 오라클 view 생성 등 기초 알아보기(view, mview) (0) | 2020.06.10 |
| [oracle] synonym(동의어) 생성 및 삭제 (0) | 2020.06.09 |
| [오라클(oracle)] join update 힌트로 해결 (2) | 2020.03.04 |