确定受 DML 命令影响的行数

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

变量

描述

SQLROWCOUNT

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

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

SQLFOUND

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

SQLNOTFOUND

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

本节中的示例使用下表:

CREATE OR REPLACE TABLE my_values (value NUMBER);
Copy

以下示例使用 SQLROWCOUNT 变量返回受最后一个 DML 语句(INSERT 语句)影响的行数。SELECT 语句不是 DML 语句,对 SQLROWCOUNT 变量无影响。

BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  SELECT * from my_values;
  RETURN SQLROWCOUNT;
END;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_string 方法,请改用本示例(请参阅 在 SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):

EXECUTE IMMEDIATE $$
BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  SELECT * from my_values;
  RETURN SQLROWCOUNT;
END;
$$;
Copy
+-----------------+
| anonymous block |
|-----------------|
|               3 |
+-----------------+

以下示例使用 SQLFOUNDSQLNOTFOUND 变量返回受最后一个 DML 语句(UPDATE 语句)影响的行数。与前面的示例一样,SELECT 语句不会影响 SQLFOUNDSQLNOTFOUND 变量。

BEGIN
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
  END IF;
  SELECT * from my_values;
  IF (SQLFOUND = true) THEN
    RETURN 'Updated ' || SQLROWCOUNT || ' rows.';
  ELSEIF (SQLNOTFOUND = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
END;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_string 方法,请改用本示例(请参阅 在 SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):

EXECUTE IMMEDIATE $$
BEGIN
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
  END IF;
  SELECT * from my_values;
  IF (SQLFOUND = true) THEN
    RETURN 'Updated ' || SQLROWCOUNT || ' rows.';
  ELSEIF (SQLNOTFOUND = 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. |
+-----------------------------+
语言: 中文