2026년 06월 16일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00910 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00910 specified length too long for its datatype 는?
ORA-00910 에러는 Oracle 데이터베이스에서 컬럼이나 변수에 지정한 길이(length)가 해당 데이터 타입이 허용하는 최대 범위를 초과했을 때 발생합니다. 예를 들어 CHAR 또는 VARCHAR2 타입에 Oracle이 허용하는 최대 바이트/문자 수를 넘어서는 값을 선언하거나, NCHAR, NVARCHAR2 같은 유니코드 타입에서 바이트 단위로 환산했을 때 상한선을 초과하는 경우 이 에러가 발생합니다. DDL(CREATE TABLE, ALTER TABLE) 문 실행 시 가장 빈번하게 나타나며, PL/SQL 변수 선언부에서도 동일한 에러를 마주칠 수 있습니다.
주요 발생 원인
- VARCHAR2 / CHAR 최대 길이 초과
Oracle에서 VARCHAR2의 최대 길이는 테이블 컬럼 기준으로 4,000바이트(또는 MAX_STRING_SIZE=EXTENDED 설정 시 32,767바이트)이며, CHAR는 2,000바이트입니다. 이 한계를 넘어서는 길이를 선언하면 즉시 ORA-00910이 발생합니다. 특히 레거시 시스템 마이그레이션이나 타 DBMS(MySQL, SQL Server 등)의 스키마를 Oracle로 변환할 때, 상대 DBMS에서는 허용되던 길이가 Oracle에서는 초과로 판정되는 경우가 많습니다.
- NCHAR / NVARCHAR2 멀티바이트 문자셋 초과
NCHAR와 NVARCHAR2는 국가 문자셋(National Character Set)을 사용하며, 내부적으로 UTF-16 또는 UTF-8로 저장됩니다. NVARCHAR2의 최대 길이는 2,000자(문자 수 기준)이고, NCHAR는 1,000자입니다. 바이트가 아닌 문자(character) 단위로 제한이 걸려 있기 때문에, VARCHAR2(4000 CHAR)처럼 선언하다가 NVARCHAR2(4000)으로 잘못 마이그레이션하면 에러가 발생합니다.
- PL/SQL 변수 선언 또는 TYPE 정의 시 잘못된 길이 지정
PL/SQL 패키지나 프로시저 내부에서 변수를 선언할 때도 동일한 데이터 타입 규칙이 적용됩니다. VARCHAR2(32768)처럼 표준 설정에서는 허용되지 않는 길이를 하드코딩하거나, 동적 SQL을 생성하는 로직에서 길이 계산이 잘못되어 상한을 넘는 값이 생성될 경우 이 에러가 발생합니다. 특히 TYPE 정의나 SUBTYPE 선언 시 실수가 잦으므로 주의가 필요합니다.
해결 방법
원인 1 해결: VARCHAR2 / CHAR 길이 조정
허용 범위 안으로 길이를 줄이거나, 대용량 텍스트가 필요하다면 CLOB 타입을 사용하세요.
-- 잘못된 예 (ORA-00910 발생)
CREATE TABLE user_profile (
description VARCHAR2(5000) -- 표준 설정에서 4000 초과 → 에러
);
-- 해결책 1: 길이를 4000 이하로 축소
CREATE TABLE user_profile (
description VARCHAR2(4000)
);
-- 해결책 2: CLOB 타입으로 변경 (대용량 텍스트 필요 시)
CREATE TABLE user_profile (
description CLOB
);
-- 해결책 3: MAX_STRING_SIZE=EXTENDED 설정 후 VARCHAR2(32767) 사용
-- (12c 이상, DBA 권한 필요, 되돌리기 불가 주의)
ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED SCOPE=SPFILE;
-- 인스턴스 재시작 후 utl32k.sql 실행 필요
-- 설정 확인
SELECT name, value FROM v$parameter WHERE name = 'max_string_size';
원인 2 해결: NCHAR / NVARCHAR2 길이 조정
-- 잘못된 예 (ORA-00910 발생)
CREATE TABLE multilang_data (
content NVARCHAR2(4000) -- NVARCHAR2 최대는 2000자 → 에러
);
-- 해결책 1: 2000자 이하로 줄이기
CREATE TABLE multilang_data (
content NVARCHAR2(2000)
);
-- 해결책 2: 멀티바이트 텍스트 대용량 저장 시 NCLOB 사용
CREATE TABLE multilang_data (
content NCLOB
);
-- 현재 국가 문자셋 확인 (설계 전 반드시 확인)
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
원인 3 해결: PL/SQL 변수 선언 수정
-- 잘못된 예 (ORA-00910 발생)
DECLARE
v_text VARCHAR2(32768); -- 표준 설정에서 32767 초과 → 에러
BEGIN
NULL;
END;
/
-- 해결책 1: PL/SQL 내 VARCHAR2는 최대 32,767바이트까지 허용
-- (PL/SQL 변수는 테이블 컬럼보다 더 큰 상한값 적용)
DECLARE
v_text VARCHAR2(32767); -- PL/SQL 변수는 32767까지 OK
BEGIN
v_text := RPAD('A', 32767, 'A');
DBMS_OUTPUT.PUT_LINE(LENGTH(v_text));
END;
/
-- 해결책 2: 대용량 텍스트 처리 시 CLOB 변수 사용
DECLARE
v_large_text CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_large_text, TRUE);
DBMS_LOB.WRITEAPPEND(v_large_text, 5, 'Hello');
DBMS_OUTPUT.PUT_LINE(DBMS_LOB.GETLENGTH(v_large_text));
DBMS_LOB.FREETEMPORARY(v_large_text);
END;
/
-- 해결책 3: %TYPE 활용으로 컬럼 타입 자동 참조 (길이 불일치 방지)
DECLARE
v_desc user_profile.description%TYPE; -- 컬럼 타입/길이 자동 상속
BEGIN
NULL;
END;
/
기존 컬럼 변경 시
-- 이미 생성된 컬럼의 타입 변경
-- (데이터가 없거나, 기존 데이터가 새 타입에 호환될 때)
ALTER TABLE user_profile MODIFY (description CLOB);
-- 컬럼 길이 줄이기 전 현황 파악
SELECT column_name, data_type, data_length, char_length
FROM user_tab_columns
WHERE table_name = 'USER_PROFILE';
예방 방법
- 스키마 설계 단계에서 Oracle 데이터 타입 제한 기준 문서화
테이블 설계 시 각 컬럼에 사용할 데이터 타입과 최대 길이를 사전에 정의한 데이터 딕셔너리(Data Dictionary)를 유지하고, Oracle 공식 데이터 타입 제한표(VARCHAR2 4,000 / NVARCHAR2 2,000 / CHAR 2,000 / NCHAR 1,000)를 팀 전체가 공유하세요. 타 DBMS에서 마이그레이션할 경우 반드시 타입 매핑 검토 단계를 거쳐야 하며, AWS SCT(Schema Conversion Tool)나 Oracle SQL Developer의 Migration Workbench 같은 도구를 활용할 때도 자동 변환 결과를 수동으로 검증하는 프로세스를 반드시 포함시키세요.
- DDL 배포 전 자동화된 스크립트 검증 단계 추가
CI/CD 파이프라인이나 배포 스크립트에 DDL 사전 검증 단계를 추가하여, 실제 운영 DB에 적용하기 전에 테스트 환경에서 오류를 선별하는 체계를 구축하세요. 아래와 같이 ALL_TAB_COLUMNS 뷰를 활용하여 현재 스키마의 문제 컬럼을 주기적으로 점검하는 쿼리를 자동화하면, 잠재적 위험 요소를 사전에 탐지할 수 있습니다.
-- 잠재적으로 길이 초과 위험이 있는 컬럼 점검 쿼리
SELECT owner, table_name, column_name, data_type, data_length
FROM all_tab_columns
WHERE (data_type = 'VARCHAR2' AND data_length > 4000)
OR (data_type = 'NVARCHAR2' AND char_length > 2000)
OR (data_type = 'CHAR' AND data_length > 2000)
OR (data_type = 'NCHAR' AND char_length > 1000)
ORDER BY owner, table_name, column_name;
관련 에러
- ORA-00972:
identifier is too long— 객체 이름(테이블명, 컬럼명 등)이 Oracle 허용 길이(30자, 12.2 이후 128자)를 초과할 때 발생합니다. - ORA-01401:
inserted value too large for column— 실제 DML 실행 시 삽입하려는 데이터 값이 컬럼의 정의된 길이보다 클 때 발생하며, ORA-00910이 DDL 정의 단계의 에러라면 ORA-01401은 런타임 데이터 입력 단계의 에러입니다. - ORA-06502:
PL/SQL: numeric or value error: character string buffer too small— PL/SQL 실행 중 변수에 할당하려는 값이 선언된 변수 크기를 초과할 때 발생하며, ORA-00910과 함께 문자열 길이 관련 에러 트리오로 자주 언급됩니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.