Bestimmen der Anzahl der von DML-Befehlen betroffenen Zeilen

Nach der Ausführung eines DML-Befehls (mit Ausnahme des TRUNCATE TABLE-Befehls), setzt Snowflake Scripting die folgenden globalen Variablen. Sie können diese Variablen verwenden, um festzustellen, ob von der letzten DML-Anweisung irgendwelche Zeilen betroffen sind.

Variable

Beschreibung

SQLROWCOUNT

Anzahl der von der letzten DML-Anweisung betroffenen Zeilen.

Dies ist äquivalent zu getNumRowsAffected() in gespeicherten JavaScript-Prozeduren.

SQLFOUND

true, wenn von der letzten DML-Anweisung eine oder mehrere Zeilen betroffen sind.

SQLNOTFOUND

true, wenn von der letzten DML-Anweisung keine Zeile mehr betroffen ist.

Die Beispiele in diesem Abschnitt verwenden die folgende Tabelle:

CREATE OR REPLACE TABLE my_values (value NUMBER);
Copy

Das folgende Beispiel verwendet die Variable SQLROWCOUNT, um die Anzahl der Zeilen zu ermitteln, die von der letzten DML-Anweisung (der INSERT-Anweisung) betroffen sind. Die SELECT-Anweisung ist keine DML-Anweisung und hat keine Auswirkungen auf die Variable SQLROWCOUNT.

BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  SELECT * from my_values;
  RETURN SQLROWCOUNT;
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):

EXECUTE IMMEDIATE $$
BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  SELECT * from my_values;
  RETURN SQLROWCOUNT;
END;
$$;
Copy
+-----------------+
| anonymous block |
|-----------------|
|               3 |
+-----------------+

Im folgenden Beispiel werden die Variablen SQLFOUND und SQLNOTFOUND verwendet, um die Anzahl der Zeilen zurückzugeben, die von der letzten DML-Anweisung (der UPDATE-Anweisung) betroffen sind. Wie im vorherigen Beispiel hat die SELECT-Anweisung keine Auswirkungen auf die Variablen SQLFOUND und SQLNOTFOUND.

BEGIN
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
  END IF;
  SELECT * from my_values;
  IF (SQLFOUND = true) THEN
    RETURN 'Updated ' || SQLROWCOUNT || ' rows.';
  ELSEIF (SQLNOTFOUND = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
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):

EXECUTE IMMEDIATE $$
BEGIN
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
  END IF;
  SELECT * from my_values;
  IF (SQLFOUND = true) THEN
    RETURN 'Updated ' || SQLROWCOUNT || ' rows.';
  ELSEIF (SQLNOTFOUND = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
END;
$$;
Copy

Wenn der anonyme Block ausgeführt wird, lautet die Variable SQLFOUND true, da die UPDATE-Anweisung zwei Zeilen aktualisiert.

+-----------------+
| anonymous block |
|-----------------|
| Updated 2 rows. |
+-----------------+

Fragen Sie die Tabelle ab, um die aktuellen Werte anzuzeigen:

SELECT * FROM my_values;
Copy
+-------+
| VALUE |
|-------|
|     4 |
|     4 |
|     3 |
+-------+

Führen Sie denselben anonymen Block noch einmal aus und Sie erhalten folgende Ergebnisse:

  • Die UPDATE-Anweisung wird ausgeführt, weil es in der Tabelle einen Wert gibt, der größer ist als 2. Das heißt, die IF-Bedingung ist erfüllt.

  • Die SQLNOTFOUND-Variable ist true, da keine Zeilen aktualisiert werden. Die UPDATE-Anweisung aktualisiert keine Zeilen, da keiner der Werte in der Tabelle kleiner als 3 ist (angegeben in der WHERE-Klausel).

Die Abfrage gibt die folgende Ausgabe zurück:

+------------------+
| anonymous block  |
|------------------|
| No rows updated. |
+------------------+

Aktualisieren Sie nun die Tabelle, um alle Werte auf 1 zu setzen:

UPDATE my_values SET value = 1;

SELECT * FROM my_values;
Copy
+-------+
| VALUE |
|-------|
|     1 |
|     1 |
|     1 |
+-------+

Führen Sie denselben anonymen Block noch einmal aus, und die UPDATE-Anweisung wird nicht ausgeführt, weil keiner der Werte in der Tabelle größer als 2 ist. Das heißt, die IF-Bedingung ist nicht erfüllt, sodass die UPDATE-Anweisung nicht ausgeführt wird.

+-----------------------------+
| anonymous block             |
|-----------------------------|
| No DML statements executed. |
+-----------------------------+