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