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

ORA-14019
2026년 09월 19일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-14019 partition bound element must be a string, datetime, number, or MAXVALUE 는?

ORA-14019 에러는 Oracle 파티션 테이블을 생성하거나 파티션을 추가할 때, 파티션 경계값(Partition Bound)으로 허용되지 않는 데이터 타입이나 표현식을 사용했을 때 발생합니다. Oracle은 파티션 경계값으로 문자열(String), 날짜/시간(Datetime), 숫자(Number), 또는 MAXVALUE만 허용하며, 이 외의 값(예: 함수 호출, 바인드 변수, NULL 외의 특수 표현식 등)을 사용하면 이 에러가 발생합니다. 주로 RANGE 파티션이나 LIST 파티션을 정의하는 DDL 구문에서 자주 발생하며, 파티션 경계 조건을 잘못 작성한 경우에 나타납니다.


주요 발생 원인

1. 파티션 경계값에 함수나 표현식 사용

Oracle 파티션 경계값에는 직접적인 리터럴 값(숫자, 문자열, 날짜 리터럴)만 허용됩니다. SYSDATE, TO_DATE(), TRUNC() 같은 함수 호출이나 CURRENT_DATE 같은 표현식을 파티션 경계값으로 사용하려 하면 ORA-14019 에러가 발생합니다. 예를 들어 RANGE 파티션에서 LESS THAN (SYSDATE) 와 같이 작성하면 즉시 이 에러를 만나게 됩니다.

2. 잘못된 날짜 리터럴 형식 사용

날짜 타입 컬럼으로 파티션을 나눌 때, 단순 문자열('2024-01-01')이 아닌 올바른 날짜 리터럴 형식을 사용해야 합니다. DATE 리터럴은 반드시 DATE 'YYYY-MM-DD' 또는 TO_DATE('...', '...') 형식을 써야 하는데, 일부 개발자들이 숫자나 일반 문자열을 그대로 날짜 컬럼의 경계값으로 입력하여 에러가 발생하기도 합니다. 특히 Interval 파티션이나 복합 파티션에서 날짜 형식을 잘못 지정하면 이 에러가 자주 발생합니다.

3. NULL 또는 허용되지 않는 특수 키워드 사용

파티션 경계값에 NULL, 바인드 변수(:variable), 또는 PL/SQL 변수를 직접 사용하려 하면 ORA-14019 에러가 발생합니다. Oracle 파티션 DDL은 런타임에 동적으로 값을 바인딩하는 것을 지원하지 않으며, 오직 컴파일 시점에 확정되는 리터럴 값만 허용합니다. 이 경우 동적 SQL(EXECUTE IMMEDIATE)을 활용하여 파티션 경계값을 문자열로 조합한 후 실행하는 방식으로 우회해야 합니다.


해결 방법

원인 1 해결: 함수/표현식 제거 후 리터럴 값으로 대체

잘못된 예시 (에러 발생):

-- ORA-14019 발생: SYSDATE는 파티션 경계값으로 사용 불가
CREATE TABLE sales_data (
    sale_id   NUMBER,
    sale_date DATE,
    amount    NUMBER
)
PARTITION BY RANGE (sale_date) (
    PARTITION p_past   VALUES LESS THAN (SYSDATE),
    PARTITION p_future VALUES LESS THAN (MAXVALUE)
);

올바른 예시 (수정 후):

-- DATE 리터럴을 사용하여 정확한 경계값 지정
CREATE TABLE sales_data (
    sale_id   NUMBER,
    sale_date DATE,
    amount    NUMBER
)
PARTITION BY RANGE (sale_date) (
    PARTITION p_2023 VALUES LESS THAN (DATE '2024-01-01'),
    PARTITION p_2024 VALUES LESS THAN (DATE '2025-01-01'),
    PARTITION p_max  VALUES LESS THAN (MAXVALUE)
);

