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.

Bemerkung

Das 2025_01 Verhaltensänderungs-Bundle ändert die Verhaltensweise dieser Variablen. Wenn das Bundle aktiviert ist, geben die Variablen NULL zurück, wenn eine Anweisung, die nicht DML ist, nach der letzten DML-Anweisung in einem Snowflake Scripting-Block oder einer gespeicherten Prozedur ausgeführt wird. Das Bundle ist standardmäßig aktiviert. Weitere Informationen über die Verhaltensänderung finden Sie unter Snowflake Scripting: Änderungen an globalen Variablen.

Wenn das Bundle deaktiviert ist, können Sie es unter in Ihrem Konto aktivieren, indem Sie die folgende Anweisung ausführen:

SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
Copy

Um das Bundle zu deaktivieren, führen Sie die folgende Anweisung aus:

SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
Copy

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.

BEGIN
  LET sql_row_count_var INT := 0;
  INSERT INTO my_values VALUES (1), (2), (3);
  sql_row_count_var := SQLROWCOUNT;
  SELECT * from my_values;
  RETURN sql_row_count_var;
END;
Copy

Hinweis: Wenn Sie Snowflake CLI, SnowSQL, die Classic Console, oder die Methode execute_stream oder execute_string in Python Connector Code verwenden, benutzen Sie stattdessen dieses Beispiel (siehe Verwenden von Snowflake Scripting in Snowflake CLI, SnowSQL, Classic Console und im Python-Connector):

EXECUTE IMMEDIATE $$
BEGIN
  LET sql_row_count_var INT := 0;
  INSERT INTO my_values VALUES (1), (2), (3);
  sql_row_count_var := SQLROWCOUNT;
  SELECT * from my_values;
  RETURN sql_row_count_var;
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.

BEGIN
  LET sql_row_count_var INT := 0;
  LET sql_found_var BOOLEAN := NULL;
  LET sql_notfound_var BOOLEAN := NULL;
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
    sql_row_count_var := SQLROWCOUNT;
    sql_found_var := SQLFOUND;
    sql_notfound_var := SQLNOTFOUND;
  END IF;
  SELECT * from my_values;
  IF (sql_found_var = true) THEN
    RETURN 'Updated ' || sql_row_count_var || ' rows.';
  ELSEIF (sql_notfound_var = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
END;
Copy

Hinweis: Wenn Sie Snowflake CLI, SnowSQL, die Classic Console, oder die Methode execute_stream oder execute_string in Python Connector Code verwenden, benutzen Sie stattdessen dieses Beispiel (siehe Verwenden von Snowflake Scripting in Snowflake CLI, SnowSQL, Classic Console und im Python-Connector):

EXECUTE IMMEDIATE $$
BEGIN
  LET sql_row_count_var INT := 0;
  LET sql_found_var BOOLEAN := NULL;
  LET sql_notfound_var BOOLEAN := NULL;
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
    sql_row_count_var := SQLROWCOUNT;
    sql_found_var := SQLFOUND;
    sql_notfound_var := SQLNOTFOUND;
  END IF;
  SELECT * from my_values;
  IF (sql_found_var = true) THEN
    RETURN 'Updated ' || sql_row_count_var || ' rows.';
  ELSEIF (sql_notfound_var = 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. |
+-----------------------------+