Предзаготовленные запросы
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;
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/query_syntax/prepared_statements.html