如何根据 Snowflake 中先前查询的结果提交/回滚事务?
Posted
技术标签:
【中文标题】如何根据 Snowflake 中先前查询的结果提交/回滚事务?【英文标题】:How to Commit/Rollback a transaction based on the result of the previous query in Snowflake? 【发布时间】:2020-06-02 14:04:29 【问题描述】:我有这样的交易
BEGIN;
...
SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())); -- Returns TRUE/FALSE
+----------------+
| Result |
|----------------|
| FALSE |
+----------------+
-- If TRUE
COMMIT;
-- If FALSE
-- ROLLBACK;
在这种情况下,我如何根据上一个查询的结果“FALSE”进行回滚?我想自动化这个脚本,而不是自己在运行时做出决定。
【问题讨论】:
这能回答你的问题吗? How to Commit/Rollback stored procedure based on return value in Snowflake? 我的示例代码按预期工作,您可以自己测试! 【参考方案1】:也许您可以创建一个存储过程并根据参数执行提交或回滚:
CREATE OR REPLACE PROCEDURE commit_or_rollback( result BOOLEAN )
returns BOOLEAN
language javascript
AS
$$
if ( RESULT ) snowflake.execute( sqlText: "COMMIT" )
else
snowflake.execute( sqlText: "ROLLBACK" ) ;
return RESULT;
$$
;
所以你的脚本会是这样的:
BEGIN
...
CALL commit_or_rollback( SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) );
一个测试用例:
BEGIN;
SELECT CURRENT_TRANSACTION();
+-----------------------+
| CURRENT_TRANSACTION() |
+-----------------------+
| 1591113827577 |
+-----------------------+
CALL commit_or_rollback( ( SELECT TRUE ) );
+--------------------+
| COMMIT_OR_ROLLBACK |
+--------------------+
| TRUE |
+--------------------+
SELECT CURRENT_TRANSACTION();
最后一个命令返回 NULL。我还可以看到在查询历史记录中执行了 COMMIT。
【讨论】:
根据文档,在存储过程中不允许使用 COMMIT/ROLLBACK 语句。 docs.snowflake.com/en/sql-reference/… 感谢提醒,但我可以看到它执行了提交语句。你检查过吗?我添加了一个测试用例来查看它是否有效。 啊!非常感谢。我试过了,它确实有效。看起来我什至可以在存储过程中开始事务。在这种情况下,应该有人更新文档。以上是关于如何根据 Snowflake 中先前查询的结果提交/回滚事务?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 React + Apollo GraphQL 中查询先前查询的结果?
如何替换 snowflake.execute 语句中的循环结果?
如何根据同一仪器中先前的复选框结果自动填充 REDCap 复选框