预处理语句
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;