Ü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:
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 FeldMULTI_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
X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT
{
"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_count
ist die Anzahl der imstatement
-Feld angegebenen Anweisungen.desired_count
ist der Wert vonMULTI_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
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
X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT
{
"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).\nNumeric 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.