确定受 DML 命令影响的行数¶
执行 DML 命令 后(不包括 TRUNCATE TABLE 命令),Snowflake Scripting 会设置以下全局变量。您可以使用这些变量来确定最后一个 DML 语句是否影响了任何行。
变量 |
描述 |
---|---|
|
受最后一个 DML 语句影响的行数。 这相当于 JavaScript 存储过程中的 |
|
如果最后一个 DML 语句影响一行或多行,则为 |
|
如果最后一个 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
方法,请改用本示例(请参阅 在 Snowflake CLI、SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
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
方法,请改用本示例(请参阅 在 Snowflake CLI、SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
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. |
+-----------------+
查询表以查看当前值:
SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
| 4 |
| 4 |
| 3 |
+-------+
再次运行相同的匿名块,结果如下:
执行 UPDATE 语句,因为表中存在大于
2
的值。也就是说,IF 条件得到了满足。SQLNOTFOUND
变量是true
,因为没有行被更新。UPDATE 语句未更新任何行,因为表中的值都不小于 ``3``(在 WHERE 子句中指定)。
该查询会返回以下输出:
+------------------+
| 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. |
+-----------------------------+