ORA-01461: LONG 값은 LONG 열에 삽입할 때만 바인드할 수 있습니다. (ORA-01461: can bind a LONG value only for insert into a LONG column.) 오류와 관련하여 원인과 해결에 대해 알아봅시다.
우선 오라클 데이터베이스에서 데이터타입으로 VARCHAR2와 LONG을 안내해드리겠습니다.
- VARCHAR2 데이터타입은 가변 문자열로 최대 4,000byte의 크기를 가집니다.
- LONG 데이터타입은 최대 2GB의 정보를 담을 수 있으며 위와 마찬가지로 가변 길이 문자형입니다. LOB의 하위호환성을 가지는 데이터타입이라 실제 선언되어 사용하는 경우는 많지 않습니다.
ORA-01461 원인
결론부터 말씀드리면, 해당 오류는 VARCHAR2 의 최대 길이를 초과하는 문자열에 대하여 자동으로 LONG 데이터타입으로 변환된 값을 VARCHAR2 유형에 INSERT가 실패하여 발생하는 현상입니다. 예시를 통해 알아보도록 합시다.
테스트 테이블에 4000바이트, 4001바이트를 각각 저장해 봅시다.
테스트 환경은 다음과 같습니다.
1. 정상적으로 저장되는 경우 complete! 출력
2. 예외가 발생하는 경우 해당 예외 문구를 출력하도록 합니다.
4000바이트를 인서트 하는 경우
Insert Complete! length : 4000byte
4001바이트를 인서트 하는 경우
exception occurs! length : 4001byte , ERR : ORA-01461: LONG 값은 LONG 열에 삽입할 때만 바인드할 수 있습니다.
ORA-01461 해결하기
1. 컬럼의 최대크기만큼 저장하도록 데이터 길이를 조정합니다.
2. 4000바이트를 초과하여 저장할 수 있도록 컬럼의 데이터타입을 변경하는 것에 대해 검토합니다. LOB 등의 데이터타입으로 수정합니다.
SET SERVEROUTPUT ON
DECLARE
V VARCHAR2 (10000);
BEGIN
BEGIN
FOR I IN 1 .. 4000
LOOP
V := V || 0;
END LOOP;
INSERT INTO TB_V4000 (D, V) VALUES (SYSDATE, V);
DBMS_OUTPUT.PUT_LINE ('Insert Complete! length : ' || LENGTH (V) || 'byte');
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE ('exception occurs! length : ' || LENGTH (V) || 'byte , ERR : ' || SQLERRM);
END;
V := NULL;
BEGIN
FOR I IN 1 .. 4001
LOOP
V := V || 0;
END LOOP;
INSERT INTO TB_V4000 (D, V) VALUES (SYSDATE, V);
DBMS_OUTPUT.PUT_LINE ('Insert Complete! length : ' || LENGTH (V) || 'byte');
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE ('exception occurs! length : ' || LENGTH (V) || 'byte , ERR : ' || SQLERRM);
END;
ROLLBACK;
END;
/