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:

    DECLARE
      ...
      res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
    
    Copy
  • Innerhalb des BEGIN … END-Blocks ist die unter Syntax der RESULTSET-Zuweisung beschriebene Syntax zu verwenden. Beispiel:

    BEGIN
      ...
      LET res RESULTSET := (SELECT col1 FROM mytable ORDER BY col1);
    
    Copy

Zuweisen einer Abfrage zu einem deklarierten RESULTSET

Um das Ergebnis einer Abfrage einem bereits deklarierten RESULTSET zuzuweisen, verwenden Sie die folgende Syntax:

<resultset_name> := [ ASYNC ] ( <query> ) ;
Copy

Wobei:

resultset_name

Der 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).

ASYNC

Führt die Abfrage als asynchronen untergeordneten Job aus.

Die Abfrage kann jede gültige SQL-Anweisung sein, einschließlich SELECT-Anweisungen und DML-Anweisungen wie INSERT oder UPDATE.

Wenn dieses Schlüsselwort weggelassen wird, führt die gespeicherte Prozedur die untergeordneten Jobs nacheinander aus und jeder untergeordnete Job wartet, bis der laufende untergeordnete Job beendet ist, bevor er beginnt.

Mit diesem Schlüsselwort können Sie mehrere untergeordnete Jobs gleichzeitig ausführen, was die Effizienz steigern und die Gesamtlaufzeit verkürzen kann.

Sie können AWAIT- und CANCEL-Anweisungen verwenden, um asynchrone untergeordnete Jobs für ein RESULTSET zu verwalten.

query

Die Abfrage, die dem RESULTSET zugewiesen werden soll.

So ordnen Sie eine Abfrage einem RESULTSET zu:

DECLARE
  res RESULTSET;
BEGIN
  res := (SELECT col1 FROM mytable ORDER BY col1);
  ...
Copy

So weisen Sie eine Abfrage einem RESULTSET zu und führen die Abfrage als asynchronen untergeordneten Job aus:

DECLARE
  res RESULTSET;
BEGIN
  res := ASYNC (SELECT col1 FROM mytable ORDER BY col1);
  ...
Copy

Um eine SQL-Zeichenfolge dynamisch für die Abfrage zu erstellen, setzen Sie query auf (EXECUTE IMMEDIATE string_of_sql). Beispiel:

DECLARE
  res RESULTSET;
  col_name VARCHAR;
  select_statement VARCHAR;
BEGIN
  col_name := 'col1';
  select_statement := 'SELECT ' || col_name || ' FROM mytable';
  res := (EXECUTE IMMEDIATE :select_statement);
  RETURN TABLE(res);
END;
Copy

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:

DECLARE
  ...
  res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
  c1 CURSOR FOR res;
Copy

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:

CREATE PROCEDURE f()
  RETURNS TABLE(column_1 INTEGER, column_2 VARCHAR)
  ...
    RETURN TABLE(my_resultset_1);
  ...
Copy

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:

SELECT * FROM my_result_set;
Copy

Beispiele für die Verwendung eines RESULTSET

Die folgenden Abschnitte enthalten Beispiele für die Verwendung eines RESULTSET:

Einrichten der Daten für die Beispiele

In vielen der unten aufgeführten Beispiele werden die folgenden Tabellen und Daten verwendet:

CREATE OR REPLACE TABLE t001 (a INTEGER, b VARCHAR);
INSERT INTO t001 (a, b) VALUES
  (1, 'row1'),
  (2, 'row2');
Copy

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:

CREATE OR REPLACE PROCEDURE test_sp()
RETURNS TABLE(a INTEGER)
LANGUAGE SQL
AS
  DECLARE
    res RESULTSET DEFAULT (SELECT a FROM t001 ORDER BY a);
  BEGIN
    RETURN TABLE(res);
  END;
Copy

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

CREATE OR REPLACE PROCEDURE test_sp()
RETURNS TABLE(a INTEGER)
LANGUAGE SQL
AS
$$
  DECLARE
      res RESULTSET default (SELECT a FROM t001 ORDER BY a);
  BEGIN
      RETURN TABLE(res);
  END;
