프로시저는 SQL 문을 저장하고 실행하는 데 사용되는 일련의 작업을 포함하는 데이터베이스 오브젝트입니다. 보통 정적 SQL 문을 사용하여 프로시저를 작성하고 호출합니다. 그러나 때로는 동적 SQL 문을 프로시저에서 실행해야 할 때가 있습니다. 동적 SQL 문은 실행 시에 동적으로 생성되는 SQL 문입니다. 이번 글에서는 프로시저 호출 시 동적 SQL 쿼리를 사용하는 방법에 대해 알아보겠습니다.
1. 프로시저 내에서 동적 SQL 쿼리 작성하기
프로시저 내에서 동적 SQL 쿼리를 작성하려면 VARCHAR2(또는 NVARCHAR2) 타입의 변수를 선언하고 동적 SQL 문을 해당 변수에 할당해야 합니다. 이 변수를 사용하여 프로시저에서 동적으로 생성된 SQL 문을 실행할 수 있습니다.
CREATE OR REPLACE PROCEDURE execute_dynamic_sql AS
query VARCHAR2(4000); -- 동적 SQL을 저장할 변수 선언
BEGIN
-- 동적 SQL 쿼리 작성
query := 'SELECT * FROM employees WHERE department_id = 10';
-- 동적 SQL 실행
EXECUTE IMMEDIATE query;
END;
/
위의 예제에서는 execute_dynamic_sql
이라는 이름의 프로시저를 생성합니다. query
변수를 선언하고, 동적 SQL 쿼리를 할당합니다. 그런 다음 EXECUTE IMMEDIATE
문을 사용하여 동적 SQL 문을 실행합니다.
2. 바인드 변수 사용하기
동적 SQL 쿼리에서는 사용자 입력이나 변수 값을 동적으로 포함해야 할 수도 있습니다. 이 경우에는 바인드 변수를 사용하여 SQL 문에서 변수 값을 설정할 수 있습니다. 바인드 변수는 :
을 접두사로 사용하여 표시됩니다.
CREATE OR REPLACE PROCEDURE execute_dynamic_sql_with_bind_var(input_value NUMBER) AS
query VARCHAR2(4000);
BEGIN
query := 'SELECT * FROM employees WHERE salary > :input_value';
-- 바인드 변수 설정 및 동적 SQL 실행
EXECUTE IMMEDIATE query USING input_value;
END;
/
위의 예제에서는 execute_dynamic_sql_with_bind_var
라는 이름의 프로시저를 생성합니다. query
변수에 동적 SQL 쿼리를 할당하고, 바인드 변수 :input_value
를 사용하여 변수 값을 동적으로 설정합니다. 이후 EXECUTE IMMEDIATE
문에서 USING
절을 사용하여 바인드 변수 값을 전달합니다.
3. 주의사항
동적 SQL을 사용할 때 몇 가지 주의사항이 있습니다.
- 보안: 동적 SQL을 사용할 때는 사용자 입력을 적절히 검증하고 이를 사용하여 동적 SQL을 생성할 때 SQL 인젝션 공격에 노출될 수 있는지 확인해야 합니다.
- 성능: 동적 SQL을 사용하면 SQL 문을 파싱, 최적화 및 실행해야 하므로 성능에 영향을 줄 수 있습니다. 가능하면 정적 SQL을 사용하는 것이 좋습니다.
- 코드 가독성: 동적 SQL을 사용하면 코드의 가독성이 저하될 수 있습니다. 따라서 동적 SQL을 적절하게 사용해야 합니다.
참고 자료
- Oracle Database PL/SQL Language Reference (https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/)