[ORACLE] ORA-01461 / CLOB or BLOB insert Error

ORA-01461

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천바이트까지 사용할 수 있는 내장함수이다.)

 

참조)

https://community.oracle.com/tech/developers/discussion/879650/add-big-text-to-a-clob-fileld-with-update-50-mb-in-oracle-ora-01461

https://community.oracle.com/tech/developers/discussion/4051194/how-to-insert-data-from-clob-to-long-column