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;