본문 바로가기
IT

ORA-01756 quoted string not properly terminated — 따옴표 문자열 미종료 에러 원인·해결·예방 완전 정리

by 샤나엘 2026. 5. 23.
반응형

ORA-01756 quoted string not properly terminated — 따옴표 문자열 미종료 에러 원인·해결·예방 완전 정리

Oracle SQL을 작성하다 보면 ORA-01756: quoted string not properly terminated를 자주 만난다. 작은따옴표(')로 시작한 문자열 리터럴의 닫는 따옴표가 빠졌거나, 문자열 내부에 작은따옴표가 들어 있는데 escape하지 않은 경우 발생한다. 이름에 따옴표가 들어가는 영문 이름(O'Brien 등)이나 동적 SQL을 다룰 때 자주 마주친다.

 

본 글은 ORA-01756의 정확한 의미, 5가지 발생 원인, 작은따옴표 escape 방식('')과 q-quote 문법(q'[...]'), 동적 SQL에서 바인드 변수 활용, 인접 에러(ORA-00911·00904·00917)와의 차이까지 정리한다.

 

ORA-01756

이 글의 구성

 

01에러 메시지와 의미
02발생 원인 5가지
03재현 시나리오와 해결 코드
04q-quote 문법과 동적 SQL 권장 패턴
05인접 에러와의 차이
Q&A자주 묻는 질문 5가지

01 에러 메시지와 의미

항목 내용
에러 코드 ORA-01756
영문 quoted string not properly terminated
한국어 따옴표로 묶은 문자열의 종결이 부적합합니다
의미 작은따옴표로 시작한 리터럴이 닫는 따옴표 없이 끝났거나 내부 따옴표 미escape
발생 영역 SELECT·INSERT·UPDATE·동적 SQL·PL/SQL 리터럴 처리

💡 핵심 관찰 — 파서의 문자열 종료 인식

Oracle 파서는 첫 작은따옴표를 만나면 문자열 시작으로 인식하고, 다음 작은따옴표를 종료로 인식한다. 'O'Brien''O'로 첫 문자열이 끝나고, 그 뒤 Brien'은 알 수 없는 토큰이 되어 ORA-01756이 발생한다. 내부 작은따옴표는 두 개로 escape하거나 q-quote 문법을 사용해야 한다.


02 발생 원인 5가지

원인 1 — 작은따옴표 한 쪽만 입력

가장 단순한 오류. WHERE name = '홍길동처럼 닫는 따옴표를 빠뜨린 경우. 빠른 SQL 작성 중 자주 발생한다.

원인 2 — 내부 작은따옴표 escape 누락

이름·문구에 작은따옴표가 포함된 경우. 'O'Brien' 같은 문자열을 그대로 쓰면 파서가 'O'로 종료된 것으로 본다. 두 개의 작은따옴표('')로 escape해야 한다.

원인 3 — 문자열 안 줄바꿈

멀티라인 문자열을 일반 따옴표로 감싸면 도구·드라이버에 따라 파싱 실패가 발생할 수 있다. q-quote(q'[...]')는 줄바꿈을 그대로 허용한다.

원인 4 — 동적 SQL 따옴표 조합 실수

