⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
预处理语句

DuckDB 支持预处理语句,其中参数在查询执行时被替换。这可以提高可读性,并有助于防止SQL 注入

语法

预处理语句中有三种表示参数的语法:自增参数(?)、位置参数($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;