Spec-Zone.ru › DuckDB

Предзаготовленные запросы

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API