본문 바로가기
IT

ORA-00903 : 테이블명이 부적합합니다 - 예약어부터 명명규칙까지

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

ORA-00903 : 테이블명이 부적합합니다 - 예약어부터 명명규칙까지

오라클에서 테이블이나 뷰를 참조할 때 이름 규칙을 위반하면 ORA-00903 : invalid table name 에러가 발생합니다. 단순 오타부터 예약어 충돌, 따옴표 문제까지 다양한 원인이 있습니다. 이 글에서는 ORA-00903의 모든 원인과 해결법을 실전 예제로 정리합니다.

 

ORA-00903


ORA-00903 에러란?

ORA-00903은 SQL 문에서 참조하는 테이블 이름이 오라클의 명명 규칙에 맞지 않을 때 발생하는 에러입니다.

 

ORA-00903 에러란?

 

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

ORA-00903 : invalid table name
(테이블명이 부적합합니다)

 

이 에러는 테이블이 "존재하지 않는" 경우(ORA-00942)와는 다릅니다. ORA-00903은 테이블 이름 자체가 문법적으로 유효하지 않다는 뜻입니다. 즉, 이름의 형식이 잘못된 것입니다.


주요 발생 원인 5가지

번호 원인 설명
1 오라클 예약어를 테이블명으로 사용 SELECT, TABLE, ORDER 등
2 테이블명이 숫자로 시작 1st_table, 2024_data 등
3 특수문자가 포함된 테이블명 my-table, data@2024 등
4 큰따옴표(") 사용 문제 대소문자 고정, 매번 따옴표 필요
5 테이블명 자리에 잘못된 표현식 서브쿼리/함수를 테이블명 위치에 사용

원인 1 : 오라클 예약어를 테이블명으로 사용

오라클의 예약어(Reserved Word)를 테이블 이름으로 사용하면 ORA-00903이 발생합니다.

 

오라클 예약어를 테이블명으로 사용

 

에러 발생 예시 :

-- 예약어를 테이블명으로 사용
CREATE TABLE SELECT (id NUMBER);        -- ORA-00903
CREATE TABLE TABLE (name VARCHAR2(50)); -- ORA-00903
CREATE TABLE ORDER (seq NUMBER);        -- ORA-00903

SELECT * FROM COMMENT;                  -- ORA-00903

 

해결법 :

-- 방법 1 : 큰따옴표로 감싸기 (비추천)
CREATE TABLE "SELECT" (id NUMBER);
SELECT * FROM "SELECT";  -- 매번 따옴표 필요

-- 방법 2 : 이름 변경 (추천)
CREATE TABLE TB_SELECT (id NUMBER);
CREATE TABLE ORDER_INFO (seq NUMBER);
CREATE TABLE COMMENT_LIST (content VARCHAR2(500));

자주 충돌하는 예약어 목록입니다.

예약어 대체 테이블명 예시
SELECT TB_SELECT
TABLE TB_TABLE_INFO
ORDER ORDER_INFO, TB_ORDER
COMMENT COMMENT_LIST, TB_COMMENT
USER USER_INFO, TB_USER
DATE DATE_INFO, TB_DATE
NUMBER NUMBER_INFO
LEVEL LEVEL_INFO

예약어를 테이블명으로 꼭 써야 한다면 큰따옴표로 감쌀 수 있지만, 이후 모든 SQL에서 항상 따옴표를 써야 하므로 이름 자체를 변경하는 것이 좋습니다.


원인 2 : 테이블명이 숫자로 시작

오라클의 식별자 규칙상 테이블명은 반드시 문자(A-Z)로 시작해야 합니다. 숫자로 시작하면 ORA-00903이 발생합니다.

에러 발생 예시 :

CREATE TABLE 2024_SALES (id NUMBER);    -- ORA-00903
CREATE TABLE 1st_quarter (amt NUMBER);  -- ORA-00903

SELECT * FROM 99_products;              -- ORA-00903

해결법 :

-- 방법 1 : 문자로 시작하도록 변경 (추천)
CREATE TABLE SALES_2024 (id NUMBER);
CREATE TABLE Q1_DATA (amt NUMBER);

-- 방법 2 : 큰따옴표 사용 (비추천)
CREATE TABLE "2024_SALES" (id NUMBER);
SELECT * FROM "2024_SALES";  -- 매번 따옴표 필요

오라클 식별자 명명 규칙을 정리하면 다음과 같습니다.

규칙 설명 예시
첫 글자 반드시 영문자(A-Z) EMP (O), 1EMP (X)
사용 가능 문자 영문, 숫자, _, $, # EMP_01 (O)
사용 불가 문자 공백, 하이픈(-), 특수문자 EMP-01 (X)
최대 길이 30바이트 (12c 이상 128바이트) -
대소문자 기본적으로 대문자로 저장 emp = EMP

원인 3 : 특수문자가 포함된 테이블명

하이픈(-), 공백, @, ! 등의 특수문자가 포함된 테이블명은 오라클에서 허용되지 않습니다.

에러 발생 예시 :

CREATE TABLE my-table (id NUMBER);       -- ORA-00903
CREATE TABLE data@2024 (val NUMBER);     -- ORA-00903
CREATE TABLE sales data (amt NUMBER);    -- ORA-00903 (공백 포함)

해결법 :

-- 특수문자 대신 언더스코어(_) 사용
CREATE TABLE MY_TABLE (id NUMBER);
CREATE TABLE DATA_2024 (val NUMBER);
CREATE TABLE SALES_DATA (amt NUMBER);

원인 4 : 큰따옴표(") 관련 문제

큰따옴표로 생성한 테이블은 대소문자가 고정됩니다. 이후 참조할 때 따옴표 없이 사용하거나 대소문자가 다르면 에러가 발생합니다.

 

큰따옴표(") 관련 문제

 

에러 발생 예시 :

-- 소문자로 생성
CREATE TABLE "myTable" (id NUMBER);

-- 따옴표 없이 조회 (오라클이 MYTABLE로 변환 -> 못 찾음)
SELECT * FROM myTable;    -- ORA-00942 (존재하지 않음)
SELECT * FROM MYTABLE;    -- ORA-00942

-- 따옴표는 썼지만 대소문자가 다름
SELECT * FROM "mytable";  -- ORA-00942

해결법 :

-- 정확한 대소문자 + 큰따옴표로 참조
SELECT * FROM "myTable";  -- 정상 동작

-- 근본적 해결 : 따옴표 없이 대문자로 재생성
CREATE TABLE MY_TABLE AS SELECT * FROM "myTable";
DROP TABLE "myTable";

큰따옴표로 테이블을 만들면 모든 SQL에서 항상 정확한 대소문자와 따옴표를 써야 하는 번거로움이 생깁니다. 가급적 따옴표 없이 테이블을 생성하는 것이 좋습니다.


원인 5 : 테이블명 위치에 잘못된 표현식 사용

FROM 절의 테이블 자리에 유효하지 않은 표현식을 넣으면 ORA-00903이 발생합니다.

 

명명 규칙

 

에러 발생 예시 :

-- 문자열을 테이블명 자리에 사용
SELECT * FROM 'employees';         -- ORA-00903

-- 변수를 직접 사용
SELECT * FROM v_table_name;        -- 변수가 아닌 테이블로 인식

-- 잘못된 스키마 구분자
SELECT * FROM hr->employees;       -- ORA-00903

해결법 :

-- 테이블명은 따옴표 없이 직접 작성
SELECT * FROM employees;

-- 스키마 구분자는 마침표(.) 사용
SELECT * FROM hr.employees;

-- 동적 테이블명은 EXECUTE IMMEDIATE 사용
DECLARE
    v_table VARCHAR2(30) := 'EMPLOYEES';
BEGIN
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || v_table;
END;
/

자주 묻는 질문 (FAQ)

Q1. ORA-00903과 ORA-00942의 차이점은 무엇인가요?

ORA-00903은 테이블 이름의 형식이 잘못된 경우(예약어, 숫자 시작, 특수문자 등)이고, ORA-00942는 이름 형식은 맞지만 해당 테이블이 존재하지 않거나 권한이 없는 경우입니다.

 

Q2. 예약어를 테이블명으로 사용해도 되나요?

큰따옴표로 감싸면 가능하지만 권장하지 않습니다. 이후 모든 SQL에서 항상 큰따옴표를 써야 하고, 실수로 빠뜨리면 에러가 발생합니다.

 

Q3. 기존 테이블명이 예약어인 경우 어떻게 바꾸나요?

-- RENAME으로 테이블명 변경
ALTER TABLE "ORDER" RENAME TO ORDER_INFO;

 

Q4. 오라클 예약어 전체 목록은 어디서 확인하나요?

SELECT keyword FROM V$RESERVED_WORDS WHERE reserved = 'Y' ORDER BY keyword;

핵심 정리

점검 사항 확인 방법
예약어 여부 V$RESERVED_WORDS 조회
첫 글자 영문자(A-Z)로 시작하는지 확인
특수문자 언더스코어(_)만 사용, 하이픈(-) 금지
큰따옴표 가급적 사용하지 않기, 사용 시 대소문자 정확히
표현식 FROM 절에 문자열 리터럴('') 사용 금지

 

태그 : ORA-00903, ORA-00903 해결, ORA-00903 원인, oracle error, 오라클 에러, 테이블명이 부적합합니다, invalid table name, 오라클 테이블 이름 규칙, 오라클 예약어, 오라클 식별자, 오라클 네이밍 규칙, 오라클 테이블 생성 에러, 오라클 트러블슈팅, 데이터베이스 에러, SQL 문법

반응형

댓글