2026년 07월 30일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01754 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01754 a table may contain only one column of type LONG 는?
ORA-01754 에러는 하나의 테이블에 LONG 타입의 컬럼을 두 개 이상 정의하려 할 때 발생하는 Oracle 데이터베이스 오류입니다. Oracle은 설계 제약상 테이블 당 LONG 또는 LONG RAW 타입 컬럼을 단 하나만 허용하며, 이 규칙을 위반하면 즉시 에러가 발생합니다. 주로 테이블 생성(CREATE TABLE) 또는 컬럼 추가(ALTER TABLE ADD) 시에 나타나며, 레거시 시스템 마이그레이션이나 기존 테이블 구조 변경 작업 중에 자주 마주치게 됩니다.
주요 발생 원인
- CREATE TABLE 시 LONG 타입 컬럼을 두 개 이상 정의한 경우
가장 흔한 발생 원인으로, 테이블 설계 단계에서 대용량 텍스트 컬럼이 여러 개 필요하다고 판단하여 LONG 타입을 복수로 선언하는 경우입니다. Oracle은 내부 스토리지 구조상 하나의 테이블 세그먼트에 LONG 타입 컬럼을 하나만 관리할 수 있도록 설계되어 있기 때문에, 두 번째 LONG 컬럼을 정의하는 순간 바로 ORA-01754가 발생합니다. 신규 개발자나 타 DBMS에서 Oracle로 넘어온 개발자에게서 특히 자주 발생합니다.
- 기존 LONG 컬럼이 있는 테이블에 ALTER TABLE로 LONG 컬럼을 추가하는 경우
이미 LONG 타입 컬럼이 존재하는 테이블에 운영 중 요구사항 변경으로 인해 또 다른 LONG 컬럼을 추가하려 할 때 발생합니다. 테이블의 현재 구조를 충분히 파악하지 못한 상태에서 ALTER TABLE ADD 구문을 실행하면 이 에러가 발생하며, 특히 오래된 레거시 테이블을 유지보수하는 상황에서 자주 발생합니다. 사전에 ALL_TAB_COLUMNS 또는 USER_TAB_COLUMNS 딕셔너리 뷰를 통해 기존 컬럼 타입을 반드시 확인해야 합니다.
- 타 DBMS에서 Oracle로 스키마를 마이그레이션하는 과정에서 자동 변환 오류
MySQL의 TEXT, MEDIUMTEXT, LONGTEXT나 SQL Server의 TEXT, NTEXT 등의 타입을 Oracle로 마이그레이션할 때 변환 스크립트가 이를 모두 LONG 타입으로 매핑하여 복수의 LONG 컬럼이 생성되는 경우입니다. 자동화된 마이그레이션 툴이 Oracle의 CLOB/BLOB를 권장 타입으로 사용하지 않고 구식 LONG 타입으로 변환하는 경우에도 동일한 문제가 발생합니다. 마이그레이션 전 반드시 타입 매핑 규칙을 검토하고 CLOB/BLOB를 우선 사용하도록 설정해야 합니다.
해결 방법
원인 1 해결: CREATE TABLE에서 LONG 대신 CLOB 사용
LONG 타입 대신 Oracle이 공식적으로 권장하는 CLOB(Character Large Object) 또는 BLOB(Binary Large Object)를 사용합니다. CLOB는 최대 4GB까지 저장 가능하며, LONG의 기능을 완전히 대체하고 더 많은 기능을 제공합니다.
-- 잘못된 예시 (ORA-01754 발생)
CREATE TABLE legacy_doc (
doc_id NUMBER PRIMARY KEY,
doc_content LONG, -- 첫 번째 LONG 컬럼
doc_memo LONG -- 두 번째 LONG 컬럼 → ORA-01754 발생!
);
-- 올바른 예시 (CLOB 사용 권장)
CREATE TABLE modern_doc (
doc_id NUMBER PRIMARY KEY,
doc_content CLOB, -- CLOB으로 대체
doc_memo CLOB -- 복수의 CLOB 컬럼 허용
);
원인 2 해결: ALTER TABLE 전 기존 컬럼 타입 확인 후 CLOB으로 추가
테이블 변경 전에 반드시 현재 컬럼 구조를 확인하고, 추가 컬럼은 CLOB 타입으로 정의합니다.
-- 1단계: 현재 테이블의 LONG 타입 컬럼 존재 여부 확인
SELECT column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name = 'YOUR_TABLE_NAME'
AND data_type IN ('LONG', 'LONG RAW');
-- 2단계: 기존 LONG 컬럼이 있는 경우 신규 컬럼은 반드시 CLOB으로 추가
-- 잘못된 방법 (ORA-01754 발생)
ALTER TABLE existing_table ADD new_memo LONG; -- 에러 발생!
-- 올바른 방법
ALTER TABLE existing_table ADD new_memo CLOB; -- CLOB으로 정상 추가
원인 3 해결: 마이그레이션 스크립트에서 타입 변환 규칙 수정 및 기존 LONG을 CLOB으로 전환
이미 LONG 컬럼이 있는 테이블의 경우, LONG을 CLOB으로 마이그레이션하는 절차가 필요합니다. Oracle은 직접 LONG → CLOB 타입 변경(ALTER TABLE MODIFY)을 지원하지 않으므로 아래와 같이 우회 방법을 사용합니다.
-- LONG → CLOB 마이그레이션 절차 예시
-- 기존 테이블: old_table (id NUMBER, long_col LONG)
-- 1단계: 임시 CLOB 컬럼 추가
ALTER TABLE old_table ADD long_col_clob CLOB;
-- 2단계: LONG 컬럼 데이터를 CLOB 컬럼으로 복사
-- (TO_LOB 함수 사용 - LONG을 LOB으로 변환하는 유일한 방법)
UPDATE old_table
SET long_col_clob = TO_LOB(long_col);
COMMIT;
-- 3단계: 원본 LONG 컬럼 삭제
ALTER TABLE old_table DROP COLUMN long_col;
-- 4단계: CLOB 컬럼 이름 변경
ALTER TABLE old_table RENAME COLUMN long_col_clob TO long_col;
-- 5단계: 마이그레이션 결과 검증
SELECT column_name, data_type
FROM user_tab_columns
WHERE table_name = 'OLD_TABLE';
두 번째 LONG 컬럼이 필요한 경우의 완전한 재설계 예시
-- 완전한 테이블 재설계 예시 (LONG을 모두 CLOB으로 전환)
CREATE TABLE document_v2 (
doc_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
doc_title VARCHAR2(500) NOT NULL,
doc_body CLOB, -- 본문 (구 LONG 대체)
doc_footnote CLOB, -- 각주 (구 LONG 대체)
doc_rawdata BLOB, -- 바이너리 데이터 (구 LONG RAW 대체)
created_dt DATE DEFAULT SYSDATE,
CONSTRAINT chk_doc_title CHECK (LENGTH(doc_title) > 0)
);
-- CLOB 데이터 INSERT 예시
INSERT INTO document_v2 (doc_title, doc_body, doc_footnote)
VALUES (
'테스트 문서',
TO_CLOB('이것은 본문 내용입니다. 매우 긴 텍스트도 저장 가능합니다.'),
TO_CLOB('이것은 각주 내용입니다.')
);
COMMIT;
-- CLOB 데이터 조회 예시
SELECT doc_id,
doc_title,
DBMS_LOB.SUBSTR(doc_body, 100, 1) AS body_preview,
DBMS_LOB.GETLENGTH(doc_body) AS body_length
FROM document_v2;
예방 방법
- 신규 개발 시 LONG/LONG RAW 타입 사용 완전 금지 정책 수립
Oracle 8i 이후부터 Oracle은 공식적으로 LONG 타입 대신 CLOB/BLOB 사용을 권장하고 있습니다. 개발 팀 내부에서 코딩 컨벤션 또는 DDL 검토 프로세스에 “LONG 타입 사용 금지” 규칙을 명시적으로 포함시키고, 코드 리뷰 단계에서 LONG 타입이 발견되면 반드시 CLOB/BLOB으로 교체하도록 합니다. CI/CD 파이프라인에 DDL 정적 분석 도구를 도입하여 LONG 타입이 포함된 DDL 스크립트가 운영 환경에 배포되지 않도록 자동화된 게이트를 설정하는 것이 이상적입니다.
- 테이블 변경 작업 전 표준 사전 점검 스크립트 실행 의무화
모든 DDL 작업(CREATE TABLE, ALTER TABLE ADD) 전에 아래와 같은 사전 점검 쿼리를 실행하여 기존 LONG 타입 컬럼 현황을 파악하는 것을 표준 절차로 정착시킵니다. 특히 오래된 레거시 시스템이나 타 팀이 관리하던 테이블을 다룰 때는 이 점검 절차가 더욱 중요합니다.
-- 스키마 전체에서 LONG 타입 컬럼 현황 파악 (사전 점검 스크립트)
SELECT t.owner,
t.table_name,
t.column_name,
t.data_type,
COUNT(*) OVER (PARTITION BY t.owner, t.table_name) AS long_col_count
FROM all_tab_columns t
WHERE t.owner = 'YOUR_SCHEMA_NAME' -- 본인 스키마로 변경
AND t.data_type IN ('LONG', 'LONG RAW')
ORDER BY t.table_name, t.column_name;
관련 에러
- ORA-00910: 지정한 길이가 해당 데이터 타입에 너무 긴 경우 발생하며, LONG 대신 CLOB을 사용해야 하는 상황에서 함께 나타날 수 있습니다.
- ORA-00997: LONG 타입을 DISTINCT나 GROUP BY 등 허용되지 않는 연산에 사용할 때 발생하는 에러로, LONG 타입의 기능적 제약을 보여줍니다.
- ORA-01465: LONG RAW 타입과 관련된 변환 오류로, 바이너리 대용량 데이터는 BLOB으로 전환할 것을 권장합니다.
- ORA-22998: CLOB/NCLOB 타입을 지원하지 않는 문자셋 변환 시 발생하며, LONG에서 CLOB으로 마이그레이션 중 문자셋 관련 문제 발생 시 함께 확인해야 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.