Como determinar o número de linhas afetadas por comandos DML¶
Depois que um comando DML é executado (excluindo o comando TRUNCATE TABLE), o Snowflake Scripting define as seguintes variáveis globais. Você pode usar essas variáveis para determinar se a última instrução DML afetou alguma linha.
Variável |
Descrição |
---|---|
|
Número de linhas afetadas pela última instrução DML. Isso é equivalente a |
|
|
|
|
Os exemplos nesta seção usam a seguinte tabela:
CREATE OR REPLACE TABLE my_values (value NUMBER);
O exemplo a seguir usa a variável SQLROWCOUNT
para retornar o número de linhas afetadas pela última instrução DML (a instrução INSERT). A instrução SELECT não é uma instrução DML e não tem efeito sobre a variável SQLROWCOUNT
.
BEGIN
INSERT INTO my_values VALUES (1), (2), (3);
SELECT * from my_values;
RETURN SQLROWCOUNT;
END;
Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream
ou execute_string
no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):
EXECUTE IMMEDIATE $$
BEGIN
INSERT INTO my_values VALUES (1), (2), (3);
SELECT * from my_values;
RETURN SQLROWCOUNT;
END;
$$;
+-----------------+
| anonymous block |
|-----------------|
| 3 |
+-----------------+
O exemplo a seguir usa as variáveis SQLFOUND
e SQLNOTFOUND
para retornar o número de linhas afetadas pela última instrução DML (a instrução UPDATE). Como no caso do exemplo anterior, a instrução SELECT não afeta as variáveis SQLFOUND
e 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;
Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream
ou execute_string
no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):
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;
$$;
Quando o bloco anônimo é executado, a variável SQLFOUND
é true
porque a instrução UPDATE atualiza duas linhas.
+-----------------+
| anonymous block |
|-----------------|
| Updated 2 rows. |
+-----------------+
Consulte a tabela para ver os valores atuais:
SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
| 4 |
| 4 |
| 3 |
+-------+
Execute o mesmo bloco anônimo novamente, e os resultados são os seguintes:
A instrução UPDATE é executada porque há um valor na tabela que é maior que
2
. Ou seja, a condição IF é satisfeita.A variável
SQLNOTFOUND
étrue
porque nenhuma linha é atualizada. A instrução UPDATE não atualiza nenhuma linha porque nenhum dos valores da tabela é menor que3
(especificado na cláusula WHERE).
A consulta retorna a seguinte saída:
+------------------+
| anonymous block |
|------------------|
| No rows updated. |
+------------------+
Agora, atualize a tabela para definir todos os valores como 1
:
UPDATE my_values SET value = 1;
SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
| 1 |
| 1 |
| 1 |
+-------+
Execute o mesmo bloco anônimo novamente e a instrução UPDATE não será executada porque nenhum dos valores da tabela é maior que 2
. Ou seja, a condição IF não é satisfeita, portanto, a instrução UPDATE não é executada.
+-----------------------------+
| anonymous block |
|-----------------------------|
| No DML statements executed. |
+-----------------------------+