본문 바로가기
IT

ORA-00907 : 오른쪽 괄호 누락, 놓치기 쉬운 원인 총정리

by 샤나엘 2026. 4. 8.
반응형

ORA-00907 : 오른쪽 괄호 누락, 놓치기 쉬운 원인 총정리

SQL을 작성하다 보면 ORA-00907 : missing right parenthesis 에러를 한 번쯤은 만나게 됩니다. 이름만 보면 단순히 닫는 괄호를 빠뜨린 것 같지만, 실제로는 괄호와 무관한 문법 오류에서도 자주 발생합니다. 이 글에서는 ORA-00907의 진짜 원인들을 하나씩 짚어봅니다.

 

ORA-00907

 


ORA-00907 에러란?

ORA-00907은 오라클이 SQL을 파싱하는 도중 닫는 괄호 ')'가 있어야 할 위치에 없다고 판단할 때 발생하는 에러입니다.

 

ORA-00907 에러란?

 

공식 메시지는 다음과 같습니다.

ORA-00907 : missing right parenthesis
(오른쪽 괄호가 누락되었습니다)

중요한 점은 이 에러가 실제 괄호 누락뿐 아니라 괄호 안에서 잘못된 문법을 사용했을 때도 발생한다는 것입니다. 오라클이 괄호 내부의 구문을 해석하다가 실패하면, "여기서 괄호가 닫혀야 하는데 닫히지 않았다"고 보고하기 때문입니다.


주요 발생 원인 5가지

번호 원인 설명
1 실제 닫는 괄호 누락 여는 괄호와 닫는 괄호 개수 불일치
2 CREATE TABLE 컬럼 정의 오류 DEFAULT 값, 제약조건 문법 실수
3 INSERT 문의 VALUES 문법 오류 컬럼 수와 값 수 불일치, 잘못된 표현식
4 서브쿼리 내부 문법 오류 서브쿼리 안에서 지원하지 않는 문법 사용
5 함수 호출 시 인자 오류 함수 인자 구분자, 잘못된 키워드

원인 1 : 실제 닫는 괄호 누락

가장 직관적인 원인입니다. 여는 괄호 '('를 썼는데 닫는 괄호 ')'를 빠뜨린 경우입니다.

 

실제 닫는 괄호 누락

 

에러 발생 예시 :

 

SELECT * FROM employees WHERE department_id IN (10, 20, 30
-- 닫는 괄호 ) 누락 → ORA-00907

 

