确定受 DML 命令影响的行数

执行 DML 命令 后(不包括 TRUNCATE TABLE 命令),Snowflake Scripting 会设置以下全局变量。您可以使用这些变量来确定最后一个 DML 语句是否影响了任何行。

变量

描述

SQLROWCOUNT

受最后一个 DML 语句影响的行数。

这相当于 JavaScript 存储过程中的 getNumRowsAffected()

SQLFOUND

如果最后一个 DML 语句影响一行或多行,则为 true

SQLNOTFOUND

如果最后一个 DML 语句影响零行,则为 true

备注

2025_01 行为变更捆绑包 可用于更改这些变量的行为。启用捆绑包后,且在 Snowflake Scripting 块或存储过程中的最后一个 DML 语句之后执行非 DML 语句时,变量会返回 NULL。默认情况下,该捆绑包处于启用状态。有关行为变更的更多信息,请参阅 Snowflake Scripting:全局变量变更(待定)

如果捆绑包已禁用,您可以通过执行以下语句 在您的账户中将其启用

SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
Copy

要禁用捆绑包,请执行以下语句:

SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');
Copy

本节中的示例使用下表:

CREATE OR REPLACE TABLE my_values (value NUMBER);
Copy

以下示例使用 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;
Copy

注意:如果您在 Python Connector 代码中使用 Snowflake CLISnowSQLClassic Console 或者 execute_streamexecute_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;
$$;
Copy
+-----------------+
| anonymous block |
|-----------------|
|               3 |
+-----------------+

以下示例使用 SQLFOUNDSQLNOTFOUND 变量返回受最后一个 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;
Copy

注意:如果您在 Python Connector 代码中使用 Snowflake CLISnowSQLClassic Console 或者 execute_streamexecute_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;
$$;
Copy

当匿名块运行时,SQLFOUND 变量是 true,因为 UPDATE 语句更新了两行。

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

查询表以查看当前值:

SELECT * FROM my_values;
Copy
+-------+
| 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;
Copy
+-------+
| VALUE |
|-------|
|     1 |
|     1 |
|     1 |
+-------+

再次运行相同的匿名块,不执行 UPDATE 语句,因为表中的值都不大于 2。也就是说,IF 条件没有满足,因此 UPDATE 语句没有执行。

+-----------------------------+
| anonymous block             |
|-----------------------------|
| No DML statements executed. |
+-----------------------------+
语言: 中文