Ü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.
Unter diesem Thema:
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 - statementein Semikolon (- ;) zwischen den einzelnen Anweisungen.
- Setzen Sie im Feld - parametersdas Feld- MULTI_STATEMENT_COUNTauf 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"
  }
}
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>.
Wobei:
- actual_countist die Anzahl der im- statement-Feld angegebenen Anweisungen.
- desired_countist 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.
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 - statementHandlegibt das Handle für den Satz von SQL-Anweisungen in der Anforderung an.
- Das Feld - statementHandlesist 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",
  ...
}
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" ],
  ...
}
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
...
GET /api/v2/statements/019c9fce-0502-f1fc-0000-438300e02416
...
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",
  ...
}
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"
}
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.