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

ORA-00940
2026년 06월 21일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-00940 invalid ALTER command 는?

ORA-00940 에러는 Oracle 데이터베이스에서 ALTER 명령문을 잘못된 문법으로 사용하거나, 해당 객체 유형에 지원되지 않는 ALTER 옵션을 사용했을 때 발생하는 에러입니다. 예를 들어 ALTER TABLE, ALTER INDEX, ALTER SESSION 등의 명령에서 올바르지 않은 키워드나 옵션을 사용하면 Oracle 파서가 명령을 인식하지 못하고 이 에러를 반환합니다. 주로 오타, 잘못된 문법 구조, 또는 해당 Oracle 버전에서 지원하지 않는 구문을 사용했을 때 자주 발생하며, 개발 환경과 운영 환경의 Oracle 버전 차이로 인해 발생하는 경우도 적지 않습니다.


주요 발생 원인

1. ALTER 명령문의 잘못된 문법 또는 오타

가장 흔한 원인으로, ALTER TABLE 구문에서 MODIFY, ADD, DROP 등의 키워드를 잘못 사용하거나 철자를 틀리는 경우입니다. 예를 들어 ALTER TABLE emp CHANGE salary NUMBER(10,2) 처럼 Oracle에서 지원하지 않는 MySQL 계열의 키워드를 그대로 사용하면 이 에러가 발생합니다. Oracle은 타 데이터베이스와 문법 차이가 크기 때문에, 다른 DBMS에서 작성한 스크립트를 그대로 포팅할 때 특히 주의해야 합니다.

2. 지원되지 않는 ALTER 옵션 또는 객체 유형 불일치

특정 객체 유형에 적용할 수 없는 ALTER 옵션을 사용하는 경우에도 이 에러가 발생합니다. 예를 들어, View나 Synonym 같은 객체에 ALTER ... ENABLE/DISABLE 같은 제약조건 관련 구문을 사용하거나, Sequence에 ADD COLUMN 같은 테이블 전용 옵션을 사용하는 경우입니다. 각 Oracle 객체 유형마다 지원되는 ALTER 서브커맨드가 다르기 때문에, Oracle 공식 문서에서 해당 객체의 ALTER 구문을 반드시 확인해야 합니다.

3. Oracle 버전 간 호환성 문제

Oracle 9i, 10g, 11g, 12c, 19c 등 버전별로 지원하는 ALTER 구문이 다를 수 있습니다. 상위 버전에서 도입된 기능(예: ALTER TABLE ... COMPRESS FOR OLTP, ALTER TABLE ... INMEMORY 등)을 하위 버전 환경에서 실행하면 ORA-00940이 발생할 수 있습니다. CI/CD 파이프라인이나 마이그레이션 스크립트에서 버전 체크 없이 특정 버전 전용 구문을 사용하는 경우 운영 환경에서 예기치 않게 이 에러가 터지는 사례가 많습니다.


해결 방법

원인 1: 잘못된 문법 수정

잘못된 ALTER 구문을 Oracle 표준 문법으로 교체합니다.

-- ❌ 잘못된 예 (MySQL 문법을 Oracle에서 사용)
ALTER TABLE employees CHANGE salary emp_salary NUMBER(10,2);

-- ✅ 올바른 Oracle 문법 (컬럼명 변경은 RENAME COLUMN 사용, Oracle 9i 이상)
ALTER TABLE employees RENAME COLUMN salary TO emp_salary;

-- ✅ 데이터 타입 변경은 MODIFY 사용
ALTER TABLE employees MODIFY emp_salary NUMBER(12,2);

-- ❌ 잘못된 예 (COLUMN 키워드 누락)
ALTER TABLE employees ADD emp_email VARCHAR2(100);

-- ✅ 올바른 예
ALTER TABLE employees ADD (emp_email VARCHAR2(100));
-- ❌ 잘못된 인덱스 ALTER 예
ALTER INDEX emp_idx REBUILD TABLESPACE USERS ONLINE=TRUE;

-- ✅ 올바른 Oracle 인덱스 REBUILD 문법
ALTER INDEX emp_idx REBUILD TABLESPACE users ONLINE;

원인 2: 객체 유형에 맞는 올바른 구문 사용

-- ❌ View에 잘못된 ALTER 사용 예
ALTER VIEW emp_view ADD COLUMN dept_id NUMBER;

-- ✅ View는 컬럼 추가 불가. 뷰를 재생성해야 함
CREATE OR REPLACE VIEW emp_view AS
SELECT e.employee_id, e.first_name, e.salary, e.department_id AS dept_id
FROM employees e;

-- ❌ Sequence에 부적절한 ALTER 사용
ALTER SEQUENCE emp_seq ADD COLUMN seq_name VARCHAR2(50);

-- ✅ Sequence에서 지원하는 ALTER 옵션만 사용
ALTER SEQUENCE emp_seq
  INCREMENT BY 1
  MAXVALUE 999999999
  NOCYCLE
  CACHE 20;
-- ❌ 제약조건 비활성화 잘못된 문법
ALTER TABLE employees DISABLE emp_pk;

