SQL ステートメントの影響を受ける行数の決定
DML コマンド が実行された後( TRUNCATE TABLE コマンドを除く)、Snowflake Scripting は以下のグローバル変数をセットします。これらの変数を使用して、最後の DML ステートメントが任意の行、またはクエリによって返された行の数に影響を与えたかどうかを判断できます。
注釈
2025_01動作変更バンドル は、これらの変数の動作を変更します。バンドルが有効な場合、Snowflake Scriptingブロックまたはストアドプロシージャの最後の DML ステートメントの後に DML 以外のステートメントが実行されると、変数は NULL を返します。バンドルはデフォルトで有効になっています。動作変更の詳細情報については、 Snowflake Scripting: グローバル変数に対する変更点 をご覧ください。
バンドルが無効になっている場合は、以下のステートメントを実行することで、 アカウントで有効にする ことができます。
SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
バンドルを無効にするには、以下のステートメントを実行します。
SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
このセクションの例では、次のテーブルを使用します。
CREATE OR REPLACE TABLE my_values (value NUMBER);
次の例では、 SQLROWCOUNT 変数を使用して、最後の DML ステートメント(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;
注意:Snowflake CLI、SnowSQL、クラシックコンソール、または:code:execute_stream`や:code:`execute_string`メソッドを:doc:`Pythonコネクタ</developer-guide/python-connector/python-connector>`コードで使用する場合は、代わりに次の例を使用してください(:doc:/developer-guide/snowflake-scripting/running-examples`を参照)。
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 |
+-----------------+
次の例では、 SQLFOUND 変数と SQLNOTFOUND 変数を使用して、最後の DML ステートメント(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;
注意:Snowflake CLI、SnowSQL、クラシックコンソール、または:code:execute_stream`や:code:`execute_string`メソッドを:doc:`Pythonコネクタ</developer-guide/python-connector/python-connector>`コードで使用する場合は、代わりに次の例を使用してください(:doc:/developer-guide/snowflake-scripting/running-examples`を参照)。
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;
$$;
匿名ブロックが実行されると、 UPDATE ステートメントが2行を更新するため、 SQLFOUND 変数は true になります。
+-----------------+
| anonymous block |
|-----------------|
| Updated 2 rows. |
+-----------------+
現在の値を確認するためにテーブルをクエリします。
+-------+
| VALUE |
|-------|
| 4 |
| 4 |
| 3 |
+-------+
同じ匿名ブロックをもう一度実行すると、結果は次のようになります。
クエリは次の出力を返します。
+------------------+
| anonymous block |
|------------------|
| No rows updated. |
+------------------+
次に、テーブルを更新し、すべての値を 1 にセットします:
UPDATE my_values SET value = 1;
SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
| 1 |
| 1 |
| 1 |
+-------+
同じ匿名ブロックを再度実行すると、 UPDATE ステートメントは実行されません。なぜなら、テーブル内のどの値も 2 よりも大きくないからです。つまり、 IF の条件が満たされていないので、 UPDATE ステートメントは実行されません。
+-----------------------------+
| anonymous block |
|-----------------------------|
| No DML statements executed. |
+-----------------------------+
ACTIVITY_COUNT 例
SQLROWCOUNT とは異なり、 ACTIVITY_COUNT 変数は SELECT クエリを含む各ステートメントの実行後に設定されます。これは、 DML 操作の影響を受ける行数と、クエリによって返される行数の両方を追跡するのに役立ちます。
次の例は INSERT ステートメントと SELECT クエリ後の ACTIVITY_COUNT を示しています。
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;
注意:Snowflake CLI、SnowSQL、クラシックコンソール、または:code:execute_stream`や:code:`execute_string`メソッドを:doc:`Pythonコネクタ</developer-guide/python-connector/python-connector>`コードで使用する場合は、代わりに次の例を使用してください(:doc:/developer-guide/snowflake-scripting/running-examples`を参照)。
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;
$$;
INSERT 後、 ACTIVITY_COUNT は 3 (3行挿入)。SELECT 後、 ACTIVITY_COUNT は 2 (2つの行が WHERE value > 1 条件に一致)。
+-------------------------------------------+
| anonymous block |
|-------------------------------------------|
| Inserted 3 rows, query returned 2 rows. |
+-------------------------------------------+