⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Prepared Statements

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;