Übermitteln mehrerer SQL-Anweisungen in einer einzigen Anforderung

Unter diesem Thema wird erläutert, wie Sie eine Anforderung mit mehreren Anweisungen an die Snowflake-SQL-API übermitteln.

Bemerkung

Die Ausführung mehrerer Anweisungen in einer einzigen Abfrage setzt voraus, dass ein gültiges Warehouse in einer Sitzung verfügbar ist.

Einführung

In einigen Fällen müssen Sie möglicherweise mehrere SQL-Anweisungen in einer Anforderung angeben. Das wäre in folgenden Beispielen der Fall:

  • Definieren einer explizite Transaktion

  • Festlegen und Verwenden von Sitzungsvariablen in Anweisungen einer Anforderung

  • Erstellen und Verwenden von temporären Tabellen in Anweisungen einer Anforderung

  • Ändern der Datenbank, des Schemas, des Warehouses oder der Rolle für Anweisungen einer Anforderung

In den folgenden Abschnitten wird erläutert, wie Sie eine Anforderung übermitteln, die mehrere SQL-Anweisungen enthält.

Angeben mehrerer SQL-Anweisungen in der Anforderung

So übermitteln Sie mehrerer SQL-Anweisungen in einer einzigen Anforderung:

  • Verwenden Sie im Feld statement ein Semikolon (;) zwischen den einzelnen Anweisungen.

  • Setzen Sie im Feld parameters das Feld MULTI_STATEMENT_COUNT auf die Anzahl der SQL-Anweisungen in der Anforderung.

Beispiel:

POST /api/v2/statements HTTP/1.1
Authorization: Bearer <jwt>
Content-Type: application/json
Accept: application/json
User-Agent: myApplication/1.0

{
  "statement": "alter session set QUERY_TAG='mytesttag'; select count(*) from mytable",
  ...
  "parameters": {
      "MULTI_STATEMENT_COUNT": "2"
  }
}
Copy

In diesem Beispiel wird MULTI_STATEMENT_COUNT auf 2 gesetzt, was der Anzahl der übermittelten SQL-Anweisungen entspricht.

Um im Feld statement eine variable Anzahl von SQL-Anweisungen zu übermitteln, setzen Sie MULTI_STATEMENT_COUNT auf 0. Dies ist in einer Anwendung nützlich, in der die Anzahl der übermittelten SQL-Anweisungen zur Laufzeit nicht bekannt ist.

Wenn der Wert von MULTI_STATEMENT_COUNT nicht mit der im Feld statement angegebenen Anzahl von SQL-Anweisungen übereinstimmt, gibt die SQL-API den folgenden Fehler zurück:

Actual statement count <actual_count> did not match the desired statement count <desired_count>.
Copy

Wobei:

  • actual_count ist die Anzahl der im statement-Feld angegebenen Anweisungen.

  • desired_count ist der Wert von MULTI_STATEMENT_COUNT.

Wenn Sie mehrere SQL-Anweisungen im Feld statement angeben, aber keinen Wert im Feld MULTI_STATEMENT_COUNT, gibt die SQL-API den folgenden Fehler zurück:

Actual statement count 3 did not match the desired statement count 1.
Copy

Bemerkung

Snowflake unterstützt derzeit keine Variablenbindung in SQL-Anforderungen mit mehreren Anweisungen.

Abrufen der Ergebnisse jeder SQL-Anweisung in der Anforderung

Wenn eine Anforderung, die mehrere SQL-Anweisungen enthält, erfolgreich ausgeführt wurde, dann enthält die Antwort nicht die Daten, die bei der Ausführung der einzelnen Anweisungen zurückgegeben werden. Die Antwort enthält stattdessen ein statementHandles-Feld, das wiederum ein Array mit den Handles für jede einzelne Anweisung enthält.

Bemerkung

Das Feld statementHandles unterscheidet sich vom Feld statementHandle:

  • Das Feld statementHandle gibt das Handle für den Satz von SQL-Anweisungen in der Anforderung an.

  • Das Feld statementHandles ist ein Array, das die Handles jeder einzelnen SQL-Anweisungen in der Anforderung enthält.

Beispiel: Angenommen, Sie senden eine Anforderung, die zwei SQL-Anweisungen zur Ausführung angibt:

POST /api/v2/statements HTTP/1.1
Authorization: Bearer <jwt>
Content-Type: application/json
Accept: application/json
User-Agent: myApplication/1.0

{
  "statement": "select * from A; select * from B",
  ...
}
Copy

Die Antwort enthält ein statementHandles-Feld, das wiederum ein Array mit den Handles der einzelnen Anweisungen enthält.

HTTP/1.1 200 OK
...
{
  ...
  "statementHandles" : [ "019c9fce-0502-f1fc-0000-438300e02412", "019c9fce-0502-f1fc-0000-438300e02416" ],
  ...
}
Copy

Um den Status zu prüfen und die Daten für die einzelnen Anweisungen abzurufen, senden Sie eine GET-Anforderung an den Endpunkt /api/v2/statements/ und hängen das Handle der jeweiligen Anweisung an den URL-Pfad an: Weitere Informationen dazu finden Sie unter Prüfen des Ausführungsstatus der Anweisung und Abrufen der Daten.

GET /api/v2/statements/019c9fce-0502-f1fc-0000-438300e02412
...
Copy
GET /api/v2/statements/019c9fce-0502-f1fc-0000-438300e02416
...
Copy

Behandeln von Fehlern bei der Angabe mehrerer Anweisungen in einer Anforderung

Wenn Sie mehrere SQL-Anweisungen in der Anforderung angegeben haben und bei Ausführung einer der Anweisungen ein Fehler aufgetreten ist, gibt Snowflake den HTTP-Antwortcode 422 mit einem QueryFailureStatus-Objekt zurück.

Sie können Details zum aufgetretenen Fehler aus diesem Objekt abrufen.

Angenommen, Ihre Anforderungen enthält die folgenden Anweisungen, bei denen die zweite INSERT-Anweisung einen Fehler enthält:

{
  "statement": "create or replace table table1 (i int); insert into table1 (i) values (1); insert into table1 (i) values ('This is not a valid integer.'); insert into table1 (i) values (2); select i from table1 order by i",
  ...
}
Copy

Snowflake gibt eine Antwort mit HTTP-Antwortcode 422 und mit einem QueryFailureStatus-Objekt zurück, das die Details zum Fehler enthält:

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
...
{
  "code" : "100132",
  "message" : "JavaScript execution error: Uncaught Execution of multiple statements failed on statement \"insert into table1 (i) values ...\" (at line 1, position 75).\nDML operation to table TABLE1 failed on column I with error: Numeric value 'This is not a valid integer.' is not recognized in SYSTEM$MULTISTMT at '    throw `Execution of multiple statements failed on statement {0} (at line {1}, position {2}).`.replace('{1}', LINES[i])' position 4\nstackstrace: \nSYSTEM$MULTISTMT line: 10",
  "sqlState" : "P0000",
  "statementHandle" : "019d6e97-0502-317e-0000-096d0041f036"
}
Copy

Im obigen Beispiel beginnt die INSERT-Anweisung mit dem Fehler an der Zeichenposition 75 im Wert des Feldes statement.

Die Anweisungen vor der fehlerhaften Anweisung werden erfolgreich ausgeführt (die CREATE TABLE- und die erste INSERT-Anweisung in diesem Beispiel). Die Anweisungen nach der fehlerhaften Anweisung werden nicht ausgeführt.