EXECUTE IMMEDIATE·DBMS_SQL로 동적 SQL을 조립할 때 따옴표 안에 따옴표를 또 넣어야 하는 복잡한 패턴이 발생한다. 'WHERE name = ''' || v_name || '''' 같은 코드는 가독성도 떨어지고 실수도 잦다. 바인드 변수로 해결한다.

원인 5 — 큰따옴표 vs 작은따옴표 혼동

다른 DB(MySQL·MSSQL 일부 모드)에서 큰따옴표를 문자열로 사용해온 개발자가 Oracle에서 같은 패턴을 쓰면 발생한다. Oracle은 큰따옴표를 식별자(컬럼·테이블) 전용으로만 인정한다.


03 재현 시나리오와 해결 코드

시나리오 1 — 닫는 따옴표 누락

-- ✗ 닫는 따옴표 없음
SELECT * FROM emp WHERE ename = 'SCOTT;
-- ORA-01756

-- ✓ 양쪽 따옴표
SELECT * FROM emp WHERE ename = 'SCOTT';

시나리오 2 — 내부 작은따옴표 escape

-- ✗ 내부 따옴표 escape 안 함
INSERT INTO people(name) VALUES ('O'Brien');
-- ORA-01756 (또는 ORA-00917)

-- ✓ 두 개 작은따옴표로 escape
INSERT INTO people(name) VALUES ('O''Brien');

-- ✓ q-quote 문법 (10g+)
INSERT INTO people(name) VALUES (q'[O'Brien]');

시나리오 3 — 동적 SQL 권장 패턴 (바인드 변수)

-- ✗ 따옴표 문자열 조립 (복잡·취약)
EXECUTE IMMEDIATE
  'UPDATE emp SET ename = ''' || v_name || ''' WHERE id = ' || v_id;

-- ✓ 바인드 변수 (SQL Injection 방어 + 가독성)
EXECUTE IMMEDIATE
  'UPDATE emp SET ename = :1 WHERE id = :2'
  USING v_name, v_id;

04 q-quote 문법과 동적 SQL 권장 패턴

q-quote 문법 (Oracle 10g+)

작은따옴표가 많은 긴 문자열·HTML·JSON·정규식 리터럴에 매우 유용하다.

-- 구분자 변형 가능 - [] <> {} ()
SELECT q'[O'Brien's book]'      FROM dual;
SELECT q'<She said "hi">'       FROM dual;
SELECT q'{path = 'C:\file'}'    FROM dual;
SELECT q'(JSON: {"a": "b"})'    FROM dual;

-- 임의 단일 문자도 구분자로 사용 가능
SELECT q'!O'Brien!' FROM dual;

-- 멀티라인 문자열 그대로 가능
SELECT q'[메모:
줄1
줄2]' FROM dual;

선택 가이드

  • 짧은 문자열·따옴표 1~2개: 일반 escape ('') 충분
  • 따옴표 다수·HTML·JSON·정규식: q-quote (q'[...]')
  • 동적 SQL: 바인드 변수 (USING) — SQL Injection 방어까지 동시 해결

ORA-01756 해결의 한 가지 큰 원칙 — 문자열 안에 작은따옴표가 들어가는 순간 escape를 먼저 결정한다. 두 개 따옴표든 q-quote든 바인드 변수든, 미리 정해두면 실수가 사라진다.

 

━ 동적 SQL은 바인드 변수 표준


05 인접 에러와의 차이

에러 코드 검사 대상 전형적 시나리오
ORA-01756 따옴표 문자열 종료 작은따옴표 누락·escape 미처리
ORA-00911 잘못된 문자 @·!·세미콜론 같은 특수문자
ORA-00904 잘못된 식별자 컬럼명 오타·예약어·대소문자
ORA-00917 콤마 누락 VALUES·SELECT 절 콤마
ORA-00984 컬럼 위치 오류 INSERT VALUES에 따옴표 없는 문자열

06 자주 묻는 질문 5가지

Q1q-quote와 따옴표 escape 중 어느 게 좋나

짧고 따옴표가 한두 개라면 일반 escape('')가 자연스럽고 호환성도 좋다. HTML·JSON·정규식 등 따옴표가 많거나 멀티라인이면 q-quote가 가독성과 오류 방지 측면에서 압도적으로 유리하다. 팀 코딩 컨벤션으로 정해 두면 좋다.

Q2동적 SQL에서 바인드 변수의 장점은

세 가지가 있다. 첫째, SQL Injection 방어. 둘째, 따옴표 escape 부담 없음. 셋째, Oracle이 SQL을 한 번만 hard parse하고 이후 soft parse로 재사용해 성능이 좋다. 동적 SQL은 항상 바인드 변수가 표준이다.

Q3줄바꿈이 포함된 문자열은 어떻게 처리하나

q-quote가 가장 깔끔하다. q'[줄1\n줄2]'처럼 줄바꿈을 그대로 포함할 수 있다. 또는 CHR(10)·CHR(13)으로 줄바꿈 코드를 명시적으로 결합할 수도 있다. 일반 따옴표로 멀티라인 작성 시 도구·드라이버 차이로 인한 파싱 실패가 발생할 수 있다.

Q4q-quote 구분자는 어떻게 고르나

권장 구분자는 짝이 있는 []·<>·{}·()다. 문자열 내용에 같은 구분자가 들어있지 않은 것을 선택하면 된다. 정규식·코드 조각은 보통 []가 안전하다. 임의 단일 문자(예: !)도 가능하지만 가독성 측면에서 짝 구분자가 더 좋다.

Q5다른 DB와 호환성을 위해 큰따옴표를 문자열로 쓸 수 없나

Oracle은 SQL 표준에 충실해 큰따옴표를 식별자 전용으로만 사용한다. 다른 DB에서 큰따옴표를 문자열로 허용하는 모드를 쓰던 코드를 Oracle로 옮길 때는 반드시 작은따옴표로 변환해야 한다. ANSI SQL 표준 자체가 작은따옴표만 문자열로 정의한다는 점에서 Oracle 쪽이 표준이다.


07 결론

ORA-01756은 가장 단순한 SQL 작성 실수에서 시작하지만, 동적 SQL·복잡한 문자열에서는 디버깅 시간을 많이 잡아먹는다. 해결의 핵심은 escape 전략을 미리 결정하는 것이다.

 

실무 원칙은 다음과 같다.

 

첫째, Oracle은 작은따옴표만 문자열 리터럴로 인정한다. 큰따옴표는 식별자 전용이다.

둘째, 짧은 문자열의 내부 따옴표는 두 개 작은따옴표('')로 escape한다.

셋째, 따옴표·줄바꿈이 많은 문자열은 q-quote 문법(q'[...]')을 사용한다.

넷째, 동적 SQL은 따옴표 문자열 조립이 아닌 바인드 변수(USING)를 사용한다. SQL Injection 방어와 성능 모두 유리하다.

다섯째, 팀 코딩 컨벤션으로 escape 방식을 통일한다. 동일 모듈 안에서 q-quote·''·바인드 변수가 섞이면 가독성이 떨어진다.

✅ ORA-01756 트러블슈팅 체크리스트

 

01작은따옴표 양쪽 짝 확인 — 시작·종료 따옴표 개수 일치
02내부 작은따옴표는 두 개로 escape ('O''Brien')
03따옴표·줄바꿈 많으면 q-quote 사용 (q'[...]')
04동적 SQL은 EXECUTE IMMEDIATE + USING 바인드 변수
05큰따옴표(식별자) vs 작은따옴표(리터럴) 절대 혼동 X
06팀 코딩 컨벤션으로 escape 방식 통일
07SQL Injection 방어가 필요한 모든 입력은 바인드 변수 우선

본 글은 Oracle Database 에러 ORA-01756의 일반적 원인과 해결 방법을 정리한 자료다. 운영 환경 적용 전 테스트 환경에서 충분히 검증한다.

 

#ORA01756 #quotedStringNotProperlyTerminated #오라클에러 #작은따옴표 #qquote #escape #동적SQL #바인드변수 #SQL인젝션 #멀티라인문자열 #ORA00911 #ORA00904 #ORA00917 #ORA00984 #SQL디버깅

반응형

댓글