$$;
Copy

Rufen Sie die gespeicherte Prozedur auf:

CALL test_sp();
Copy
+---+
| A |
|---|
| 1 |
| 2 |
+---+

Sie können auch die Funktion RESULT_SCAN verwenden, um die Ergebnisse des Aufrufs der gespeicherten Prozedur zu verarbeiten:

SELECT *
  FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
  ORDER BY 1;
Copy
+---+
| A |
|---|
| 1 |
| 2 |
+---+

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:

CREATE OR REPLACE PROCEDURE test_sp_dynamic(table_name VARCHAR)
  RETURNS TABLE(a INTEGER)
  LANGUAGE SQL
AS
DECLARE
  res RESULTSET;
  query VARCHAR DEFAULT 'SELECT a FROM IDENTIFIER(?) ORDER BY a;';
BEGIN
  res := (EXECUTE IMMEDIATE :query USING(table_name));
  RETURN TABLE(res);
END;
Copy

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

CREATE OR REPLACE PROCEDURE test_sp_dynamic(table_name VARCHAR)
RETURNS TABLE(a INTEGER)
LANGUAGE SQL
AS
$$
  DECLARE
    res RESULTSET;
    query VARCHAR DEFAULT 'SELECT a FROM IDENTIFIER(?) ORDER BY a;';
  BEGIN
    res := (EXECUTE IMMEDIATE :query USING(table_name));
    RETURN TABLE(res);
  END
$$
;
Copy

Um das Beispiel auszuführen, rufen Sie die gespeicherte Prozedur auf und übergeben den Tabellennamen:

CALL test_sp_dynamic('t001');
Copy
+---+
| A |
|---|
| 1 |
| 2 |
+---+

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.

CREATE OR REPLACE PROCEDURE test_sp_02()
RETURNS TABLE(a INTEGER)
LANGUAGE SQL
AS
  DECLARE
    res RESULTSET;
  BEGIN
    res := (SELECT a FROM t001 ORDER BY a);
    RETURN TABLE(res);
  END;
Copy

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

CREATE OR REPLACE PROCEDURE test_sp_02()
RETURNS TABLE(a INTEGER)
LANGUAGE SQL
AS
$$
  DECLARE
      res RESULTSET;
  BEGIN
      res := (SELECT a FROM t001 ORDER BY a);
      RETURN TABLE(res);
  END;
$$;
Copy

Um das Beispiel auszuführen, rufen Sie die gespeicherte Prozedur auf:

CALL test_sp_02();
Copy
+---+
| A |
|---|
| 1 |
| 2 |
+---+

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:

CREATE OR REPLACE PROCEDURE test_sp_03()
RETURNS VARCHAR
LANGUAGE SQL
AS

DECLARE
  accumulator INTEGER DEFAULT 0;
  res1 RESULTSET DEFAULT (SELECT a FROM t001 ORDER BY a);
  cur1 CURSOR FOR res1;
BEGIN
  FOR row_variable IN cur1 DO
    accumulator := accumulator + row_variable.a;
  END FOR;
  RETURN accumulator::VARCHAR;
END;
Copy

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

CREATE OR REPLACE PROCEDURE test_sp_03()
RETURNS INTEGER
LANGUAGE SQL
AS
$$
  DECLARE
    accumulator INTEGER DEFAULT 0;
    res1 RESULTSET DEFAULT (SELECT a FROM t001 ORDER BY a);
    cur1 CURSOR FOR res1;
  BEGIN
    FOR row_variable IN cur1 DO
        accumulator := accumulator + row_variable.a;
    END FOR;
    RETURN accumulator;
  END;
$$;
Copy

Rufen Sie die gespeicherte Prozedur auf, und die Ergebnisse addieren die Werte für a in der Tabelle (1 + 2):

CALL test_sp_03();
Copy
+------------+
| TEST_SP_03 |
|------------|
| 3          |
+------------+

Beispiel: Ausführen von untergeordneten Jobs mit gleichzeitiger Abfrage von Tabellen

Der folgende Code zeigt, wie Sie das Schlüsselwort ASYNC verwenden, um mehrere untergeordnete Jobs auszuführen, die gleichzeitig Tabellen abfragen.

