DuckDB 支持预编译语句,其中参数在查询执行时被替换。 这可以提高可读性,并且有助于防止 SQL 注入。
Syntax
在预处理语句中表示参数有三种语法:
自动递增的 (?
),
位置的 ($1
),
和命名的 ($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;