如何根据 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 复选框

如何使用 Python(SSO 身份验证)在 Snowflake 中进行查询?

如何撤消 Github 中的先前提交 [重复]