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 |
|
|
|
|
Nota
O pacote de mudança de comportamento 2025_01 altera o comportamento dessas variáveis. Quando o pacote está ativado, as variáveis retornam NULL quando uma instrução que não é DML é executada após a última instrução DML em um bloco do Snowflake Scripting ou procedimento armazenado. O pacote é ativado por padrão. Para obter mais informações sobre a mudança de comportamento, consulte Snowflake Scripting: alterações das variáveis globais.
Se o pacote estiver desativado, você pode ativá-lo na sua conta executando o seguinte comando:
SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
Para desativar o pacote, execute a seguinte instrução:
SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
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).
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;
Observação: se você usar o Snowflake CLI, SnowSQL, o Classic Console, ou o método execute_stream
ou execute_string
no código Python Connector, use este exemplo (consulte Usar o Snowflake Scripting no Snowflake CLI, SnowSQL, Classic Console e 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 |
+-----------------+
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).
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;
Observação: se você usar o Snowflake CLI, SnowSQL, o Classic Console, ou o método execute_stream
ou execute_string
no código Python Connector, use este exemplo (consulte Usar o Snowflake Scripting no Snowflake CLI, SnowSQL, Classic Console e 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;
$$;
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. |
+-----------------------------+