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

ORA-01710
2026년 07월 26일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-01710 duplicate keyword 는?

ORA-01710 에러는 Oracle SQL 문장 내에서 동일한 키워드가 중복으로 사용되었을 때 발생하는 구문 오류(Syntax Error)입니다. 주로 CREATE TABLE, CREATE INDEX, GRANT, SELECT 등의 DDL/DML 문장에서 옵션이나 절(Clause)을 반복적으로 명시할 때 Oracle 파서(Parser)가 이를 감지하고 오류를 반환합니다. 예를 들어 STORAGE 절이나 PCTFREE 같은 물리적 속성 키워드, 또는 WITH GRANT OPTION과 같은 권한 관련 키워드를 동일 문장 내에서 두 번 이상 기술하는 경우에 자주 발생합니다.


주요 발생 원인

1. DDL 문장에서 동일한 물리적 속성 키워드 중복 사용

CREATE TABLE 또는 CREATE INDEX 문장 작성 시, PCTFREE, PCTUSED, INITRANS, MAXTRANS 등의 스토리지 파라미터를 한 문장 안에서 두 번 이상 기재하는 경우 이 에러가 발생합니다. 특히 긴 DDL 스크립트를 여러 명이 나눠서 작성하거나 다른 소스에서 복사·붙여넣기를 할 때 중복이 발생하기 쉽습니다. DBA가 스크립트를 검토하지 않고 그대로 실행하면 즉시 ORA-01710이 발생합니다.

2. GRANT 문장에서 WITH GRANT OPTION 또는 WITH ADMIN OPTION 중복 기재

GRANT 명령어 사용 시 WITH GRANT OPTION 또는 WITH ADMIN OPTION 키워드를 실수로 두 번 작성하는 경우에도 이 에러가 발생합니다. 권한 부여 스크립트를 자동으로 생성하는 도구나 스크립트에서 버그가 있을 경우, 또는 수동으로 편집하는 과정에서 복사·붙여넣기 오류로 발생할 수 있습니다. 이 경우 권한 자체는 부여되지 않으므로 보안 정책 적용에 지연이 생길 수 있습니다.

3. SELECT 문장의 힌트(Hint) 또는 절(Clause) 중복 작성

복잡한 쿼리를 작성하거나 여러 쿼리를 합치는 과정에서 ORDER BY, GROUP BY, HAVING 같은 절을 중복으로 기재하거나, 옵티마이저 힌트를 동일하게 두 번 이상 명시하는 경우에도 이 에러가 발생할 수 있습니다. 특히 애플리케이션 레이어에서 동적 SQL을 조합하는 방식으로 쿼리를 생성할 때, 조건 추가 로직의 버그로 인해 동일 키워드가 반복 삽입될 수 있습니다. 이런 경우 에러 재현이 어려워 디버깅 시간이 길어질 수 있습니다.


해결 방법

원인 1 해결: DDL에서 중복 키워드 제거

아래와 같이 PCTFREE가 두 번 사용된 잘못된 예시와 수정된 예시를 확인하세요.

-- ❌ 잘못된 예시: PCTFREE가 중복으로 사용됨
CREATE TABLE employees (
    emp_id   NUMBER(10),
    emp_name VARCHAR2(100)
)
PCTFREE 10
PCTUSED 40
PCTFREE 20   -- ← 중복! ORA-01710 발생
INITRANS 1;

-- ✅ 올바른 예시: 중복 키워드 제거
CREATE TABLE employees (
    emp_id   NUMBER(10),
    emp_name VARCHAR2(100)
)
PCTFREE 10
PCTUSED 40
INITRANS 1;
-- ❌ 잘못된 예시: STORAGE 절 내부에서도 중복 발생 가능
CREATE INDEX idx_emp_name ON employees(emp_name)
STORAGE (INITIAL 64K NEXT 64K INITIAL 128K);  -- INITIAL 중복 → ORA-01710

-- ✅ 올바른 예시
CREATE INDEX idx_emp_name ON employees(emp_name)
STORAGE (INITIAL 64K NEXT 64K MINEXTENTS 1);

