2026년 07월 29일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01741 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01741 illegal zero-length identifier 는?
ORA-01741 에러는 Oracle 데이터베이스에서 길이가 0인, 즉 비어있는 식별자(identifier)를 사용하려 할 때 발생하는 에러입니다. Oracle에서 테이블명, 컬럼명, 별칭(alias) 등의 식별자는 반드시 1자 이상의 유효한 문자를 포함해야 하며, 빈 문자열(“”)을 식별자로 사용하는 것은 허용되지 않습니다. 주로 큰따옴표(“”)를 사용하여 빈 문자열을 식별자로 지정하거나, 동적 SQL 생성 시 식별자 변수가 빈 값으로 처리될 때 자주 발생합니다.
주요 발생 원인
- 큰따옴표로 빈 문자열을 식별자로 사용하는 경우
Oracle은 큰따옴표(")로 감싼 식별자를 허용하지만, 내부가 비어있는 ""는 유효한 식별자로 인정하지 않습니다. 예를 들어 컬럼 별칭이나 테이블 별칭을 ""로 지정하거나, DDL 문에서 큰따옴표 사이에 아무런 문자가 없는 경우 이 에러가 발생합니다. 이는 SQL을 자동으로 생성하는 애플리케이션 코드나 스크립트에서 문자열 처리 오류로 인해 빈 식별자가 만들어질 때 특히 자주 나타납니다.
- 동적 SQL 생성 시 변수 값이 비어있는 경우
PL/SQL이나 외부 애플리케이션에서 동적으로 SQL 문을 조합할 때, 테이블명·컬럼명·스키마명 등의 식별자를 변수로 처리하다가 해당 변수가 NULL 또는 빈 문자열(”)로 세팅된 채로 SQL이 실행되면 ORA-01741이 발생합니다. 예를 들어 EXECUTE IMMEDIATE로 동적 쿼리를 실행할 때 식별자 부분에 빈 값이 포함되면, Oracle 파서가 이를 zero-length identifier로 판단합니다.
- SQL 툴 또는 스크립트에서 잘못된 문자열 치환이 발생한 경우
SQLPlus, SQL Developer, 또는 외부 스크립트(Shell, Python 등)에서 SQL 문을 동적으로 구성할 때, 치환 변수(substitution variable)나 바인드 변수가 올바르게 설정되지 않아 식별자 부분이 공백 또는 빈 문자열로 남는 경우가 있습니다. 특히 SQLPlus의 &변수명 치환 변수를 사용할 때 변수에 빈 값을 입력하거나, 프로그램 로직의 버그로 인해 식별자 문자열이 비워지면 이 에러가 나타납니다.
해결 방법
원인 1 해결: 큰따옴표 빈 식별자 제거
빈 큰따옴표를 식별자로 사용하지 않도록 SQL 문을 수정합니다.
-- 잘못된 예시: 빈 큰따옴표를 컬럼 별칭으로 사용
SELECT employee_id AS "" FROM employees;
-- ORA-01741: illegal zero-length identifier 발생
-- 올바른 예시: 유효한 별칭 사용
SELECT employee_id AS "EMP_ID" FROM employees;
-- 올바른 예시: 큰따옴표 없이 별칭 사용
SELECT employee_id AS EMP_ID FROM employees;
-- 잘못된 예시: CREATE TABLE에서 빈 컬럼명 사용
CREATE TABLE test_table (
"" VARCHAR2(100)
);
-- ORA-01741 발생
-- 올바른 예시: 유효한 컬럼명 사용
CREATE TABLE test_table (
col_name VARCHAR2(100)
);
원인 2 해결: 동적 SQL에서 식별자 변수 검증
동적 SQL을 실행하기 전에 반드시 식별자 변수의 값이 유효한지 검사하는 로직을 추가합니다.
-- 잘못된 예시: 검증 없이 동적 SQL 실행
DECLARE
v_table_name VARCHAR2(100) := ''; -- 빈 문자열
v_sql VARCHAR2(500);
BEGIN
v_sql := 'SELECT COUNT(*) FROM ' || '"' || v_table_name || '"';
EXECUTE IMMEDIATE v_sql;
-- ORA-01741 발생
END;
/
-- 올바른 예시: 실행 전 식별자 유효성 검사
DECLARE
v_table_name VARCHAR2(100) := ''; -- 빈 문자열 (테스트용)
v_sql VARCHAR2(500);
v_count NUMBER;
BEGIN
-- 식별자가 비어있는지 사전 검증
IF v_table_name IS NULL OR TRIM(v_table_name) = '' THEN
RAISE_APPLICATION_ERROR(-20001, '테이블명이 비어있습니다. 유효한 테이블명을 입력하세요.');
END IF;
-- 큰따옴표 없이 동적 SQL 구성 (대소문자 구분이 필요 없는 경우)
v_sql := 'SELECT COUNT(*) FROM ' || DBMS_ASSERT.SIMPLE_SQL_NAME(v_table_name);
EXECUTE IMMEDIATE v_sql INTO v_count;
DBMS_OUTPUT.PUT_LINE('ROW COUNT: ' || v_count);
END;
/
-- DBMS_ASSERT 패키지를 활용한 안전한 동적 SQL 작성
DECLARE
v_schema VARCHAR2(100) := 'HR';
v_table_name VARCHAR2(100) := 'EMPLOYEES';
v_col_name VARCHAR2(100) := 'EMPLOYEE_ID';
v_sql VARCHAR2(500);
v_count NUMBER;
BEGIN
-- DBMS_ASSERT로 식별자 유효성 검증 (빈 값이면 예외 발생)
v_sql := 'SELECT COUNT('
|| DBMS_ASSERT.SIMPLE_SQL_NAME(v_col_name)
|| ') FROM '
|| DBMS_ASSERT.SCHEMA_NAME(v_schema)
|| '.'
|| DBMS_ASSERT.SQL_OBJECT_NAME(v_schema || '.' || v_table_name);
EXECUTE IMMEDIATE v_sql INTO v_count;
DBMS_OUTPUT.PUT_LINE('COUNT: ' || v_count);
END;
/
원인 3 해결: SQL 스크립트 치환 변수 검증
SQL*Plus 또는 스크립트에서 치환 변수를 사용할 때 빈 값 여부를 확인합니다.
-- SQL*Plus에서 치환 변수 사용 시 기본값 설정
DEFINE table_name = 'EMPLOYEES'
-- 치환 변수가 비어있을 경우를 대비한 조건 처리
SELECT COUNT(*)
FROM &table_name
WHERE ROWNUM = 1;
-- Python 등 외부 언어에서 동적 SQL 생성 시 (주석으로 예시)
-- 아래는 Oracle cx_Oracle / python-oracledb 사용 예시 (개념 설명용)
-- 잘못된 방식 (식별자를 바인드 변수처럼 사용 불가)
-- cursor.execute("SELECT * FROM :table_name", {"table_name": ""})
-- 올바른 방식: 애플리케이션 레벨에서 검증 후 SQL 조합
-- table_name = get_table_name() # 함수에서 값 가져오기
-- if not table_name or not table_name.strip():
-- raise ValueError("테이블명이 비어있습니다.")
-- sql = f"SELECT * FROM {table_name}" # 검증된 값만 사용
-- cursor.execute(sql)
예방 방법
- 동적 SQL 생성 시 DBMS_ASSERT 패키지를 필수 활용
Oracle이 제공하는 DBMS_ASSERT 패키지의 SIMPLE_SQL_NAME, SCHEMA_NAME, SQL_OBJECT_NAME 등의 함수를 사용하면, 식별자가 유효하지 않거나 비어있을 경우 자동으로 예외를 발생시켜 ORA-01741을 사전에 방지할 수 있습니다. 또한 SQL Injection 방지에도 도움이 되므로, 동적 SQL을 사용하는 모든 PL/SQL 코드에 DBMS_ASSERT를 표준으로 적용하는 것을 팀 코딩 컨벤션으로 정하는 것이 좋습니다.
“`sql
— DBMS_ASSERT를 활용한 식별자 사전 검증 예시
BEGIN
— 빈 문자열이나 유효하지 않은 식별자 전달 시 ORA-44003 발생
DBMS_OUTPUT.PUT_LINE(DBMS_ASSERT.SIMPLE_SQL_NAME(‘EMPLOYEES’)); — 정상
DBMS_OUTPUT.PUT_LINE(DBMS_ASSERT.SIMPLE_SQL_NAME(”)); — 예외 발생
END;
/
“`
- 코드 리뷰 및 단위 테스트에서 빈 식별자 케이스 반드시 포함
SQL을 동적으로 생성하는 모듈에 대해 코드 리뷰 시 “식별자가 빈 문자열이거나 NULL일 경우”를 반드시 테스트 케이스로 포함해야 합니다. 단위 테스트(Unit Test) 단계에서 경계값(빈 문자열, NULL, 공백만 있는 문자열 등)을 입력으로 테스트하면, 운영 환경에서 발생할 수 있는 ORA-01741을 사전에 잡아낼 수 있습니다.
관련 에러
- ORA-00904:
invalid identifier— 식별자가 존재하지 않거나 문법적으로 잘못된 경우 발생하며, ORA-01741과 함께 식별자 관련 에러로 자주 언급됩니다. - ORA-00903:
invalid table name— 테이블명이 유효하지 않을 때 발생하며, 동적 SQL에서 테이블명이 비어있는 경우 ORA-01741 대신 이 에러가 발생하기도 합니다. - ORA-44003:
invalid simple SQL name—DBMS_ASSERT.SIMPLE_SQL_NAME함수에 유효하지 않은 식별자를 전달할 때 발생하며, ORA-01741을 예방하는 과정에서 마주칠 수 있는 에러입니다. - ORA-01745:
invalid host/bind variable name— 바인드 변수명이 유효하지 않을 때 발생하며, 동적 SQL의 바인드 변수 처리와 관련하여 ORA-01741과 유사한 맥락에서 등장합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.