Dieses Beispiel verwendet die Daten in den folgenden Tabellen:

CREATE OR REPLACE TABLE orders_q1_2024 (
  order_id INT,
  order_amount NUMBER(12,2));

INSERT INTO orders_q1_2024 VALUES (1, 500.00);
INSERT INTO orders_q1_2024 VALUES (2, 225.00);
INSERT INTO orders_q1_2024 VALUES (3, 725.00);
INSERT INTO orders_q1_2024 VALUES (4, 150.00);
INSERT INTO orders_q1_2024 VALUES (5, 900.00);

CREATE OR REPLACE TABLE orders_q2_2024 (
  order_id INT,
  order_amount NUMBER(12,2));

INSERT INTO orders_q2_2024 VALUES (1, 100.00);
INSERT INTO orders_q2_2024 VALUES (2, 645.00);
INSERT INTO orders_q2_2024 VALUES (3, 275.00);
INSERT INTO orders_q2_2024 VALUES (4, 800.00);
INSERT INTO orders_q2_2024 VALUES (5, 250.00);
Copy

Die folgende gespeicherte Prozedur führt die folgenden Aktionen aus:

  • Fragt beide Tabellen nach den order_amount-Werten in allen Zeilen ab und gibt die Ergebnisse an verschiedene RESULTSETs zurück (eins für jede Tabelle).

  • Legt fest, dass die Abfragen als gleichzeitige untergeordnete Jobs ausgeführt werden, indem Sie das Schlüsselwort ASYNC verwenden.

  • Führt die AWAIT-Anweisung für jedes RESULTSET aus, sodass die Prozedur wartet, bis die Abfragen beendet sind, bevor sie fortfährt. Auf die Abfrageergebnisse für ein RESULTSET kann erst zugegriffen werden, wenn AWAIT für das RESULTSET ausgeführt wird.

  • Verwendet einen Cursor, um die Summe der order_amount-Zeilen für jede Tabelle zu berechnen.

  • Addiert die Summen für die Tabellen und gibt den Wert zurück.

CREATE OR REPLACE PROCEDURE test_sp_async_child_jobs_query()
RETURNS INTEGER
LANGUAGE SQL
AS
DECLARE
  accumulator1 INTEGER DEFAULT 0;
  accumulator2 INTEGER DEFAULT 0;
  res1 RESULTSET DEFAULT ASYNC (SELECT order_amount FROM orders_q1_2024);
  res2 RESULTSET DEFAULT ASYNC (SELECT order_amount FROM orders_q2_2024);
BEGIN
  AWAIT res1;
  LET cur1 CURSOR FOR res1;
  OPEN cur1;
  AWAIT res2;
  LET cur2 CURSOR FOR res2;
  OPEN cur2;
  FOR row_variable IN cur1 DO
      accumulator1 := accumulator1 + row_variable.order_amount;
  END FOR;
  FOR row_variable IN cur2 DO
      accumulator2 := accumulator2 + row_variable.order_amount;
  END FOR;
  RETURN accumulator1 + accumulator2;
END;
Copy

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

CREATE OR REPLACE PROCEDURE test_sp_async_child_jobs_query()
RETURNS INTEGER
LANGUAGE SQL
AS
$$
  DECLARE
    accumulator1 INTEGER DEFAULT 0;
    accumulator2 INTEGER DEFAULT 0;
    res1 RESULTSET DEFAULT ASYNC (SELECT order_amount FROM orders_q1_2024);
    res2 RESULTSET DEFAULT ASYNC (SELECT order_amount FROM orders_q2_2024);
  BEGIN
    AWAIT res1;
    LET cur1 CURSOR FOR res1;
    OPEN cur1;
    AWAIT res2;
    LET cur2 CURSOR FOR res2;
    OPEN cur2;
    FOR row_variable IN cur1 DO
        accumulator1 := accumulator1 + row_variable.order_amount;
    END FOR;
    FOR row_variable IN cur2 DO
        accumulator2 := accumulator2 + row_variable.order_amount;
    END FOR;
    RETURN accumulator1 + accumulator2;
  END;
