1. 발생 상황: Mybatis 환경에서 CLOB or BLOB insert 중 발생.ORA-01461(LONG 값은 LONG 열에 삽입할 때만 바인드할 수 있습니다.)
<insert id="insert" parameterType="vo.insert">
INSERT INTO INSERT_TABLE(
SEQNO
, BINARY_COLUMN
) VALUES (
SEQNO.NEXTVAL
, BASE64DECODE(#{BINARY_COLUMN})
)
</insert>
2. 단위 테스트
- MYBATIS 에러사항 인지 확인을 위해. #{BINARY_COLUMN, jdbcType=CLOB} 처럼 작성하였으나 동일 에러발생.
- BASE64DECODE (오라클에 만들어 놓은 BASE64 디코딩 함수.)에서 발생한 상황인가 싶어 자바에서 BASE64 디코딩 후 INSERT하였지만 동일한 에러 발생.
- INSERT시 해당 컬럼을 오라클 함수 'EMPTY_BLOB()'로 초기화 후 UPDATE를 해보았지만 동일 에러 확인.
- 동일한 INSERT 쿼리를 DB에 직접 날린 결과 'ORA-01704(문자열이 너무 깁니다.)' 확인.
위의 테스트 결과 오라클에서 INSERT시 4000bytes 이상의 데이터 입력시 발생되는 사항을 확인.
3. 해결 방안
PL/SQL을 사용하여 해결.
<insert id="insert" parameterType="vo.insert">
BEGIN
INSERT INTO INSERT_TABLE(
SEQNO
, BINARY_COLUMN
) VALUES (
SEQNO.NEXTVAL
, BASE64DECODE(#{BINARY_COLUMN})
)
;
END
;
</insert>
위의 해결 방법 외 4000bytes씩 잘라서 넣는 방법도 있다.
문제의 원인은 다양하다. oracle 커뮤니티를 확인해본 결과 캐릭터셋에 의해 발생될 수도 있으며, 오라클 내장함수를 써서 발생하는 경우도 있다. (NVL, TRIM 등의 함수는 4천바이트까지 사용할 수 있는 내장함수이다.)
참조)
'Error > Oracle Error' 카테고리의 다른 글
오라클(Oracle) DB Link Create Error (ORA-02153) (0) | 2020.01.02 |
---|---|
Could not open JDBC Connection for transaction (0) | 2019.12.17 |
Comment