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