Ü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 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
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 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.

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.

Zurück zum Anfang