원인 2 해결: GRANT 문장 중복 키워드 수정

-- ❌ 잘못된 예시: WITH GRANT OPTION 중복
GRANT SELECT ON hr.employees TO app_user
WITH GRANT OPTION
WITH GRANT OPTION;  -- ← 중복! ORA-01710 발생

-- ✅ 올바른 예시
GRANT SELECT ON hr.employees TO app_user
WITH GRANT OPTION;

-- ❌ 잘못된 예시: WITH ADMIN OPTION 중복 (시스템 권한 부여 시)
GRANT CREATE SESSION TO app_user
WITH ADMIN OPTION
WITH ADMIN OPTION;  -- ← 중복! ORA-01710 발생

-- ✅ 올바른 예시
GRANT CREATE SESSION TO app_user
WITH ADMIN OPTION;

원인 3 해결: SELECT 문장의 중복 절 수정

-- ❌ 잘못된 예시: ORDER BY 절 중복
SELECT emp_id, emp_name, salary
FROM employees
WHERE department_id = 10
ORDER BY salary DESC
ORDER BY emp_name ASC;  -- ← 중복! ORA-01710 발생

-- ✅ 올바른 예시: 정렬 기준을 한 곳에서 명시
SELECT emp_id, emp_name, salary
FROM employees
WHERE department_id = 10
ORDER BY salary DESC, emp_name ASC;

-- ❌ 잘못된 예시: GROUP BY 절 중복
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id
GROUP BY department_id;  -- ← 중복! ORA-01710 발생

-- ✅ 올바른 예시
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id;

에러 발생 구문 빠르게 점검하는 방법

-- SQL 문장 실행 전 EXPLAIN PLAN으로 구문 오류 미리 확인
EXPLAIN PLAN FOR
SELECT emp_id, emp_name
FROM employees
ORDER BY emp_id
ORDER BY emp_name;  -- 이 시점에서 ORA-01710 발생 여부 사전 확인 가능

-- 또는 SQL*Plus에서 SET ERRORLOGGING ON으로 오류 로깅 활성화
SET ERRORLOGGING ON TABLE sperrorlog;

예방 방법

1. DDL/DML 스크립트 리뷰 및 린팅(Linting) 도구 활용

긴 SQL 스크립트를 실행하기 전에 SQL Developer, Toad, or SQLcl 같은 도구의 구문 검사 기능을 적극 활용하세요. 특히 여러 명이 협업하여 작성한 스크립트나 다른 시스템에서 Export된 DDL 스크립트는 반드시 실행 전에 피어 리뷰(Peer Review) 또는 자동 린팅 도구를 통해 중복 키워드 여부를 검증하는 프로세스를 팀 내 표준으로 채택하세요.

2. 동적 SQL 생성 로직에 중복 키워드 방지 로직 추가

애플리케이션에서 동적으로 SQL을 조합할 경우, 동일한 절이나 키워드가 두 번 이상 추가되지 않도록 플래그(Flag) 변수 또는 집합(Set) 자료구조를 사용하여 방어 코딩을 적용하세요. 예를 들어 Python, Java 등 애플리케이션 레이어에서 SQL 빌더(Builder) 패턴을 활용하면 중복 절 추가를 원천적으로 차단할 수 있으며, 이는 ORA-01710뿐 아니라 다른 구문 오류도 함께 예방하는 효과가 있습니다.


관련 에러

  • ORA-00936: missing expression – 키워드 누락 시 발생하며, ORA-01710과 반대 상황(키워드 부족)에서 나타납니다.
  • ORA-00905: missing keyword – 필수 키워드가 빠졌을 때 발생하며, DDL 문장 오류 분석 시 ORA-01710과 함께 자주 다루어집니다.
  • ORA-00907: missing right parenthesis – 괄호 불일치로 인한 구문 오류로, 복잡한 DDL에서 ORA-01710과 함께 발생할 수 있습니다.
  • ORA-02000: missing ... keyword – 특정 필수 키워드가 누락되었을 때 Oracle이 반환하는 에러로, 구문 검증 실패 관련 에러군에 속합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기