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