개요
동적 쿼리(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
복사