2026년 09월 17일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12726 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12726 unmatched bracket in regular expression 는?
ORA-12726 에러는 Oracle의 정규 표현식(Regular Expression) 함수에서 괄호([, ])가 올바르게 매칭되지 않았을 때 발생하는 에러입니다. 주로 REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_REPLACE, REGEXP_INSTR, REGEXP_COUNT 등의 함수에서 패턴 문자열을 잘못 작성했을 때 나타납니다. 괄호 쌍이 맞지 않거나, 문자 클래스(Character Class) 정의 시 닫는 괄호를 누락하거나 위치를 잘못 지정하면 Oracle 엔진이 정규식을 파싱하지 못하고 이 에러를 반환합니다.
주요 발생 원인
1. 문자 클래스(Character Class)에서 닫는 괄호 ] 누락
정규 표현식에서 [abc]와 같이 문자 클래스를 정의할 때 여는 괄호 [와 반드시 닫는 괄호 ]가 쌍을 이루어야 합니다. 개발자가 복잡한 패턴을 작성하다 보면 닫는 괄호를 빠뜨리는 경우가 많으며, Oracle의 정규식 엔진은 이를 즉시 감지하여 ORA-12726 에러를 발생시킵니다. 특히 여러 개의 문자 클래스를 중첩하거나 연속으로 사용할 때 실수가 잦습니다.
2. POSIX 문자 클래스 표현식의 잘못된 사용
Oracle 정규 표현식은 POSIX 표준을 지원하며, [:alpha:], [:digit:], [:space:] 등의 POSIX 클래스를 사용할 수 있습니다. 이 POSIX 클래스는 반드시 [[:alpha:]]처럼 바깥쪽 대괄호 안에 넣어야 하는데, [:alpha:]만 단독으로 쓰거나 외부 괄호를 잘못 처리하면 ORA-12726이 발생합니다. POSIX 클래스를 처음 접하는 개발자들이 특히 자주 저지르는 실수입니다.
3. 백슬래시 이스케이프 처리로 인한 괄호 인식 오류
정규 표현식 내에서 리터럴 괄호 [나 ]를 표현하려면 백슬래시(\)로 이스케이프해야 하는데, SQL 문자열 내에서 백슬래시 처리가 혼동될 수 있습니다. Oracle SQL에서는 문자열 이스케이프 방식이 다른 언어와 다소 다르기 때문에, 의도치 않게 괄호가 이스케이프되어 쌍이 맞지 않는 것처럼 인식될 수 있습니다. 특히 애플리케이션 레이어에서 동적으로 정규식 패턴을 생성하여 SQL로 전달할 때 이러한 문제가 자주 발생합니다.
해결 방법
원인 1 해결: 닫는 괄호 ] 추가
문자 클래스의 괄호가 올바르게 닫혔는지 확인하고 수정합니다.
-- 잘못된 예시 (ORA-12726 발생)
SELECT *
FROM employees
WHERE REGEXP_LIKE(first_name, '[A-Z');
-- 올바른 예시 (닫는 괄호 추가)
SELECT *
FROM employees
WHERE REGEXP_LIKE(first_name, '[A-Z]');
-- 여러 문자 클래스 사용 시 예시
SELECT employee_id, first_name, last_name
FROM employees
WHERE REGEXP_LIKE(phone_number, '[0-9]{3}-[0-9]{4}');
패턴을 작성할 때는 여는 괄호 [를 쓴 직후에 닫는 괄호 ]를 먼저 입력해두고 내용을 채우는 습관을 들이면 실수를 줄일 수 있습니다.
-- 복잡한 패턴에서 괄호 쌍 확인 예시
SELECT REGEXP_SUBSTR('Hello World 123', '[A-Za-z]+') AS extracted_text
FROM dual;
-- 숫자와 알파벳 혼합 패턴
SELECT REGEXP_REPLACE('abc123def456', '[0-9]+', '#') AS replaced_text
FROM dual;
원인 2 해결: POSIX 문자 클래스 올바르게 사용
POSIX 클래스는 반드시 바깥쪽 대괄호 [ ] 안에 포함되어야 합니다.
-- 잘못된 예시 (ORA-12726 발생)
SELECT *
FROM employees
WHERE REGEXP_LIKE(first_name, '[:alpha:]+');
-- 올바른 예시 (바깥쪽 괄호 추가)
SELECT *
FROM employees
WHERE REGEXP_LIKE(first_name, '[[:alpha:]]+');
-- 여러 POSIX 클래스 조합 예시
SELECT employee_id, first_name
FROM employees
WHERE REGEXP_LIKE(first_name, '^[[:upper:]][[:lower:]]+$');
-- 이메일 유효성 간단 검증 예시
SELECT email
FROM employees
WHERE REGEXP_LIKE(email, '^[[:alnum:]._-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}$');
-- 숫자만 포함 여부 확인
SELECT salary
FROM employees
WHERE REGEXP_LIKE(TO_CHAR(salary), '^[[:digit:]]+$');
POSIX 클래스 종류를 정리하면 다음과 같습니다:
[[:alpha:]]: 알파벳 문자[[:digit:]]: 숫자 문자[[:alnum:]]: 알파벳 + 숫자[[:space:]]: 공백 문자[[:upper:]]: 대문자[[:lower:]]: 소문자
원인 3 해결: 이스케이프 처리 올바르게 적용
리터럴 괄호를 사용해야 할 때는 이스케이프를 명확히 처리합니다.
-- 리터럴 [ 를 패턴에 포함하는 경우
SELECT REGEXP_INSTR('value[10]', '\[') AS bracket_position
FROM dual;
-- 동적 패턴 생성 시 검증 쿼리 예시
DECLARE
v_pattern VARCHAR2(200) := '[A-Za-z0-9]+';
v_result NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_result
FROM employees
WHERE REGEXP_LIKE(first_name, v_pattern);
DBMS_OUTPUT.PUT_LINE('매칭 건수: ' || v_result);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('정규식 오류: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('사용된 패턴: ' || v_pattern);
END;
/
-- 패턴 테스트용 dual 쿼리
SELECT REGEXP_SUBSTR('test[string]', '\[[^\]]+\]') AS bracket_content
FROM dual;
예방 방법
1. 정규 표현식 패턴을 사용 전에 반드시 dual 테이블로 먼저 검증하기
실제 운영 테이블에 적용하기 전에 dual 테이블을 이용하여 패턴이 올바르게 동작하는지 검증하는 습관을 들여야 합니다. 간단한 테스트 문자열로 패턴을 먼저 검증하면 ORA-12726과 같은 문법 오류를 사전에 발견할 수 있습니다.
-- 패턴 사전 검증 습관화
SELECT
REGEXP_SUBSTR('테스트문자열ABC123', '[A-Z]+') AS result1,
REGEXP_LIKE('ABC', '[[:upper:]]+') AS result2
FROM dual;
2. 정규 표현식 패턴을 상수(Constant) 또는 변수로 분리하여 관리하기
패턴 문자열을 SQL 안에 직접 하드코딩하지 말고, PL/SQL 상수나 애플리케이션 설정으로 분리하여 관리하면 패턴을 재사용하고 검토하기 쉬워집니다. 또한 코드 리뷰 시 정규 표현식 패턴만 별도로 검토할 수 있어 오류 발견 가능성이 높아집니다.
-- 패턴 상수화 예시 (PL/SQL 패키지)
CREATE OR REPLACE PACKAGE regex_patterns AS
C_EMAIL_PATTERN CONSTANT VARCHAR2(200) := '^[[:alnum:]._-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}$';
C_PHONE_PATTERN CONSTANT VARCHAR2(200) := '^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$';
C_ALPHA_ONLY CONSTANT VARCHAR2(200) := '^[[:alpha:]]+$';
C_NUMERIC_ONLY CONSTANT VARCHAR2(200) := '^[[:digit:]]+$';
END regex_patterns;
/
관련 에러
- ORA-12725:
unmatched parentheses in regular expression— 소괄호(,)가 쌍을 이루지 못할 때 발생하며, ORA-12726과 유사한 패턴의 에러입니다. - ORA-12727:
invalid back reference in regular expression— 정규 표현식 내에서 유효하지 않은 역참조(Back Reference)를 사용했을 때 발생합니다. - ORA-12728:
invalid range in regular expression— 문자 범위 지정이 잘못되었을 때 발생합니다. 예:[z-a]처럼 역방향 범위를 지정한 경우입니다. - ORA-12729:
invalid character class in regular expression— 잘못된 문자 클래스 이름을 사용했을 때 발생합니다. 예:[[:invalidclass:]]처럼 존재하지 않는 POSIX 클래스를 사용한 경우입니다.
이 에러들은 모두 Oracle 정규 표현식 엔진의 패턴 파싱 단계에서 발생하며, ORA-12726과 함께 자주 동반되어 나타날 수 있으므로 정규 표현식 관련 작업 시 함께 숙지해두는 것이 좋습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.