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

SQLROWCOUNT

Número de linhas afetadas pela última instrução DML.

Isso é equivalente a getNumRowsAffected() em procedimentos armazenados de JavaScript.

SQLFOUND

true se a última instrução DML tiver afetado uma ou mais linhas.

SQLNOTFOUND

true se a última instrução DML tiver afetado zero linhas.

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'); 
Copy

Para desativar o pacote, execute a seguinte instrução:

SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01'); 
Copy

Os exemplos nesta seção usam a seguinte tabela:

CREATE OR REPLACE TABLE my_values (value NUMBER); 
Copy

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; 
Copy

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

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; $$; 
Copy

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; 
Copy
+-------+ | 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 que 3 (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; 
Copy
+-------+ | 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. | +-----------------------------+