Détermination du nombre de lignes affectées par des instructions SQL

Après l’exécution d’une commande DML (à l’exclusion de la commande TRUNCATE TABLE), Snowflake Scripting paramètre les variables globales suivantes. Vous pouvez utiliser ces variables pour déterminer si la dernière instruction DML a affecté toutes les lignes, ou combien de lignes ont été retournées par une requête.

Variable

Description

ACTIVITY_COUNT

Nombre de lignes affectées par la dernière instruction DML ou le nombre de lignes retournées par la dernière requête SELECT. Définir après chaque exécution d’instruction.

SQLROWCOUNT

Nombre de lignes affectées par la dernière instruction DML.

Ceci est équivalent à getNumRowsAffected() dans des procédures stockées JavaScript.

SQLFOUND

true si la dernière instruction DML a affecté une ou plusieurs lignes.

SQLNOTFOUND

true si la dernière instruction DML n’a affecté aucune ligne.

Note

Le bundle de changements de comportement 2025_01 modifie le comportement de ces variables. Lorsque le bundle est activé, les variables renvoient NULL lorsqu’une instruction nonDML est exécutée après la dernière instruction DML dans un bloc Snowflake Scripting ou une procédure stockée. Le bundle est activé par défaut. Pour plus d’informations sur le changement de comportement, voir Snowflake Scripting : Modifications des variables globales.

Si le bundle est désactivé, vous pouvez l’activer dans votre compte en exécutant l’instruction suivante :

SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');

Pour désactiver le bundle, exécutez l’instruction suivante :

SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');

Les exemples de cette section utilisent le tableau suivant :

CREATE OR REPLACE TABLE my_values (value NUMBER);

L’exemple suivant utilise la variable SQLROWCOUNT pour renvoyer le nombre de lignes affectées par la dernière instruction DML (l’instruction 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;

Remarque : Si vous utilisez Snowflake CLI,:doc:SnowSQL </user-guide/snowsql>, la console classique ou la méthode execute_stream ou execute_string dans le code du Connecteur Python, utilisez cet exemple à la place (voir Using Snowflake Scripting in Snowflake CLI, SnowSQL, and 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 |
+-----------------+

L’exemple suivant utilise les variables SQLFOUND et SQLNOTFOUND pour retourner le nombre de lignes affectées par la dernière instruction DML (l’instruction 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;

Remarque : Si vous utilisez Snowflake CLI,:doc:SnowSQL </user-guide/snowsql>, la console classique ou la méthode execute_stream ou execute_string dans le code du Connecteur Python, utilisez cet exemple à la place (voir Using Snowflake Scripting in Snowflake CLI, SnowSQL, and 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;
$$;

Lorsque le bloc anonyme s’exécute, la variable SQLFOUND est true car l’instruction UPDATE met à jour deux lignes.

+-----------------+
| anonymous block |
|-----------------|
| Updated 2 rows. |
+-----------------+

Interrogez la table pour connaître les valeurs actuelles :

SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
|     4 |
|     4 |
|     3 |
+-------+

Exécutez à nouveau le même bloc anonyme et vous obtiendrez les résultats suivants :

  • L’instruction UPDATE est exécutée parce que la table contient une valeur supérieure à 2. En d’autres termes, la condition IF est satisfaite.

  • La variable SQLNOTFOUND est true car aucune ligne n’est mise à jour. L’instruction UPDATE ne met à jour aucune ligne car aucune des valeurs de la table n’est inférieure à 3 (spécifiée dans la clause WHERE).

La requête renvoie le résultat suivant :

+------------------+
| anonymous block  |
|------------------|
| No rows updated. |
+------------------+

Mettez maintenant à jour la table pour que l’ensemble des valeurs soit fixé à 1 :

UPDATE my_values SET value = 1;

SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
|     1 |
|     1 |
|     1 |
+-------+

Exécutez à nouveau le même bloc anonyme et l’instruction UPDATE n’est pas exécutée car aucune des valeurs de la table n’est supérieure à 2. En d’autres termes, la condition IF n’étant pas remplie, l’instruction UPDATE ne s’exécute pas.

+-----------------------------+
| anonymous block             |
|-----------------------------|
| No DML statements executed. |
+-----------------------------+

Exemples ACTIVITY_COUNT

Contrairement à SQLROWCOUNT, la variable ACTIVITY_COUNT est définie après chaque exécution d’instruction, y compris les requêtes SELECT. Ceci le rend utile pour suivre à la fois le nombre de lignes affectées par les opérations DML et le nombre de lignes retournées par les requêtes.

L’exemple suivant montre ACTIVITY_COUNT après une instruction INSERT et une requête SELECT :

BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  LET insert_count INT := ACTIVITY_COUNT;
  SELECT * FROM my_values WHERE value > 1;
  LET select_count INT := ACTIVITY_COUNT;
  RETURN 'Inserted ' || insert_count || ' rows, query returned ' || select_count || ' rows.';
END;

Remarque : Si vous utilisez Snowflake CLI,:doc:SnowSQL </user-guide/snowsql>, la console classique ou la méthode execute_stream ou execute_string dans le code du Connecteur Python, utilisez cet exemple à la place (voir Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector) :

EXECUTE IMMEDIATE $$
BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  LET insert_count INT := ACTIVITY_COUNT;
  SELECT * FROM my_values WHERE value > 1;
  LET select_count INT := ACTIVITY_COUNT;
  RETURN 'Inserted ' || insert_count || ' rows, query returned ' || select_count || ' rows.';
END;
$$;

Après l’instruction INSERT,:code:ACTIVITY_COUNT est 3 (trois lignes insérées). Après la requête SELECT, ACTIVITY_COUNT est``2`` (deux lignes correspondent à la condition WHERE value > 1).

+-------------------------------------------+
| anonymous block                           |
|-------------------------------------------|
| Inserted 3 rows, query returned 2 rows.   |
+-------------------------------------------+