준비된 문

준비된 문 (Prepared Statements)

같은 쿼리를 매번 다른 값으로 반복 실행해야 하는 상황, 많이 겪으시죠? DuckDB는 쿼리를 실행할 때 매개변수(parameter)를 치환하는 준비된 문(prepared statements)을 지원해요. 이는 가독성을 높여주고, SQL 인젝션을 방지하는 데도 유용해요.

출처: DuckDB 공식 문서 — Prepared Statements

문법 (Syntax)

준비된 문에서 매개변수를 나타내는 문법은 세 가지가 있어요:

  • 자동 증가 (auto-incremented): ?
  • 위치 기반 (positional): $1
  • 이름 기반 (named): $param

모든 클라이언트가 이러한 문법을 전부 지원하지는 않는다는 점을 참고하세요. 예를 들어 JDBC 클라이언트는 준비된 문에서 자동 증가 매개변수만 지원해요.

예제 데이터셋

이제 세 가지 문법을 소개하고 다음 테이블을 사용한 예제로 설명할게요.

CREATE TABLE person (name VARCHAR, age BIGINT);
INSERT INTO person VALUES ('Alice', 37), ('Ana', 35), ('Bob', 41), ('Bea', 25);

예제 쿼리에서는 이름이 B로 시작하고 나이가 최소 40세인 사람을 찾아볼게요. 이는 단일 행 <'Bob', 41>을 반환해요.

자동 증가 매개변수: ?

DuckDB는 자동 증가 인덱싱을 사용하는 준비된 문을 지원해요. 즉, 쿼리에서 매개변수의 위치가 실행 문에서의 위치에 대응한다는 뜻이에요. 예를 들어:

PREPARE query_person AS
    SELECT *
    FROM person
    WHERE starts_with(name, ?)
      AND age >= ?;

CLI 클라이언트를 사용하면 문이 다음과 같이 실행돼요.

EXECUTE query_person('B', 40);

위치 기반 매개변수: $1

준비된 문은 위치 기반 매개변수를 사용할 수 있으며, 여기서 매개변수는 정수($1, $2)로 표시돼요. 예를 들어:

PREPARE query_person AS
    SELECT *
    FROM person
    WHERE starts_with(name, $2)
      AND age >= $1;

CLI 클라이언트를 사용하면 문이 다음과 같이 실행돼요. 첫 번째 매개변수가 $1에, 두 번째가 $2에 대응한다는 점을 참고하세요.

EXECUTE query_person(40, 'B');

이름 기반 매개변수: $parameter

DuckDB는 또한 매개변수가 $parameter_name으로 표시되는 이름 기반 매개변수를 지원해요. 예를 들어:

PREPARE query_person AS
    SELECT *
    FROM person
    WHERE starts_with(name, $name_start_letter)
      AND age >= $minimum_age;

CLI 클라이언트를 사용하면 문이 다음과 같이 실행돼요.

EXECUTE query_person(name_start_letter := 'B', minimum_age := 40);

준비된 문 제거: DEALLOCATE

준비된 문을 제거하려면 DEALLOCATE 문을 사용해요:

DEALLOCATE query_person;

다음과 같이 사용할 수도 있어요:

DEALLOCATE PREPARE query_person;

더 알아보기 (Learn more)