Zum Inhalt springen

Prepared Statements

DuckDB unterstützt Prepared Statements, bei denen Parameter beim Ausführen der Abfrage eingesetzt werden. Das verbessert die Lesbarkeit und hilft, SQL-Injections zu verhindern.

Syntax

Es gibt drei Schreibweisen für Parameter in Prepared Statements: auto-inkrementiert (?), positional ($1) und benannt ($param). Nicht alle Clients unterstützen alle Schreibweisen; der JDBC-Client unterstützt in Prepared Statements beispielsweise nur auto-inkrementierte Parameter.

Beispieldatensatz

Im Folgenden stellen wir die drei Schreibweisen vor und veranschaulichen sie anhand der folgenden Tabelle.

CREATE TABLE person (name VARCHAR, age BIGINT);
INSERT INTO person VALUES ('Alice', 37), ('Ana', 35), ('Bob', 41), ('Bea', 25);

In unserer Beispielabfrage suchen wir Personen, deren Name mit B beginnt und die mindestens 40 Jahre alt sind. Das liefert eine einzelne Zeile <'Bob', 41>.

Auto-inkrementierte Parameter: ?

DuckDB unterstützt Prepared Statements mit auto-inkrementierter Indizierung, d. h. die Position der Parameter in der Abfrage entspricht ihrer Position in der Ausführungsanweisung. Zum Beispiel:

PREPARE query_person AS
SELECT *
FROM person
WHERE starts_with(name, ?)
AND age >= ?;

Im CLI-Client wird die Anweisung wie folgt ausgeführt.

EXECUTE query_person('B', 40);

Positionale Parameter: $1

Prepared Statements können positionale Parameter verwenden, die mit einer ganzen Zahl bezeichnet werden ($1, $2). Zum Beispiel:

PREPARE query_person AS
SELECT *
FROM person
WHERE starts_with(name, $2)
AND age >= $1;

Im CLI-Client wird die Anweisung wie folgt ausgeführt. Der erste Parameter entspricht $1, der zweite $2 usw.

EXECUTE query_person(40, 'B');

Benannte Parameter: $parameter

DuckDB unterstützt außerdem benannte Parameter, die mit $parameter_name bezeichnet werden. Zum Beispiel:

PREPARE query_person AS
SELECT *
FROM person
WHERE starts_with(name, $name_start_letter)
AND age >= $minimum_age;

Im CLI-Client wird die Anweisung wie folgt ausgeführt.

EXECUTE query_person(name_start_letter := 'B', minimum_age := 40);

Prepared Statements entfernen: DEALLOCATE

Um ein Prepared Statement zu entfernen, verwenden Sie die Anweisung DEALLOCATE:

DEALLOCATE query_person;

Alternativ:

DEALLOCATE PREPARE query_person;