기술 정보
home
채널 소개
home

Dynamic SQL (동적 쿼리문)

문서 유형
기술 정보
분야
관리/환경설정
키워드
dynamicSQL
tbsql
바인드변수
dynamic
적용 제품 버전
7FS02PS

개요

동적 쿼리(Dynamic SQL)란 실행 시점에 쿼리 문장이 생성되어 실행되는 형태의 SQL 문을 말합니다.
쿼리 문장이 고정되어 있는 경우에는 정적 쿼리(Static SQL), 실행 시마다 쿼리 문장이 달라지는 경우에는 동적 쿼리(Dynamic SQL)로 분류할 수 있습니다.
대부분 동적쿼리를 사용할때에는 쿼리문을 문자열 형태로 가지고 있다가, 실행할때마다 텍스트 쿼리문장을 바꿔서 실행하는 방식을 사용합니다.
대부분의 어플리케이션(App)에서 쿼리를 사용할 때 문자열(String)로 구성해 런타임(RUNTIME) 시점에 전달하고 실행하기 때문에, Dynamic SQL 방식을 사용하게 됩니다.

동적 쿼리(Dynamic SQL)가 필요한 경우는 아래와 같습니다.

1. 컴파일 시에 SQL문장을 확정할 수 없는 경우

동적쿼리가 가장 많이 실행되는 시점은 실행시점에 따라 WHERE절에 조건이 달라질 때입니다. 컴파일 시에 SQL문장이 확정될 수 없는경우 동적쿼리를 사용합니다.

2. PL/SQL 블록상에서 DDL문을 실행할 경우

PL/SQL의 익명블록이나, 함수, 프로시저, 패키지본문에서는 DDL문을 실행할 수 없습니다. 하지만 동적 SQL을 사용하면 DDL문을 실행시킬 수 있습니다.

3. PL/SQL 블록 상에서 ALTER SYSTEM/SESSION 명령어를 실행해야 할 경우

DDL문과 마찬가지로 PL/SQL에서 ALTER SYSTEM / SESSION명령어를 직접 사용할 수 없으나 동적SQL을 사용하면 사용이 가능합니다.

방법

사용 예시

CREATE OR REPLACE FUNCTION FUNC1( W_PRODUCT_ID IN NUMBER ) RETURN VARCHAR2 IS PRODUCT_NAME VARCHAR2(100); BEGIN EXECUTE IMMEDIATE 'SELECT PRODUCT_NAME FROM PRODUCTS WHERE PRODUCT_ID = '|| W_PRODUCT_ID INTO PRODUCT_NAME; RETURN PRODUCT_NAME; END;
SQL
복사
여기서 SQL 문장이 문자열로 생성되고 실행 시점(runtime)에 만들어집니다.
즉, W_PRODUCT_ID 값에 따라 최종 SQL 문장이 달라지므로 해당 SQL문은 Dynamic SQL(동적 쿼리문)입니다.

실행문

SELECT FUNC1(1) FROM DUAL
SQL
복사

대안

앞 예제는 SQL Injection 위험이 있으므로, 아래의 바인드 변수 방식의 동적 쿼리가 더 안전합니다.
EXECUTE IMMEDIATE 'SELECT PRODUCT_NAME FROM PRODUCTS WHERE PRODUCT_ID = :id' INTO PRODUCT_NAME USING W_PRODUCT_ID;
SQL
복사