본문 바로가기
study/ERROR CASE

ORA-22835 버퍼가 너무 작아 CLOB를 CHAR 또는 BLOB에서 RAW로 변환할 수 없습니다

by 휘루걸음 2024. 1. 30.
728x90
반응형

ORA-22835  저는 이 방식으로 해결하였습니다

맵으로 그냥 받는 경우, clob 객체가 찍힙니다. resultMap에서 String으로 치환해서 받아서 처리하였습니다.

 <resultMap id="getMapDetail" type="dbMap">
        <result column="M_CONT" property="mCont" javaType="java.lang.String" jdbcType="CLOB"/>
    </resultMap>
    <select id="selectDetail" parameterType="dataMap" resultMap="getMapDetail">
    ....
    </select>

 

반응형
728x90

CLOB를 RESULTMAP에 담는 경우

 

RESULTMAP은 MyBatis에서 사용하는 개념 중 하나입니다. MyBatis는 데이터베이스에서 조회한 결과를 자바 객체로 변환하는 데에 ResultMap을 사용합니다. ResultMap을 정의하면 데이터베이스의 결과를 매핑하여 자바 객체로 변환할 수 있습니다.

만약 CLOB 데이터를 ResultMap을 사용하여 자바 객체에 매핑하려면, 일반적으로 다음과 같은 방법을 사용할 수 있습니다. 아래 예제는 MyBatis에서의 ResultMap을 사용한 CLOB 데이터 매핑의 간략한 예시입니다.

1. MyBatis XML 파일에서 ResultMap 정의

<!-- resultMap 정의 -->
    <resultMap id="yourResultMap" type="YourJavaObject">
        <!-- 다른 필드 매핑 -->
        <id property="id" column="id_column" />

        <!-- CLOB 매핑 -->
        <result property="clobData" column="clob_column" jdbcType="CLOB" javaType="java.lang.String" />
    </resultMap>


   
2. SQL Mapper XML에서 ResultMap 사용

    <!-- 조회 쿼리 -->
    <select id="selectYourData" resultMap="yourResultMap">
        SELECT id_column, clob_column
        FROM your_table
        WHERE ...
    </select>




3. 자바 객체 정의

    public class YourJavaObject {
        private Long id;
        private String clobData;

        // 게터, 세터, 기타 메서드
    }



이렇게 정의된 ResultMap을 사용하여 CLOB 데이터를 자바 객체에 매핑할 수 있습니다. ResultMap을 사용하면 데이터베이스 결과의 각 열을 자바 객체의 필드에 매핑할 수 있으며, 이를 통해 CLOB 데이터를 원하는 형식으로 가져올 수 있습니다.

 

CLOB를 치환해서 사용하는 경우

이 오류는 Oracle에서 CLOB를 다른 데이터 타입으로 변환할 때 발생하는 문제입니다.

 

CLOB의 크기가 변환 대상의 최대 크기를 초과하고 있기 때문에 발생합니다.

CLOB는 큰 문자열 데이터를 저장할 수 있는 데이터 타입이며, CHAR, BLOB, RAW 등과 같은 다른 데이터 타입으로 변환할 때는 주의가 필요합니다.

 

이 문제를 해결하기 위해서는 CLOB의 크기를 축소하거나, 변환 대상의 데이터 타입을 변경해야 합니다.

다만, 데이터 손실이 발생할 수 있으므로 주의가 필요합니다.

1. CLOB 크기 축소하기

CLOB에 저장된 데이터가 4000자 이하라면, VARCHAR2로 타입을 변경하면 문제를 해결할 수 있습니다.

SELECT TO_CHAR(CLOB_COLUMN) FROM YOUR_TABLE; -- TO_CHAR 함수로 VARCHAR2로 변환


이 경우, 데이터 손실 없이 CLOB을 VARCHAR2로 변경할 수 있습니다.

2. CLOB 데이터 일부만 사용하기

실제로 필요한 데이터만 가져와서 사용할 수도 있습니다.

  SELECT DBMS_LOB.SUBSTR(CLOB_COLUMN, 4000, 1) FROM YOUR_TABLE; -- 일부 데이터만 사용


 이렇게 하면 일부 데이터만 가져와서 사용할 수 있습니다.

3. CLOB을 BLOB으로 변환하기

만약 텍스트 데이터가 아니라 이진 데이터인 경우, BLOB으로 변환할 수 있습니다.

   SELECT UTL_RAW.CAST_TO_RAW(CLOB_COLUMN) FROM YOUR_TABLE; -- CLOB을 BLOB으로 변환


이 경우, 이진 데이터를 사용할 수 있습니다.

728x90
반응형