跳到主要内容

预处理语句

Goose 支持预处理语句:参数会在查询执行时被替换。 这可以提升可读性,也有助于防止 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>

自增位置参数:?

Goose 支持在预处理语句中使用自增索引参数, 即参数在查询中的位置与其在执行语句中的位置一一对应。 例如:

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

Goose 还支持命名参数,即使用 $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;