确定受 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;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console,或者 execute_stream 或 execute_string 方法,请改用本示例(请参阅 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 |
+-----------------+
以下示例使用 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;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console,或者 execute_stream 或 execute_string 方法,请改用本示例(请参阅 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;
$$;
当匿名块运行时,SQLFOUND 变量是 true,因为 UPDATE 语句更新了两行。
+-----------------+
| 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;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console,或者 execute_stream 或 execute_string 方法,请改用本示例(请参阅 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;
$$;
INSERT 之后,ACTIVITY_COUNT 是 3``(插入了三行)。SELECT 之后,:code:`ACTIVITY_COUNT` 是 ``2``(两行匹配 ``WHERE value > 1 条件)。
+-------------------------------------------+
| anonymous block |
|-------------------------------------------|
| Inserted 3 rows, query returned 2 rows. |
+-------------------------------------------+