Oracle ORA-01462 오류 원인과 해결 방법 완벽 가이드

ORA-01462
2026년 07월 17일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-01462 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-01462 insertions of LONG values requires a single-row insert statement 는?

ORA-01462 에러는 Oracle 데이터베이스에서 LONG 또는 LONG RAW 데이터 타입을 가진 컬럼에 데이터를 삽입할 때, 단일 행(single-row) 이 아닌 다중 행(multi-row) INSERT 방식이나 서브쿼리를 이용한 INSERT 문을 사용할 경우 발생합니다. Oracle은 LONG 타입의 특성상 한 번에 하나의 행만 처리할 수 있도록 내부적으로 제한하고 있으며, 이 제약을 위반하면 해당 에러가 즉시 반환됩니다. 특히 레거시 시스템에서 데이터 마이그레이션이나 배치 처리 작업 중 자주 마주치게 되는 에러로, LONG 타입을 사용하는 오래된 테이블 구조를 그대로 유지하는 환경에서 빈번하게 나타납니다.


주요 발생 원인

1. INSERT INTO … SELECT 구문에서 LONG 컬럼 포함

가장 흔한 원인은 서브쿼리를 이용한 INSERT INTO ... SELECT 구문에서 LONG 타입 컬럼을 포함시키는 경우입니다. Oracle의 LONG 타입은 서브쿼리 결과를 일괄 삽입하는 방식을 지원하지 않으며, 반드시 리터럴 값이나 바인드 변수를 통해 단건씩 처리해야 합니다. 데이터 이관이나 테이블 복제 작업에서 이 패턴을 무심코 사용하다 에러가 발생하는 경우가 매우 많습니다.

2. 다중 행 VALUES 절을 사용한 INSERT

일부 개발자들이 성능 향상을 위해 하나의 INSERT 문에 여러 VALUES 절을 연결하는 방식을 시도할 때 이 에러가 발생합니다. LONG 타입 컬럼이 포함된 테이블에는 INSERT ALL 구문이나 복수 VALUES 방식을 사용할 수 없으며, 반드시 행 하나당 독립적인 INSERT 문을 실행해야 합니다. 배치 작업을 효율화하려다 오히려 에러를 유발하는 대표적인 실수입니다.

3. LONG 타입 컬럼이 포함된 뷰(View) 를 통한 INSERT

LONG 타입 컬럼을 포함하는 뷰를 통해 데이터를 삽입하려 할 때도 동일한 에러가 발생할 수 있습니다. 뷰 내부적으로 서브쿼리나 조인이 포함되어 있을 경우, Oracle 옵티마이저가 이를 단일 행 INSERT로 처리하지 못하고 에러를 반환합니다. 뷰를 통한 DML 작업은 INSTEAD OF 트리거를 활용하거나, 직접 기반 테이블에 INSERT하는 방식으로 우회해야 합니다.


해결 방법

해결책 1: INSERT INTO … SELECT를 PL/SQL 커서 루프로 대체

서브쿼리 방식 대신 PL/SQL에서 커서를 이용해 한 행씩 처리하는 방법이 가장 안전하고 확실한 해결책입니다.

-- 잘못된 방법 (ORA-01462 발생)
INSERT INTO target_table (id, long_col, description)
SELECT id, long_col, description
FROM source_table
WHERE dept_id = 10;

-- 올바른 방법: PL/SQL 커서 루프 사용
DECLARE
    CURSOR c_source IS
        SELECT id, long_col, description
        FROM source_table
        WHERE dept_id = 10;
BEGIN
    FOR rec IN c_source LOOP
        INSERT INTO target_table (id, long_col, description)
        VALUES (rec.id, rec.long_col, rec.description);
    END LOOP;
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/

해결책 2: LONG 타입을 CLOB/BLOB으로 마이그레이션

근본적인 해결책은 LONG 타입 컬럼을 현대적인 LOB 타입으로 변환하는 것입니다. CLOB은 INSERT INTO ... SELECT 구문을 지원하므로 이러한 에러가 원천 차단됩니다.

-- 1단계: 새 테이블 생성 (CLOB으로 변경)
CREATE TABLE target_table_new (
    id          NUMBER PRIMARY KEY,
    clob_col    CLOB,          -- LONG 대신 CLOB 사용
    description VARCHAR2(500)
);