-- ✅ 올바른 제약조건 비활성화 문법
ALTER TABLE employees DISABLE CONSTRAINT emp_pk;

-- ✅ 제약조건 활성화
ALTER TABLE employees ENABLE CONSTRAINT emp_pk;

-- 현재 테이블의 제약조건 목록 확인
SELECT constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name = 'EMPLOYEES';

원인 3: Oracle 버전 확인 후 버전별 호환 구문 사용

-- 현재 Oracle 버전 확인
SELECT * FROM v$version WHERE banner LIKE 'Oracle%';

-- 또는
SELECT version FROM v$instance;

-- ❌ Oracle 12c 미만에서 사용 불가
ALTER TABLE sales INMEMORY PRIORITY CRITICAL;

-- ✅ 버전 조건부 실행 (PL/SQL 블록 활용)
DECLARE
  v_version VARCHAR2(20);
BEGIN
  SELECT version INTO v_version FROM v$instance;
  IF TO_NUMBER(SUBSTR(v_version, 1, 2)) >= 12 THEN
    EXECUTE IMMEDIATE 'ALTER TABLE sales INMEMORY PRIORITY CRITICAL';
    DBMS_OUTPUT.PUT_LINE('INMEMORY 옵션 적용 완료');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Oracle 12c 이상에서만 지원되는 기능입니다. 현재 버전: ' || v_version);
  END IF;
END;
/

-- ❌ Oracle 11g 미만에서 INVISIBLE INDEX 사용 불가
ALTER INDEX emp_salary_idx INVISIBLE;

-- ✅ 버전 확인 후 사용
-- (Oracle 11g 이상에서만 지원)
ALTER INDEX emp_salary_idx VISIBLE;

에러 발생 시 즉시 디버깅하는 방법

-- ALTER 구문 실행 전 문법 확인을 위한 EXPLAIN PLAN 활용
-- (DML/DDL 에러 사전 확인에 유용)

-- 현재 세션 파라미터 확인 (ALTER SESSION 관련 에러 디버깅)
SELECT name, value, description
FROM v$parameter
WHERE name LIKE '%optimizer%'
ORDER BY name;

-- ALTER SESSION 올바른 예
ALTER SESSION SET optimizer_mode = ALL_ROWS;
ALTER SESSION SET nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

-- ❌ 잘못된 ALTER SESSION
ALTER SESSION OPTIMIZER_MODE = ALL_ROWS;  -- SET 키워드 누락

-- 테이블 DDL 전체 확인 (DBMS_METADATA 활용)
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEES', 'HR') FROM DUAL;

예방 방법

1. SQL 스크립트 실행 전 문법 검증 프로세스 도입

운영 환경에 DDL 스크립트를 배포하기 전, 반드시 개발 및 스테이징 환경에서 동일한 Oracle 버전으로 사전 테스트를 수행해야 합니다. Oracle SQL Developer, Toad, DBeaver 등의 IDE에서 제공하는 문법 검사 기능을 적극 활용하고, CI/CD 파이프라인에 sqlplus를 이용한 자동 문법 체크 단계를 추가하는 것이 좋습니다. 또한 Flyway나 Liquibase 같은 DB 마이그레이션 도구를 사용하면 버전 관리와 함께 스크립트 유효성 검증을 체계적으로 관리할 수 있습니다.

2. Oracle 공식 문서 기반 DDL 표준 템플릿 관리

팀 내에서 Oracle 버전별로 검증된 ALTER 구문 표준 템플릿을 만들어 공유하고, 신규 구문 사용 시 반드시 Oracle 공식 문서(docs.oracle.com)에서 해당 버전의 지원 여부를 확인하는 규칙을 만드세요. 특히 다른 DBMS(MySQL, PostgreSQL, SQL Server)에서 Oracle로 마이그레이션하는 경우, DBMS별 문법 차이 체크리스트를 작성하여 교육 자료로 활용하면 팀 전체의 실수를 줄일 수 있습니다. Oracle 19c Long Term Support 버전을 기준으로 표준 DDL 가이드를 작성해 두는 것을 강력히 권장합니다.


관련 에러

  • ORA-00900: invalid SQL statement — SQL 전체 구문이 잘못된 경우 발생하며, ORA-00940과 유사하게 파서 단계에서 발생합니다.
  • ORA-00901: invalid CREATE command — CREATE 명령문에서 잘못된 문법을 사용했을 때 발생하며, ORA-00940의 ALTER 버전과 쌍을 이루는 에러입니다.
  • ORA-00902: invalid datatype — ALTER TABLE ... ADD/MODIFY 시 지원하지 않는 데이터 타입을 지정했을 때 발생합니다.
  • ORA-01735: invalid ALTER TABLE option — ALTER TABLE 명령에서 유효하지 않은 옵션을 사용했을 때 발생하는 더 구체적인 에러로, ORA-00940과 함께 자주 등장합니다.
  • ORA-00955: name is already used by an existing object — ALTER 후 객체 재생성 과정에서 이름 충돌이 발생할 때 연관되어 나타날 수 있습니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기