2026년 06월 18일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00923 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00923 FROM keyword not found where expected 는?
ORA-00923 에러는 Oracle SQL 파서가 SELECT 문을 분석하는 과정에서 FROM 키워드가 있어야 할 위치에 해당 키워드를 찾지 못했을 때 발생하는 구문 오류(Syntax Error)입니다. 즉, SQL 문장의 구조 자체가 Oracle이 기대하는 문법 규칙에 맞지 않을 때 나타납니다. 이 에러는 주로 SELECT 절과 FROM 절 사이에 잘못된 문자, 누락된 쉼표, 잘못된 별칭(Alias) 사용, 혹은 예약어를 별칭으로 사용하는 경우 등 다양한 원인으로 발생하므로 초급 개발자뿐만 아니라 숙련된 DBA도 실수하기 쉬운 에러입니다.
주요 발생 원인
1. SELECT 절에서 컬럼 사이의 쉼표 누락 또는 잘못된 구문 사용
가장 흔한 원인 중 하나로, SELECT 절에서 여러 컬럼을 나열할 때 컬럼 사이에 쉼표(,)를 빠뜨리는 경우입니다. Oracle 파서는 쉼표 없이 연속된 두 단어를 만나면 구문의 끝을 정확히 인식하지 못하고, 결국 FROM 키워드를 예상 위치에서 찾지 못해 ORA-00923을 발생시킵니다. 또한 사칙연산이나 문자열 연결 연산자(||) 없이 두 컬럼을 바로 붙여 쓰는 실수도 동일한 에러를 유발합니다.
-- 잘못된 예: 쉼표 누락
SELECT employee_id first_name last_name
FROM employees;
-- ORA-00923: FROM keyword not found where expected
-- 올바른 예: 쉼표 추가
SELECT employee_id, first_name, last_name
FROM employees;
2. 컬럼 별칭(Alias)에 예약어(Reserved Word) 사용 또는 따옴표 처리 오류
Oracle에서는 컬럼 별칭으로 예약어(예: DATE, NUMBER, SELECT, FROM, ORDER 등)를 사용할 경우 반드시 큰따옴표(")로 감싸야 합니다. 만약 큰따옴표 없이 예약어를 별칭으로 사용하면 Oracle 파서가 해당 단어를 SQL 키워드로 인식하여 구문 해석에 실패하고 ORA-00923 에러를 발생시킵니다. 별칭에 공백이 포함된 경우에도 동일하게 큰따옴표로 감싸야 하며, 작은따옴표(')를 사용하면 안 된다는 점도 주의해야 합니다.
-- 잘못된 예: 예약어를 별칭으로 사용
SELECT salary * 12 date
FROM employees;
-- ORA-00923: FROM keyword not found where expected
-- 잘못된 예: 공백 포함 별칭에 작은따옴표 사용
SELECT employee_id 'Emp ID'
FROM employees;
-- ORA-00923: FROM keyword not found where expected
-- 올바른 예: 큰따옴표로 예약어/공백 별칭 처리
SELECT salary * 12 "date",
employee_id "Emp ID"
FROM employees;
3. DUAL 테이블 누락 또는 FROM 절 자체의 생략
Oracle에서는 테이블 없이 단순 계산이나 함수 결과를 조회할 때 반드시 FROM DUAL을 명시해야 합니다. MySQL이나 SQL Server처럼 FROM 절 없이 SELECT 1+1과 같이 작성하면 Oracle은 이를 인식하지 못하고 ORA-00923 에러를 반환합니다. 또한 서브쿼리나 복잡한 쿼리 작성 중 실수로 FROM 절 전체를 삭제하거나 잘못된 위치에 FROM을 기술하는 경우에도 이 에러가 발생합니다.
-- 잘못된 예: FROM 절 누락 (Oracle 12c 미만)
SELECT SYSDATE;
-- ORA-00923: FROM keyword not found where expected
SELECT 1 + 1;
-- ORA-00923: FROM keyword not found where expected
-- 올바른 예: DUAL 테이블 사용
SELECT SYSDATE FROM DUAL;
SELECT 1 + 1 AS result FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') AS today FROM DUAL;
> 참고: Oracle 23c(23ai)부터는 FROM DUAL 없이도 단순 표현식 조회가 가능하도록 개선되었으나, 운영 환경에서는 여전히 FROM DUAL을 명시하는 것이 호환성 측면에서 권장됩니다.
해결 방법
해결책 1: SELECT 절 문법 점검 및 쉼표 확인
ORA-00923 발생 시 가장 먼저 SELECT 절의 각 컬럼 또는 표현식 사이에 쉼표가 올바르게 입력되어 있는지 확인합니다. 특히 컬럼 수가 많은 쿼리일수록 중간에 쉼표가 빠지기 쉬우므로, 한 줄에 하나의 컬럼을 작성하는 포맷을 사용하면 육안으로 쉽게 확인할 수 있습니다.
-- 수정 전 (오류 발생)
SELECT
e.employee_id
e.first_name
e.last_name
e.salary
FROM employees e;
-- 수정 후 (올바른 쿼리)
SELECT
e.employee_id,
e.first_name,
e.last_name,
e.salary
FROM employees e;
해결책 2: 별칭 처리 규칙 적용
컬럼 별칭에 공백, 특수문자, 예약어가 포함될 경우 반드시 큰따옴표를 사용하고, AS 키워드를 명시적으로 사용하여 가독성을 높이는 것이 좋습니다.
-- 수정 전 (오류 발생)
SELECT
employee_id emp no,
hire_date date,
salary order
FROM employees;
-- 수정 후 (큰따옴표 + AS 키워드 사용)
SELECT
employee_id AS "Emp No",
hire_date AS "date",
salary AS "order"
FROM employees;
해결책 3: DUAL 테이블 및 FROM 절 추가
단순 연산이나 함수 결과를 SELECT할 때는 반드시 FROM DUAL을 추가하고, 복잡한 쿼리에서는 FROM 절이 올바른 위치에 존재하는지 확인합니다.
-- 단순 연산 조회
SELECT 100 * 200 AS calc_result FROM DUAL;
-- 날짜 함수 조회
SELECT
SYSDATE AS current_date,
ADD_MONTHS(SYSDATE, 3) AS after_3months,
TO_CHAR(SYSDATE, 'YYYY-MM-DD') AS formatted_date
FROM DUAL;
-- NVL, DECODE 등 단독 함수 테스트
SELECT NVL(NULL, '기본값') AS test_nvl FROM DUAL;
예방 방법
1. SQL 포매터(SQL Formatter) 및 IDE 자동 검증 도구 사용
SQL Developer, DBeaver, Toad 등 Oracle 전용 IDE에는 SQL 구문을 실행 전에 자동으로 파싱하여 오류를 사전에 감지해주는 기능이 내장되어 있습니다. 특히 대규모 쿼리나 다수의 컬럼을 다루는 경우, SQL 포매터를 통해 코드를 정렬하면 쉼표 누락이나 별칭 오류를 시각적으로 쉽게 발견할 수 있습니다. 팀 단위 개발 환경이라면 SQL 코드 리뷰 프로세스에 자동 린팅(Linting) 도구를 도입하여 커밋 전 단계에서 구문 오류를 사전 차단하는 것이 Best Practice입니다.
2. 예약어 목록 숙지 및 네이밍 컨벤션 수립
Oracle 예약어를 별칭이나 컬럼명으로 사용하지 않도록 팀 내 네이밍 컨벤션(Naming Convention)을 사전에 수립하고 문서화하는 것이 중요합니다. 예를 들어, date 대신 reg_date, order 대신 sort_order와 같이 Oracle 예약어와 겹치지 않는 명확한 이름을 사용하는 규칙을 정하면 ORA-00923뿐만 아니라 다양한 구문 오류를 사전에 방지할 수 있습니다. Oracle 공식 문서의 예약어 목록(Reserved Words and Keywords)을 팀 개발 가이드에 포함시켜 신규 개발자도 쉽게 참조할 수 있게 관리하는 것을 권장합니다.
관련 에러
- ORA-00900: invalid SQL statement — SQL 문장 자체가 Oracle이 인식하는 어떤 유효한 구문과도 맞지 않을 때 발생하며, ORA-00923과 함께 구문 오류 계열의 대표적인 에러입니다.
- ORA-00936: missing expression — SELECT 절이나 WHERE 절에서 표현식이 완전하지 않을 때 발생합니다. 쉼표 뒤에 컬럼명이 없거나 연산자 뒤에 피연산자가 누락된 경우 주로 나타납니다.
- ORA-00942: table or view does not exist — FROM 절 자체는 올바르게 작성되었으나 참조하는 테이블 또는 뷰가 존재하지 않거나 접근 권한이 없을 때 발생합니다.
- ORA-00907: missing right parenthesis — 괄호 쌍이 맞지 않을 때 발생하며, 복잡한 서브쿼리 작성 시 ORA-00923과 혼동되는 경우가 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.