-- 2단계: TO_LOB 함수를 이용한 데이터 이관
INSERT INTO target_table_new (id, clob_col, description)
SELECT id, TO_LOB(long_col), description
FROM source_table;

COMMIT;

-- 3단계: 기존 테이블 교체
-- ALTER TABLE source_table RENAME TO source_table_old;
-- ALTER TABLE target_table_new RENAME TO source_table;

해결책 3: INSERT ALL 대신 개별 INSERT 문 사용

-- 잘못된 방법 (ORA-01462 발생)
INSERT ALL
    INTO long_test_table VALUES (1, '첫번째 데이터')
    INTO long_test_table VALUES (2, '두번째 데이터')
SELECT * FROM DUAL;

-- 올바른 방법: 개별 INSERT 문 사용
INSERT INTO long_test_table VALUES (1, '첫번째 데이터');
INSERT INTO long_test_table VALUES (2, '두번째 데이터');
COMMIT;

해결책 4: 뷰를 통한 INSERT 우회 (INSTEAD OF 트리거)

-- INSTEAD OF 트리거 생성으로 뷰 INSERT 지원
CREATE OR REPLACE TRIGGER trg_instead_of_insert
INSTEAD OF INSERT ON long_data_view
FOR EACH ROW
BEGIN
    INSERT INTO base_long_table (
        id,
        long_col,
        created_date
    ) VALUES (
        :NEW.id,
        :NEW.long_col,
        SYSDATE
    );
END;
/

-- 이제 뷰를 통한 INSERT 가능
INSERT INTO long_data_view (id, long_col)
VALUES (100, '뷰를 통한 데이터 삽입 테스트');
COMMIT;

예방 방법

1. 신규 개발 시 LONG 타입 사용 금지 정책 수립

Oracle은 공식 문서에서 LONG 타입을 deprecated로 분류하고 있으며, 신규 테이블 설계 시 CLOB(문자 데이터), BLOB(이진 데이터), NCLOB(유니코드 문자 데이터)을 사용할 것을 강력히 권고합니다. 프로젝트 초기 단계에서 코드 리뷰 기준이나 DDL 생성 가이드라인에 LONG 타입 사용 금지 규칙을 명시적으로 포함시켜, 레거시 문제가 신규 시스템으로 전파되지 않도록 예방해야 합니다.

-- 기존 LONG 컬럼 존재 여부 확인 쿼리 (정기 점검용)
SELECT owner, table_name, column_name, data_type
FROM dba_tab_columns
WHERE data_type IN ('LONG', 'LONG RAW')
  AND owner NOT IN ('SYS', 'SYSTEM', 'SYSMAN')
ORDER BY owner, table_name;

2. 데이터 이관 및 배치 작업 시 사전 타입 검증 로직 포함

ETL 스크립트나 데이터 마이그레이션 절차를 작성할 때, 대상 테이블에 LONG 타입 컬럼이 존재하는지 사전에 확인하는 검증 단계를 반드시 포함시켜야 합니다. 검증 결과에 따라 자동으로 단건 처리 방식으로 전환되도록 동적 PL/SQL 로직을 구성하면, 에러 발생 가능성을 원천적으로 줄일 수 있습니다.


관련 에러

  • ORA-00997: LONG 데이터 타입의 잘못된 사용. LONG 컬럼을 WHERE 절 조건이나 GROUP BY, ORDER BY 등에 사용할 때 발생합니다.
  • ORA-01461: LONG 값이 바인드 변수로 바인딩될 때 대상 컬럼이 LONG 타입이 아닌 경우 발생하는 에러로, ORA-01462와 함께 LONG 관련 에러 쌍으로 자주 언급됩니다.
  • ORA-22275: LOB 타입 관련 잘못된 LOB 로케이터 에러로, LONG에서 LOB으로 전환하는 과정에서 간혹 마주치게 됩니다.
  • ORA-01424: LONG 타입 컬럼에 대해 지원하지 않는 함수나 연산자를 적용할 때 발생하며, LONG 타입의 전반적인 제약 사항과 관련이 있습니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기