2024. 2. 4. 11:44ㆍDBMS/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을 사용하여 쿼리를 생성하고 실행할 수 있다.
'DBMS > ORACLE Admin' 카테고리의 다른 글
PFILE(Parameter File)에서 SPFILE(System Parameter File)을 생성하는 이유 (0) | 2024.02.10 |
---|---|
DATABASE DDL 구문 (0) | 2024.02.10 |
ORACLE ARCHITECTURE (0) | 2024.02.04 |
데이터 베이스 설계 (0) | 2024.02.04 |
객체지향형 DB 구성 & 객체 관계형 DBMS(ORDBMS) (0) | 2024.02.03 |