Verwenden von RESULTSETs¶
Unter diesem Thema wird erklärt, wie ein RESULTSET in Snowflake Scripting verwendet wird.
Einführung¶
In Snowflake Scripting ist ein RESULTSET ein SQL-Datentyp, der auf die Ergebnismenge einer Abfrage verweist.
Da ein RESULTSET nur ein Zeiger auf die Ergebnisse ist, müssen Sie eine der folgenden Möglichkeiten nutzen, um über das RESULTSET auf die Ergebnisse zuzugreifen:
Verwenden Sie die Syntax
TABLE(...), um die Ergebnisse in Form einer Tabelle abzurufen.Iterieren Sie über das RESULTSET mit einem Cursor.
Im Folgenden finden Sie Beispiele für beide Varianten.
Erläuterungen zum Unterschied zwischen Cursor und RESULTSET¶
Ein RESULTSET und ein Cursor bieten beide Zugang zum Resultset einer Abfrage. Diese Objekte unterscheiden sich jedoch in den folgenden Punkten:
Zeitpunkt, zu dem die Abfrage ausgeführt wird.
Bei einem Cursor wird die Abfrage ausgeführt, wenn Sie den Befehl OPEN auf dem Cursor ausführen.
Bei einem RESULTSET wird die Abfrage ausgeführt, wenn Sie die Abfrage dem RESULTSET zuweisen (entweder im Abschnitt DECLARE oder im BEGIN … END-Block).
Unterstützung für das Binden im Befehl OPEN.
Wenn Sie einen Cursor deklarieren, können Sie Bindungsparameter (
?-Zeichen) angeben. Wenn Sie später den Befehl OPEN ausführen, können Sie in der USING-Klausel Variablen an diese Parameter binden.RESULTSET bietet keine Unterstützung für den Befehl OPEN. Sie können jedoch Variablen in SQL-Befehlen binden, bevor Sie das Resultset zurückgeben.
Im Allgemeinen ist es einfacher, eine RESULTSET zu verwenden, wenn Sie eine Tabelle zurückgeben möchten, die das Resultset einer Abfrage enthält. Sie können jedoch auch eine Tabelle aus einem Snowflake Scripting-Block mit einem Cursor zurückgeben. Dazu können Sie den Cursor an RESULTSET_FROM_CURSOR(cursor) übergeben, um ein RESULTSET zurückzugeben, und dieses RESULTSET an TABLE(...) weitergeben. Siehe Zurückgeben einer Tabelle für einen Cursor.
Deklarieren eines RESULTSET¶
Sie können ein RESULTSET im Abschnitt DECLARE eines Blocks oder im Abschnitt BEGIN … END des Blocks deklarieren.
Verwenden Sie innerhalb des Abschnitts DECLARE die unter Syntax der RESULTSET-Deklaration beschriebene Syntax. Beispiel:
Innerhalb des BEGIN … END-Blocks ist die unter Syntax der RESULTSET-Zuweisung beschriebene Syntax zu verwenden. Beispiel:
Zuweisen einer Abfrage zu einem deklarierten RESULTSET¶
Um das Ergebnis einer Abfrage einem bereits deklarierten RESULTSET zuzuweisen, verwenden Sie die folgende Syntax:
Wobei:
resultset_nameDer Name der RESULTSET.
Der Name muss innerhalb des aktuellen Sichtbarkeitsbereichs eindeutig sein.
Der Name muss den Snowflake-Regeln für Bezeichner folgen (siehe unter Objektbezeichner).
ASYNCFührt die Abfrage als asynchronen untergeordneten Job aus.
queryDie Abfrage, die dem RESULTSET zugewiesen werden soll.
So ordnen Sie eine Abfrage einem RESULTSET zu:
So weisen Sie eine Abfrage einem RESULTSET zu und führen die Abfrage als asynchronen untergeordneten Job aus:
Um eine SQL-Zeichenfolge dynamisch für die Abfrage zu erstellen, setzen Sie query auf (EXECUTE IMMEDIATE string_of_sql). Beispiel:
Sie können zwar query für ein RESULTSET auf eine EXECUTE IMMEDIATE-Anweisung setzen, dies ist aber für einen Cursor nicht möglich.
Verwenden eines RESULTSET¶
Die Abfrage für ein RESULTSET wird ausgeführt, wenn das Objekt dieser Abfrage zugeordnet wird. Beispiel:
Wenn Sie ein RESULTSET deklarieren und die DEFAULT-Klausel auf eine Abfrage setzen, wird die Abfrage zu diesem Zeitpunkt ausgeführt.
Wenn Sie den Operator
:=verwenden, um eine Abfrage einem RESULTSET zuzuordnen, wird die Abfrage zu diesem Zeitpunkt ausgeführt.
Bemerkung
Da ein RESULTSET auf die Ergebnismenge einer Abfrage verweist (und nicht die Ergebnismenge einer Abfrage enthält), ist ein RESULTSET nur so lange gültig, wie die Abfrageergebnisse zwischengespeichert werden (normalerweise 24 Stunden). Weitere Einzelheiten zur Zwischenspeicherung von Abfrageergebnissen finden Sie unter Verwenden von persistent gespeicherten Abfrageergebnissen.
Sobald die Abfrage ausgeführt wurde, können Sie mithilfe eines Cursors auf die Ergebnisse zugreifen. Sie können die Ergebnisse auch in Form einer Tabelle aus einer gespeicherten Prozedur zurückgeben.
Verwenden eines Cursors für den Zugriff auf Daten eines RESULTSET¶
Um einen Cursor für den Zugriff auf die Daten eines RESULTSET zu verwenden, deklarieren Sie den Cursor auf dem Objekt. Beispiel:
Wenn Sie einen Cursors auf einem RESULTSET deklarieren, erhält der Cursor Zugriff auf die Daten, die sich bereits im RESULTSET befinden. Wenn der OPEN-Befehl auf dem Cursor ausgeführt wird, führt dies nicht zur erneuten Ausführung der Abfrage des RESULTSET.
Sie können dann den Cursor öffnen und den Cursor verwenden, um die Daten abzurufen.
Bemerkung
Wenn die Ergebnisse GEOGRAPHY-Werte enthalten, müssen Sie diese Werte erst in den Typ GEOGRAPHY umwandeln, bevor Sie sie an Funktionen übergeben, die Werte vom Typ GEOGRAPHY als Eingabe erwarten. Siehe Verwenden eines Cursors zum Abrufen eines GEOGRAPHY-Werts.
Zurückgeben eines RESULTSET als Tabelle¶
Wenn Sie die Ergebnisse zurückgeben möchten, auf die RESULTSET zeigt, übergeben Sie RESULTSET an TABLE(...). Beispiel:
Dies ist vergleichbar mit der Art und Weise, wie TABLE(...) mit Tabellenfunktionen verwendet wird (wie z. B. RESULT_SCAN)
Wenn Sie wie im Beispiel gezeigt eine gespeicherte Prozedur schreiben, die eine Tabelle zurückgibt, müssen Sie die gespeicherte Prozedur so deklarieren, dass sie eine Tabelle zurückgibt.
Bemerkung
Derzeit wird die Syntax TABLE(resultset_name) nur in der RETURN-Anweisung unterstützt.
Auch wenn Sie einen Cursor verwendet haben, um Zeilen aus dem RESULTSET abzurufen, enthält die von TABLE(resultset_name) zurückgegebene Tabelle immer noch alle Zeilen (nicht nur die Zeilen, die beim internen Zeilenzeiger des Cursors beginnen).
Einschränkungen des Datentyps RESULTSET¶
Obwohl RESULTSET ein Datentyp ist, unterstützt Snowflake Folgendes noch nicht:
Deklarieren einer Spalte vom Typ RESULTSET
Deklarieren eines Parameters vom Typ RESULTSET
Deklarieren des Rückgabetyps einer gespeicherten Prozedur als RESULTSET
Snowflake unterstützt RESULTSET nur innerhalb von Snowflake Scripting.
Darüber hinaus können Sie RESULTSET nicht direkt als Tabelle verwenden. Beispielsweise wird Folgendes nicht unterstützt:
Beispiele für die Verwendung eines RESULTSET¶
Die folgenden Abschnitte enthalten Beispiele für die Verwendung eines RESULTSET:
Beispiel: Zurückgeben einer Tabelle aus einer gespeicherten Prozedur
Beispiel: Deklarieren einer RESULTSET-Variable ohne DEFAULT-Klausel
Beispiele für die Verwendung des Schlüsselworts ASYNC zur Ausführung von Abfragen, die für RESULTSETs als asynchrone untergeordnete Aufträge angegeben wurden, finden Sie unter Beispiele für die Verwendung asynchroner untergeordneter Aufträge.
Einrichten der Daten für die Beispiele¶
In vielen der unten aufgeführten Beispiele werden die folgenden Tabellen und Daten verwendet:
Beispiel: Zurückgeben einer Tabelle aus einer gespeicherten Prozedur¶
Der folgende Code zeigt, wie ein RESULTSET deklariert wird und wie die Ergebnisse zurückgegeben werden, auf die das RESULTSET zeigt. Die RETURNS-Klausel im CREATE PROCEDURE-Befehl deklariert, dass die gespeicherte Prozedur eine Tabelle zurückgibt, die eine Spalte vom Typ INTEGER enthält.
Die RETURN-Anweisung innerhalb des Blocks verwendet die TABLE(...)-Syntax, um die Ergebnisse in Form einer Tabelle zurückzugeben.
Erstellen Sie die gespeicherte Prozedur:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Rufen Sie die gespeicherte Prozedur auf:
Sie können den Pipe-Operator (->>) verwenden, um die Ergebnisse des Aufrufs der gespeicherten Prozedur zu verarbeiten:
Sie können auch die Funktion RESULT_SCAN verwenden, um die Ergebnisse nach Aufruf der gespeicherten Prozedur zu verarbeiten:
Beispiel: Dynamisches Erstellen der SQL-Anweisung¶
Sie können den SQL-Code dynamisch konstruieren. Im folgenden Beispiel wird dieselbe Abfrage ausgeführt wie in der vorherigen gespeicherten Prozedur, allerdings wird dabei eine dynamisch erstellte SQL-Anweisung verwendet:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Um das Beispiel auszuführen, rufen Sie die gespeicherte Prozedur auf und übergeben den Tabellennamen:
Beispiel: Deklarieren einer RESULTSET-Variable ohne DEFAULT-Klausel¶
Der folgende Code zeigt, wie ein RESULTSET ohne DEFAULT-Klausel deklariert wird (d. h. ohne Zuordnen einer Abfrage zu dem RESULTSET), und wie dann später das RESULTSET mit einer Abfrage verknüpft wird.
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Um das Beispiel auszuführen, rufen Sie die gespeicherte Prozedur auf:
Beispiel: Verwenden eines CURSOR mit einem RESULTSET¶
Der folgende Code zeigt, wie ein Cursor verwendet wird, um über die Zeilen in einem RESULTSET zu iterieren:
Erstellen Sie die gespeicherte Prozedur:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Rufen Sie die gespeicherte Prozedur auf, und die Ergebnisse addieren die Werte für a in der Tabelle (1 + 2):
Weitere Beispiele für die Verwendung eines RESULTSET¶
Hier sind weitere Beispiele, die ein RESULTSET verwenden:
Verwenden einer RESULTSET-basierten FOR-Schleife
Das folgende Beispiel zeigt, wie Sie eine FOR-Schleife verwenden, die über ein RESULTSET iteriert.
Zurückgeben einer Tabelle für einen Cursor
Das folgende Beispiel zeigt, wie Sie einen Cursor verwenden, um eine Tabelle mit Daten in einem RESULTSET zurückzugeben.
Tabellendaten mit Benutzereingaben aktualisieren
Dieses Beispiel zeigt Ihnen, wie Sie Bindungsvariablen auf der Grundlage von Benutzereingaben verwenden, um Daten in einer Tabelle zu aktualisieren. Es verwendet eine FOR-Schleife mit bedingter Logik, um über die Zeilen in einem RESULTSET zu iterieren.
-
Dieses Beispiel zeigt Ihnen, wie Sie mit RESULTSET-Daten sammeln und diese Daten in eine Tabelle einfügen können, um historische Trends zu verfolgen.