Binden von Variablen¶
Anwendungen können Daten von Benutzern annehmen und diese Daten in SQL-Anweisungen verwenden. So kann eine Anwendung den Benutzer beispielsweise auffordern, Kontaktinformationen wie Adresse und Telefonnummer einzugeben.
Um diese Benutzereingabe in einer SQL-Anweisung anzugeben, können Sie programmgesteuert eine Zeichenfolge für die SQL-Anweisung konstruieren, indem Sie die Benutzereingabe mit den anderen Teilen der Anweisung verketten. Alternativ können Sie auch Bindungsvariablen verwenden. Wenn Sie Bindungsvariablen verwenden, fügen Sie einen oder mehrere Platzhalter in den Text der SQL-Anweisung ein, und dann geben Sie für jeden Platzhalter die Variable (den zu verwendenden Wert) an. Bindungsvariablen können Angriffe durch Einschleusen von SQL-Befehlen verhindern, wenn Sie SQL-Anweisungen anhand von Benutzereingaben konstruieren.
Mit Snowflake können Sie Bindungsvariablen auf folgende Weise verwenden:
Aufrufe von APIs, die von Snowflake-Treibern unterstützt werden.
Prozeduraler Code, der in Snowflake Scripting geschrieben ist.
Anwendungen, die die Snowflake SQL-REST-API verwenden.
Übersicht¶
Mit Bindungsvariablen ersetzen Sie in SQL-Anweisungen Literale durch Platzhalter. Die folgende SQL-Anweisung verwendet beispielsweise Literale für die eingefügten Werte:
INSERT INTO t (c1, c2) VALUES (1, 'Test string');
Die folgende SQL-Anweisung verwendet Platzhalter für die eingefügten Werte:
INSERT INTO t (c1, c2) VALUES (?, ?);
Ihr Anwendungscode bindet mit jedem Platzhalter Daten in der SQL-Anweisung. Die jeweilige Technik zum Binden von Daten mit Platzhaltern hängt von der Programmiersprache ab. Auch die Syntax des Platzhalters variiert je nach Programmiersprache. Es ist entweder ?
, :<varname>
oder %<varname>
.
Verwenden von Bindungsvariablen mit Treibern¶
Mit Snowflake-Treibern können Sie Anwendungen schreiben, die Operationen in Snowflake ausführen. Die Treiber unterstützen Programmiersprachen wie Go, Java und Python. Weitere Informationen zur Verwendung von Bindungsvariablen in einer Anwendung für einen bestimmten Treiber finden Sie unter dem Link des jeweiligen Treibers:
Bemerkung
Der PHP-Treiber bietet keine Unterstützung von Bindungsvariablen.
Verwenden von Bindungsvariablen mit Snowflake Scripting¶
Sie können Snowflake Scripting verwenden, um prozeduralen Code zu erstellen, der SQL ausführt, wie Codeblöcke und gespeicherte Prozeduren. Stellen Sie dem Variablennamen einen Doppelpunkt voran. Die folgende INSERT-Anweisung gibt zum Beispiel eine Bindungsvariable mit dem Namen variable1
an:
INSERT INTO t (c1) VALUES (:variable1)
Weitere Informationen zur Verwendung von Bindungsvariablen in Snowflake Scripting finden Sie unter Verwenden einer Variablen in einer SQL-Anweisung (Bindung).
Verwenden von Bindungsvariablen mit der SQL-API¶
Sie können die Snowflake SQL-REST-API verwenden, um auf Daten in einer Snowflake-Datenbank zuzugreifen und diese Daten zu aktualisieren. Sie können Anwendungen erstellen, die die SQL-API verwenden, um SQL-Anweisungen zu übermitteln und Bereitstellungen zu verwalten.
Wenn Sie eine Anforderung übermitteln, die eine SQL-Anweisung ausführt, können Sie für Werte in der Anweisung Bindungsvariablen verwenden. Weitere Informationen dazu finden Sie unter Verwenden von Bindungsvariablen in einer Anweisung.
Binden von Arrays von Werten an Variablen¶
Sie können ein Array von Werten an Variablen in SQL-Anweisungen binden. Mit dieser Technik können Sie die Performance verbessern, indem Sie mehrere Zeilen in einen einzigen Batch einfügen, wodurch Netzwerk-Roundtrips und Kompilierungen vermieden werden. Die Verwendung einer Array-Bindung wird auch als „Masseneinfügen“ (Bulk Insert) oder „Batcheinfügung“ (Batch Insert) bezeichnet.
Bemerkung
Snowflake unterstützt noch weitere Methoden zum Laden von Daten, die anstelle der Verwendung von Array-Bindungen empfohlen werden. Weitere Informationen dazu finden Sie unter Daten in Snowflake laden und Befehle zum Laden und Entladen von Daten.
Im Folgenden finden Sie ein Beispiel für eine Array-Bindung in Python-Code:
conn = snowflake.connector.connect( ... ) rows_to_insert = [('milk', 2), ('apple', 3), ('egg', 2)] conn.cursor().executemany( "insert into grocery (item, quantity) values (?, ?)", rows_to_insert)
Im diesem Beispiel wird die folgende Bindungsliste angegeben: [('milk', 2), ('apple', 3), ('egg', 2)]
. Die Art und Weise, wie eine Anwendung eine Bindungsliste angibt, hängt von der Programmiersprache ab.
Dieser Code fügt drei Zeilen in die Tabelle ein:
+-------+----+ | C1 | C2 | |-------+----| | milk | 2 | | apple | 3 | | egg | 2 | +-------+----+
Weitere Informationen zur Verwendung von Array-Bindungen in einer Anwendung für einen bestimmten Treiber finden Sie unter dem Link des jeweiligen Treibers:
Bemerkung
Der PHP-Treiber bietet keine Unterstützung von Array-Bindungen.
Einschränkungen von Array-Bindungen¶
Die folgenden Einschränkungen gelten für Array-Bindungen:
Array-Bindungsvariablen können nur in INSERT INTO … VALUES-Anweisungen enthalten sein.
Die VALUES-Klausel muss eine einzeilige Liste von Bindungsvariablen sein. Die folgende VALUES-Klausel wird beispielsweise nicht unterstützt:
VALUES (?,?), (?,?)
Einfügen mehrerer Zeilen ohne Verwendung von Array-Bindungen¶
Eine INSERT-Anweisung kann Bindungsvariablen verwenden, um mehrere Zeilen einzufügen, ohne eine Array-Bindung zu verwenden. Im folgenden Beispiel werden Werte in zwei Zeilen eingegeben, wobei aber keine Array-Bindung verwendet wird.
INSERT INTO t VALUES (?,?), (?,?);
Ihre Anwendung kann eine Bindungsliste angeben, die in der Reihenfolge der Platzhalter den folgenden Werten entspricht: [1,'String1',2,'String2']
. Da die VALUES-Klausel mehr als eine Zeile angibt, fügt die Anweisung nur die genaue Anzahl der Werte ein (im Beispiel vier) und nicht eine dynamische Anzahl von Zeilen.
Verwenden von Bindungsvariablen mit semistrukturierten Daten¶
Um Variablen mit semistrukturierten Daten zu binden, binden Sie die Variable als Zeichenfolgetyp (String) und verwenden Funktionen wie PARSE_JSON oder ARRAY_CONSTRUCT.
Im folgenden Beispiel wird eine Tabelle mit einer VARIANT-Spalte erstellt und dann die Funktion PARSE_JSON aufgerufen, um semistrukturierte Daten mit einer Bindungsvariablen in die Tabelle einzufügen:
CREATE TABLE t (a VARIANT); -- Code that supplies a bind value for ? of '{'a': 'abc', 'x': 'xyz'}' INSERT INTO t SELECT PARSE_JSON(a) FROM VALUES (?);
Im folgenden Beispiel wird die Tabelle abgefragt:
SELECT * FROM t;
Die Abfrage gibt die folgende Ausgabe zurück:
+---------------+ | A | |---------------| | { | | "a": "abc", | | "x": "xyz" | | } | +---------------+
Die folgende Anweisung ruft die Funktion ARRAY_CONSTRUCT auf, um ein Array von semistrukturierten Daten mittels einer Bindungsvariablen in eine VARIANT-Spalte einzufügen:
INSERT INTO t SELECT ARRAY_CONSTRUCT(column1) FROM VALUES (?);
In beiden Beispiele kann eine einzelne Zeile eingefügt werden, oder es kann eine Array-Bindung verwendet werden, um mehrere Zeilen im Batch einzufügen. Sie können diese Technik verwenden, um jede Art von semistrukturierten Daten einzufügen, die in einer VARIANT-Spalte gültig ist.