SELECT NVL(salary, 0 FROM employees;
-- NVL 함수의 닫는 괄호 누락

 

SELECT * FROM (SELECT employee_id, salary FROM employees
-- 인라인 뷰의 닫는 괄호 누락

 

 

해결법 :

 

SELECT * FROM employees WHERE department_id IN (10, 20, 30);

 

SELECT NVL(salary, 0) FROM employees;

 

SELECT * FROM (SELECT employee_id, salary FROM employees);

 

중첩 괄호가 많을 때는 여는 괄호와 닫는 괄호 개수가 일치하는지 세어보세요. SQL Developer에서는 괄호에 커서를 놓으면 짝이 되는 괄호가 하이라이트됩니다.


원인 2 : CREATE TABLE 컬럼 정의 오류

CREATE TABLE 문에서 컬럼 정의 시 잘못된 문법을 사용하면 ORA-00907이 발생합니다. 괄호와 직접적인 관계가 없어 보여서 원인을 찾기 어려운 경우가 많습니다.

 

에러 발생 예시 :

 

-- AUTO_INCREMENT는 MySQL 문법 (오라클에서 불가)
CREATE TABLE orders (
order_id NUMBER AUTO_INCREMENT,
order_date DATE DEFAULT SYSDATE
);

-- ORA-00907 발생

-- DEFAULT 값에 잘못된 표현식
CREATE TABLE products (
product_id NUMBER,
created_at DATE DEFAULT DATE '2024-01-01'
);

-- 인라인 제약조건 문법 실수
CREATE TABLE users (
user_id NUMBER PRIMARY KEY NOT NULL,
email VARCHAR2(100) UNIQUE NOT NULL CHECK(LENGTH(email) > 5
);
-- CHECK 안의 닫는 괄호 누락

 

해결법 :

-- 오라클 자동 증가 : IDENTITY (12c 이상) 또는 시퀀스
CREATE TABLE orders (
order_id NUMBER GENERATED ALWAYS AS IDENTITY,
order_date DATE DEFAULT SYSDATE
);

-- DEFAULT 값은 올바른 리터럴 사용
CREATE TABLE products (
product_id NUMBER,
created_at DATE DEFAULT TO_DATE('2024-01-01', 'YYYY-MM-DD')
);

-- 괄호 짝 맞추기
CREATE TABLE users (
user_id NUMBER PRIMARY KEY NOT NULL,
email VARCHAR2(100) UNIQUE NOT NULL CHECK(LENGTH(email) > 5)
);


원인 3 : INSERT 문의 VALUES 문법 오류

INSERT 문에서 VALUES 절에 잘못된 표현식이나 키워드를 사용하면 ORA-00907이 발생합니다.

 

INSERT 문의 VALUES 문법 오류

 

에러 발생 예시 :

-- VALUES 안에 AS 키워드 사용 (불가)
INSERT INTO employees (employee_id, first_name)
VALUES (100 AS id, 'John' AS name);
-- ORA-00907

-- 컬럼 수와 값 수 불일치 시에도 간혹 발생
INSERT INTO employees (employee_id, first_name, salary)
VALUES (100, 'John');
-- ORA-00947이 일반적이지만, 다른 문법 오류와 겹치면 ORA-00907

-- VALUES 안에 WHERE 등 잘못된 키워드
INSERT INTO employees (employee_id, first_name)
VALUES (100, 'John' WHERE 1=1);

 

해결법 :

INSERT INTO employees (employee_id, first_name)
VALUES (100, 'John');

-- 여러 행 삽입은 INSERT ALL 사용
INSERT ALL
INTO employees (employee_id, first_name) VALUES (100, 'John')
INTO employees (employee_id, first_name) VALUES (101, 'Jane')
SELECT * FROM DUAL;


원인 4 : 서브쿼리 내부 문법 오류

서브쿼리 안에서 오라클이 지원하지 않는 문법을 사용하면, 서브쿼리의 괄호를 닫을 수 없다고 판단하여 ORA-00907이 발생합니다.

에러 발생 예시 :

-- 서브쿼리 안에서 LIMIT 사용 (MySQL 문법)
SELECT * FROM employees WHERE department_id IN
(SELECT department_id FROM departments LIMIT 5);
-- ORA-00907

-- 서브쿼리 안에서 ORDER BY 단독 사용 (일부 컨텍스트에서 불가)
DELETE FROM employees WHERE employee_id IN
(SELECT employee_id FROM temp_table ORDER BY hire_date);

 

해결법 :

-- LIMIT 대신 ROWNUM 또는 FETCH FIRST 사용
SELECT * FROM employees WHERE department_id IN
(SELECT department_id FROM departments WHERE ROWNUM <= 5);

-- 서브쿼리에서 ORDER BY가 필요하면 인라인 뷰 사용
DELETE FROM employees WHERE employee_id IN
(SELECT employee_id FROM (SELECT employee_id FROM temp_table ORDER BY hire_date) WHERE ROWNUM <= 10);


원인 5 : 함수 호출 시 인자 오류

오라클 내장 함수나 사용자 정의 함수 호출 시 인자 구분이 잘못되거나 지원하지 않는 키워드를 쓰면 ORA-00907이 발생합니다.

함수 호출 시 인자 오류

 

에러 발생 예시 :

-- DECODE 함수에서 쉼표 누락
SELECT DECODE(status 'A', '활성' 'I', '비활성') FROM users;
-- ORA-00907

-- TO_CHAR 함수 인자 실수
SELECT TO_CHAR(sysdate 'YYYY-MM-DD') FROM DUAL;
-- 쉼표 누락

 

해결법 :

SELECT DECODE(status, 'A', '활성', 'I', '비활성') FROM users;

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;

함수 인자 사이에는 반드시 쉼표(,)로 구분해야 합니다. 인자가 많은 DECODE나 CASE 문에서 특히 실수가 잦으므로 주의하세요.


자주 묻는 질문 (FAQ)

Q1. 괄호를 다 맞췄는데 ORA-00907이 발생합니다.

괄호 안의 문법이 잘못되었을 가능성이 높습니다. 특히 CREATE TABLE, INSERT VALUES, 서브쿼리 내부에서 MySQL/SQL Server 문법을 사용했는지 확인하세요.

 

Q2. ORA-00907과 ORA-00906의 차이점은 무엇인가요?

ORA-00907은 오른쪽(닫는) 괄호 누락, ORA-00906은 왼쪽(여는) 괄호 누락입니다. 둘 다 실제 괄호 문제뿐 아니라 문법 오류에서도 발생합니다.

 

Q3. 긴 SQL에서 괄호 짝을 쉽게 찾는 방법이 있나요?

SQL Developer에서 괄호 위에 커서를 놓으면 짝이 하이라이트됩니다. 또는 SQL을 줄바꿈하고 들여쓰기를 정리하면 괄호 구조가 한눈에 보입니다.


핵심 정리

점검 사항 확인 방법
괄호 짝 확인 여는 괄호와 닫는 괄호 개수 일치 여부
CREATE TABLE 문법 AUTO_INCREMENT 등 MySQL 전용 문법 제거
INSERT VALUES AS, WHERE 등 불필요한 키워드 제거
서브쿼리 내부 LIMIT 대신 ROWNUM, FETCH FIRST 사용
함수 인자 쉼표(,) 구분자 누락 확인

핵심 정리

 

태그 : ORA-00907, ORA-00907 해결, ORA-00907 원인, missing right parenthesis, 오른쪽 괄호 누락, 오라클 에러, 오라클 괄호 에러, CREATE TABLE 에러, INSERT VALUES 에러, 오라클 서브쿼리 에러, 오라클 문법 오류, 오라클 SQL 파싱, 오라클 트러블슈팅, 데이터베이스 에러, SQL 구문 에러

반응형

댓글