确定受 DML 命令影响的行数¶
执行 DML 命令 后(不包括 TRUNCATE TABLE 命令),Snowflake Scripting 会设置以下全局变量。您可以使用这些变量来确定最后一个 DML 语句是否影响了任何行。
变量 |
描述 |
---|---|
|
受最后一个 DML 语句影响的行数。 这相当于 JavaScript 存储过程中的 |
|
如果最后一个 DML 语句影响一行或多行,则为 |
|
如果最后一个 DML 语句影响零行,则为 |
本节中的示例使用下表:
CREATE OR REPLACE TABLE my_values (value NUMBER);
以下示例使用 SQLROWCOUNT
变量返回受最后一个 DML 语句(INSERT 语句)影响的行数。SELECT 语句不是 DML 语句,对 SQLROWCOUNT
变量无影响。
BEGIN
INSERT INTO my_values VALUES (1), (2), (3);
SELECT * from my_values;
RETURN SQLROWCOUNT;
END;
注意:如果您在 Python Connector 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_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;
$$;
+-----------------+
| anonymous block |
|-----------------|
| 3 |
+-----------------+
以下示例使用 SQLFOUND
和 SQLNOTFOUND
变量返回受最后一个 DML 语句(UPDATE 语句)影响的行数。与前面的示例一样,SELECT 语句不会影响 SQLFOUND
和 SQLNOTFOUND
变量。
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;
注意:如果您在 Python Connector 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_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;
$$;
当匿名块运行时,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. |
+-----------------------------+