Static SQL, Dynamic SQL

2024. 2. 4. 11:44DBMS/ORACLE Admin

반응형

정적 SQL은 미리 컴파일되고 실행 전에 실행 계획이 결정되는 SQL 쿼리를 의미한다. 데이터베이스 시스템이 쿼리를 처리하기 전에 이미 실행 계획을 알고 있기 때문에 실행 중에 계획이 변경되지 않음. 이것은 성능 측면에서 이점을 제공 하며 컴파일 시간에 오류를 감지할 수 있기 때문에 실행 전에 잠재적인 문제를 확인할 수 있다.

반면에 동적 SQL은 실행 중에 쿼리의 일부 또는 전체를 동적으로 생성하고 실행한다. 동적 SQL은 실행 중에 실행 계획이 결정되므로 실행 시간에 쿼리를 변경할 수 있다. 이는 유연성을 제공하지만 실행 시간에 최적의 실행 계획을 결정해야 하므로 일부 성능 오버헤드가 발생할 수 있다.

따라서 static SQL은 쿼리를 미리 정의하고 컴파일 시간에 실행 계획을 결정하여 정적 SQL을 사용하도록 하는 것을 의미한다.

 

- Dynamic SQL 이 필요한 경우

 

1. DDL 명령 수행시
   - 데이터 정의 언어 명령은 정적으로 미리 컴파일할 수 없는 경우가 많다. 특정 테이블을 드롭하고 다시 생성하는 경우 등이 해당됨 이때는 동적 SQL을 사용하여 실행 중에 적절한 DDL 명령을 생성하고 수행해야한다.

 

DECLARE
    v_table_name VARCHAR2(50) := 'example_table';
    v_ddl_query VARCHAR2(200);
BEGIN
    -- 테이블이 이미 존재하는지 확인
    SELECT COUNT(*)
    INTO   v_ddl_query
    FROM   user_tables
    WHERE  table_name = v_table_name;

    -- 테이블이 존재하면 드롭
    IF v_ddl_query > 0 THEN
        v_ddl_query := 'DROP TABLE ' || v_table_name;
        EXECUTE IMMEDIATE v_ddl_query;
        DBMS_OUTPUT.PUT_LINE('테이블이 드롭되었습니다.');
    END IF;

    -- 테이블 생성
    v_ddl_query := 'CREATE TABLE ' || v_table_name || ' (id NUMBER, name VARCHAR2(50))';
    EXECUTE IMMEDIATE v_ddl_query;
    DBMS_OUTPUT.PUT_LINE('테이블이 생성되었습니다.');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('에러가 발생했습니다: ' || SQLERRM);
END;
/



2. 명령어가 pl/sql 블록의 compile 단계가 아닌 call 단계에서 완성되는 경우:

   - 실행 시에 사용자 입력이나 조건에 따라 명령어가 동적으로 생성되어야 하는 경우 동적 SQL이 필요

 

DECLARE
    v_table_name VARCHAR2(50);
    v_column_name VARCHAR2(50);
    v_sql_query VARCHAR2(200);
    v_result NUMBER;
BEGIN
    -- 사용자로부터 테이블 이름과 컬럼 이름을 입력 받음
    v_table_name := 'employees';
    v_column_name := 'salary';

    -- 동적 SQL 쿼리 생성
    v_sql_query := 'SELECT COUNT(*) FROM ' || v_table_name || ' WHERE ' || v_column_name || ' > 50000';

    -- 동적 SQL 실행
    EXECUTE IMMEDIATE v_sql_query INTO v_result;

    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('결과: ' || v_result);
END;
/

 

 

 PL/SQL 블록이 컴파일되는 시점에서 입력 받는 값들을 알 수 없다. 그러나 실행(call) 단계에서 이 값들이 입력되면, 동적 SQL을 사용하여 쿼리를 생성하고 실행할 수 있다.



반응형