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 |
|---|---|
| Anzahl der von der letzten DML-Anweisung betroffenen Zeilen. Dies ist äquivalent zu |
|
|
|
|
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'); Um das Bundle zu deaktivieren, führen Sie die folgende Anweisung aus:
SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01'); Die Beispiele in diesem Abschnitt verwenden die folgende Tabelle:
CREATE OR REPLACE TABLE my_values (value NUMBER); 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; 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; $$; +-----------------+ | 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; 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; $$; 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; +-------+ | 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 isttrue, da keine Zeilen aktualisiert werden. Die UPDATE-Anweisung aktualisiert keine Zeilen, da keiner der Werte in der Tabelle kleiner als3ist (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; +-------+ | 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. | +-----------------------------+