동적으로 현재 날짜 기준 파티션을 생성해야 한다면, PL/SQL에서 EXECUTE IMMEDIATE를 활용하세요:

DECLARE
    v_partition_date VARCHAR2(20);
    v_sql            VARCHAR2(4000);
BEGIN
    -- 현재 연도를 기준으로 다음 해 1월 1일을 경계값으로 동적 생성
    v_partition_date := TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12), 'YYYY-MM-DD');
    
    v_sql := 'ALTER TABLE sales_data ADD PARTITION p_new '
          || 'VALUES LESS THAN (DATE ''' || v_partition_date || ''')';
    
    EXECUTE IMMEDIATE v_sql;
    COMMIT;
    
    DBMS_OUTPUT.PUT_LINE('파티션 추가 완료: ' || v_partition_date);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('에러 발생: ' || SQLERRM);
END;
/

원인 2 해결: 올바른 날짜 리터럴 형식 사용

잘못된 예시 (에러 발생):

-- ORA-14019 발생: 단순 문자열이나 숫자로 DATE 컬럼 경계값 지정 불가
CREATE TABLE orders (
    order_id   NUMBER,
    order_date DATE
)
PARTITION BY RANGE (order_date) (
    PARTITION p_q1 VALUES LESS THAN ('2024-04-01'),   -- 잘못된 형식
    PARTITION p_q2 VALUES LESS THAN ('2024-07-01'),   -- 잘못된 형식
    PARTITION p_max VALUES LESS THAN (MAXVALUE)
);

올바른 예시 (수정 후):

-- DATE 키워드와 ISO 형식을 사용하는 올바른 방법
CREATE TABLE orders (
    order_id   NUMBER,
    order_date DATE
)
PARTITION BY RANGE (order_date) (
    PARTITION p_q1  VALUES LESS THAN (DATE '2024-04-01'),
    PARTITION p_q2  VALUES LESS THAN (DATE '2024-07-01'),
    PARTITION p_q3  VALUES LESS THAN (DATE '2024-10-01'),
    PARTITION p_q4  VALUES LESS THAN (DATE '2025-01-01'),
    PARTITION p_max VALUES LESS THAN (MAXVALUE)
);

TIMESTAMP 컬럼의 경우 TIMESTAMP 리터럴을 사용해야 합니다:

-- TIMESTAMP 컬럼 파티션의 올바른 경계값 지정
CREATE TABLE event_log (
    event_id   NUMBER,
    event_time TIMESTAMP
)
PARTITION BY RANGE (event_time) (
    PARTITION p_2024_h1 VALUES LESS THAN (TIMESTAMP '2024-07-01 00:00:00'),
    PARTITION p_2024_h2 VALUES LESS THAN (TIMESTAMP '2025-01-01 00:00:00'),
    PARTITION p_max     VALUES LESS THAN (MAXVALUE)
);

원인 3 해결: 바인드 변수/NULL 제거 후 동적 SQL 활용

잘못된 예시 (에러 발생):

-- ORA-14019 발생: 바인드 변수는 파티션 경계값으로 사용 불가
DECLARE
    v_date DATE := DATE '2025-01-01';
BEGIN
    -- 아래 구문은 컴파일 단계에서 에러 발생
    EXECUTE IMMEDIATE
        'ALTER TABLE sales_data ADD PARTITION p_2025 VALUES LESS THAN (:1)'
    USING v_date;
END;
/

올바른 예시 (수정 후):

-- 동적 SQL에서 리터럴 값을 문자열 연결로 구성
DECLARE
    v_part_name VARCHAR2(30)  := 'P_2025_Q1';
    v_less_than VARCHAR2(20)  := '2025-04-01';
    v_sql       VARCHAR2(1000);
BEGIN
    v_sql := 'ALTER TABLE sales_data ADD PARTITION ' || v_part_name
          || ' VALUES LESS THAN (DATE ''' || v_less_than || ''')';
    
    DBMS_OUTPUT.PUT_LINE('실행 SQL: ' || v_sql);
    EXECUTE IMMEDIATE v_sql;
    
    DBMS_OUTPUT.PUT_LINE('파티션 ' || v_part_name || ' 추가 완료');
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE('파티션 추가 실패: ' || SQLERRM);
        RAISE;
END;
/

LIST 파티션에서의 올바른 사용 예:

-- LIST 파티션에서 올바른 경계값 지정
CREATE TABLE customer_info (
    cust_id     NUMBER,
    region_code VARCHAR2(10),
    cust_name   VARCHAR2(100)
)
PARTITION BY LIST (region_code) (
    PARTITION p_seoul   VALUES ('SEOUL', 'SE'),
    PARTITION p_busan   VALUES ('BUSAN', 'BS'),
    PARTITION p_incheon VALUES ('INCHEON', 'IC'),
    PARTITION p_other   VALUES (DEFAULT)   -- MAXVALUE 대신 DEFAULT 사용
);

예방 방법

1. 파티션 DDL 작성 전 공식 문서 기반 체크리스트 활용

파티션 테이블 생성 스크립트를 작성하기 전에, Oracle 공식 문서의 파티션 경계값 규칙을 반드시 확인하는 습관을 가져야 합니다. 특히 팀 내에서 표준 파티션 템플릿 스크립트를 만들어 공유하고, 신규 파티션 추가 시에는 항상 리터럴 값만 사용하도록 코드 리뷰 체크리스트에 항목을 추가하세요. CI/CD 파이프라인에서 DDL 배포 전에 테스트 환경에서 먼저 실행하여 검증하는 프로세스를 구축하는 것도 효과적입니다.

-- 파티션 현황 확인 쿼리 (주기적으로 모니터링)
SELECT table_name,
       partition_name,
       high_value,
       num_rows,
       last_analyzed
FROM   user_tab_partitions
WHERE  table_name = 'SALES_DATA'
ORDER  BY partition_position;

2. 자동 파티션 관리 기능(Interval Partitioning) 활용

수동으로 파티션을 추가하는 작업 자체를 줄이기 위해, Oracle 11g 이상에서 제공하는 Interval Partitioning을 적극 활용하세요. Interval Partitioning은 데이터가 삽입될 때 자동으로 파티션을 생성하므로, 개발자가 직접 파티션 경계값을 지정하는 DDL을 반복적으로 작성할 필요가 없어 ORA-14019 에러 발생 가능성 자체를 줄일 수 있습니다.

-- Interval Partitioning 활용 예시 (월 단위 자동 파티션)
CREATE TABLE sales_auto (
    sale_id   NUMBER,
    sale_date DATE,
    amount    NUMBER
)
PARTITION BY RANGE (sale_date)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))   -- 1개월 단위 자동 파티션
(
    -- 시작 파티션은 반드시 수동으로 지정
    PARTITION p_init VALUES LESS THAN (DATE '2024-01-01')
);

관련 에러

  • ORA-14020: 파티션 경계값이 올바르지 않은 경우 (this physical attribute may not be specified for a table partition) – 파티션 속성 지정 오류와 함께 발생할 수 있습니다.
  • ORA-14021: MAXVALUE는 LIST 파티션에서 사용 불가 (MAXVALUE may not be specified for this type of partition)로, RANGE 파티션과 LIST 파티션의 특수값 혼용 시 발생합니다.
  • ORA-14036: 파티션 경계값이 컬럼 데이터 타입과 맞지 않을 때 (partition bound value too large for column) 발생하며, ORA-14019와 함께 데이터 타입 관련 파티션 에러로 분류됩니다.
  • ORA-00922: missing or invalid option 에러로, 파티션 DDL 문법 자체가 잘못되었을 때 ORA-14019와 유사한 상황에서 발생할 수 있습니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기