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 als3
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;
+-------+
| 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. |
+-----------------------------+