2026년 06월 15일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00906 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00906 missing left parenthesis 는?
ORA-00906 에러는 SQL 문장에서 왼쪽 괄호 (가 있어야 할 위치에 누락되었을 때 발생하는 문법 오류입니다. Oracle 파서가 SQL을 분석하는 과정에서 특정 구문 규칙상 반드시 왼쪽 괄호가 등장해야 하는 지점에 다른 토큰이 오거나, 괄호 자체가 빠져 있을 때 이 에러가 트리거됩니다. CREATE TABLE, INSERT, 함수 호출, 서브쿼리 등 다양한 SQL 컨텍스트에서 발생할 수 있으며, 처음 Oracle을 접하는 개발자부터 숙련된 DBA까지 빈번하게 마주치는 에러 중 하나입니다.
주요 발생 원인
1. CREATE TABLE 또는 CREATE INDEX 문에서 컬럼 정의 괄호 누락
CREATE TABLE 문을 작성할 때 테이블명 뒤에 반드시 ( 를 붙여 컬럼 목록을 시작해야 합니다. 괄호 없이 바로 컬럼명을 나열하거나, 오타로 인해 괄호가 빠진 경우 ORA-00906이 즉시 발생합니다. 이 케이스는 실무에서 가장 흔하게 발생하는 원인으로, 특히 다른 DBMS(MySQL, SQL Server 등)에서 Oracle로 마이그레이션하는 과정에서 DDL 스크립트를 변환할 때 자주 나타납니다.
2. 함수 호출 또는 IN 절에서 괄호 누락
Oracle 내장 함수(NVL, TO_DATE, SUBSTR 등)나 사용자 정의 함수를 호출할 때 함수명 바로 뒤에 (가 없으면 에러가 발생합니다. 마찬가지로 WHERE column IN 뒤에 괄호로 감싼 값 목록이나 서브쿼리가 와야 하는데, 괄호를 생략하면 동일한 에러가 발생합니다. 이 경우 에러 위치 메시지를 잘 확인하면 어떤 함수 또는 IN 절에서 문제가 생겼는지 비교적 쉽게 찾을 수 있습니다.
3. 서브쿼리(Subquery) 또는 CAST 구문에서 괄호 미사용
인라인 뷰나 서브쿼리를 사용할 때 서브쿼리 전체를 ()로 감싸지 않으면 Oracle 파서는 ORA-00906을 반환합니다. CAST 함수 역시 CAST(expression AS datatype) 형태로 반드시 괄호를 사용해야 하며, 이를 빠뜨리면 동일한 에러가 발생합니다. 복잡한 쿼리일수록 중첩된 서브쿼리가 많아져 괄호를 누락하기 쉬우므로 특히 주의가 필요합니다.
해결 방법
원인 1: CREATE TABLE / CREATE INDEX에서 괄호 누락 해결
잘못된 예시:
-- 잘못된 문법: 컬럼 정의 괄호 누락
CREATE TABLE employees
emp_id NUMBER(10),
emp_name VARCHAR2(100),
hire_date DATE
;
올바른 예시:
-- 올바른 문법: 테이블명 뒤에 괄호 추가
CREATE TABLE employees
(
emp_id NUMBER(10) NOT NULL,
emp_name VARCHAR2(100) NOT NULL,
hire_date DATE,
CONSTRAINT pk_employees PRIMARY KEY (emp_id)
);
CREATE INDEX에서도 동일한 규칙이 적용됩니다:
-- 잘못된 문법
CREATE INDEX idx_emp_name ON employees emp_name;
-- 올바른 문법
CREATE INDEX idx_emp_name ON employees (emp_name);
원인 2: 함수 호출 / IN 절에서 괄호 누락 해결
-- 잘못된 문법: NVL 함수 괄호 누락
SELECT NVL emp_name, 'N/A' FROM employees;
-- 올바른 문법: 함수명 뒤 괄호 추가
SELECT NVL(emp_name, 'N/A') AS emp_name
FROM employees;
-- 잘못된 문법: IN 절 괄호 누락
SELECT *
FROM employees
WHERE dept_id IN 10, 20, 30;
-- 올바른 문법: IN 절 괄호 추가
SELECT *
FROM employees
WHERE dept_id IN (10, 20, 30);
-- 잘못된 문법: IN + 서브쿼리 괄호 누락
SELECT *
FROM employees
WHERE dept_id IN SELECT dept_id FROM departments WHERE location_id = 1700;
-- 올바른 문법: 서브쿼리 괄호 추가
SELECT *
FROM employees
WHERE dept_id IN (
SELECT dept_id
FROM departments
WHERE location_id = 1700
);
원인 3: 서브쿼리 / CAST 구문 괄호 누락 해결
-- 잘못된 문법: 인라인 뷰 괄호 누락
SELECT a.emp_id, a.avg_sal
FROM SELECT emp_id, AVG(salary) AS avg_sal
FROM employees GROUP BY emp_id a;
-- 올바른 문법: 인라인 뷰 전체를 괄호로 감쌈
SELECT a.emp_id, a.avg_sal
FROM (
SELECT emp_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY emp_id
) a;
-- 잘못된 문법: CAST 괄호 누락
SELECT CAST emp_name AS VARCHAR2(50) FROM employees;
-- 올바른 문법: CAST 괄호 추가
SELECT CAST(emp_name AS VARCHAR2(50)) AS emp_name
FROM employees;
-- 잘못된 문법: WITH절(CTE)에서 괄호 누락
WITH dept_summary AS
SELECT dept_id, COUNT(*) AS cnt
FROM employees
GROUP BY dept_id
SELECT * FROM dept_summary;
-- 올바른 문법: WITH절 서브쿼리 괄호 추가
WITH dept_summary AS (
SELECT dept_id, COUNT(*) AS cnt
FROM employees
GROUP BY dept_id
)
SELECT * FROM dept_summary;
예방 방법
1. SQL 포맷터 및 린터 도구를 개발 워크플로우에 통합
SQL Developer, DBeaver, Toad 등의 IDE에는 SQL 문법을 실시간으로 검사하는 기능이 내장되어 있습니다. 이러한 도구들은 괄호 미스매치나 누락을 즉각적으로 하이라이팅해 주므로, 운영 DB에 배포하기 전 반드시 IDE에서 구문 검증을 수행하는 습관을 들이세요. CI/CD 파이프라인에 SQLFluff 같은 SQL 린터를 통합하면 팀 전체의 SQL 품질을 일관되게 관리할 수 있습니다.
2. DDL 스크립트 작성 시 일관된 코딩 컨벤션과 코드 리뷰 프로세스 적용
특히 타 DBMS에서 Oracle로 SQL을 마이그레이션할 때는 반드시 Oracle 전용 문법 체크리스트를 만들어 검토하세요. CREATE TABLE, CREATE INDEX, 함수 호출, IN 절, 서브쿼리 등 괄호가 필수인 구문 패턴을 목록화하고, 동료 DBA나 개발자의 코드 리뷰를 통해 이중으로 검증하는 프로세스를 수립하면 ORA-00906을 포함한 대부분의 문법 오류를 사전에 방지할 수 있습니다.
관련 에러
- ORA-00907: missing right parenthesis — ORA-00906의 반대 케이스로, 닫는 괄호
)가 누락되었을 때 발생합니다. 괄호 쌍이 맞지 않는 복잡한 쿼리에서 자주 함께 나타납니다. - ORA-00936: missing expression — SELECT 목록이나 WHERE 절에서 표현식이 완전하지 않을 때 발생하며, 괄호 누락으로 인해 파서가 표현식을 제대로 인식하지 못할 때 ORA-00906과 혼동될 수 있습니다.
- ORA-00917: missing comma — 컬럼 목록이나 값 목록에서 쉼표가 누락되었을 때 발생하며, 괄호 문제와 동시에 나타나는 경우가 있습니다.
- ORA-00904: invalid identifier — 컬럼명이나 객체명이 잘못되었을 때 발생하며, 괄호 위치 오류로 인해 Oracle이 의도치 않은 토큰을 식별자로 해석할 때 연쇄적으로 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.