$$;
Copy

Rufen Sie die gespeicherte Prozedur auf:

CALL test_sp_async_child_jobs_query();
Copy
+--------------------------------+
| TEST_SP_ASYNC_CHILD_JOBS_QUERY |
|--------------------------------|
|                           4570 |
+--------------------------------+

Beispiel: Ausführen von untergeordneten Jobs, die gleichzeitig Zeilen in Tabellen einfügen

Der folgende Code zeigt, wie Sie das Schlüsselwort ASYNC verwenden, um mehrere untergeordnete Jobs auszuführen, die gleichzeitig Zeilen in eine Tabelle einfügen.

Die folgende gespeicherte Prozedur führt die folgenden Aktionen aus:

  • Erstellt die Tabelle orders_q3_2024, wenn sie nicht existiert.

  • Erzeugt zwei RESULTSETs, insert_1 und insert_2, die die Ergebnisse von Einfügungen in die Tabelle enthalten. Die Argumente der gespeicherten Prozedur geben die Werte an, die in die Tabelle eingefügt werden.

  • Legt fest, dass die Einfügungen als gleichzeitige untergeordnete Jobs ausgeführt werden, indem Sie das Schlüsselwort ASYNC verwenden.

  • Führt die AWAIT-Anweisung für jedes RESULTSET aus, sodass die Prozedur wartet, bis die Einfügungen beendet sind, bevor sie fortfährt. Auf die Ergebnisse eines RESULTSET kann erst zugegriffen werden, wenn AWAIT für das RESULTSET ausgeführt wird.

  • Erzeugt eine neues RESULTSET res, das die Ergebnisse einer Abfrage in der Tabelle orders_q3_2024 enthält.

  • Gibt die Ergebnisse der Abfrage zurück.

CREATE OR REPLACE PROCEDURE test_sp_async_child_jobs_insert(
  arg1 INT,
  arg2 NUMBER(12,2),
  arg3 INT,
  arg4 NUMBER(12,2))
RETURNS TABLE()
LANGUAGE SQL
AS
  BEGIN
   CREATE TABLE IF NOT EXISTS orders_q3_2024 (
      order_id INT,
      order_amount NUMBER(12,2));
    LET insert_1 RESULTSET := ASYNC (INSERT INTO orders_q3_2024 SELECT :arg1, :arg2);
    LET insert_2 RESULTSET := ASYNC (INSERT INTO orders_q3_2024 SELECT :arg3, :arg4);
    AWAIT insert_1;
    AWAIT insert_2;
    LET res RESULTSET := (SELECT * FROM orders_q3_2024 ORDER BY order_id);
    RETURN TABLE(res);
  END;
Copy

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

CREATE OR REPLACE PROCEDURE test_sp_async_child_jobs_insert(
  arg1 INT,
  arg2 NUMBER(12,2),
  arg3 INT,
  arg4 NUMBER(12,2))
RETURNS TABLE()
LANGUAGE SQL
AS
$$
  BEGIN
   CREATE TABLE IF NOT EXISTS orders_q3_2024 (
      order_id INT,
      order_amount NUMBER(12,2));
    LET insert_1 RESULTSET := ASYNC (INSERT INTO orders_q3_2024 SELECT :arg1, :arg2);
    LET insert_2 RESULTSET := ASYNC (INSERT INTO orders_q3_2024 SELECT :arg3, :arg4);
    AWAIT insert_1;
    AWAIT insert_2;
    LET res RESULTSET := (SELECT * FROM orders_q3_2024 ORDER BY order_id);
    RETURN TABLE(res);
  END;
$$;
Copy

Rufen Sie die gespeicherte Prozedur auf:

CALL test_sp_async_child_jobs_insert(1, 325, 2, 241);
Copy
+----------+--------------+
| ORDER_ID | ORDER_AMOUNT |
|----------+--------------|
|        1 |       325.00 |
|        2 |       241.00 |
+----------+--------------+

Weitere Beispiele für die Verwendung eines RESULTSET

Hier sind weitere Beispiele, die ein RESULTSET verwenden: