使用事务内的临时表调用存储过程

Posted

技术标签:

【中文标题】使用事务内的临时表调用存储过程【英文标题】:Calling stored procedure with temporary table inside transactions 【发布时间】:2020-05-29 21:28:15 【问题描述】:

我有一个 javascript 存储过程,它使用 CTAS 语法在其中创建一个临时表,以在计算期间保存一些临时结果。我希望能够在事务中调用这个存储过程。 这是不允许的吗?

CREATE PROCEDURE my_stored_proc()
RETURNS BOOLEAN NOT NULL 
LANGUAGE javascript 
EXECUTE AS CALLER
AS 
$$
    ...
    var stmt = snowflake.createStatement(
        sqlText: "CREATE TEMPORARY TABLE temp_table..."
        );
    var rs = stmt.execute();
    ...
$$;

BEGIN;
...
CALL my_stored_proc();
...
COMMIT;

我试图用事务包装这个存储过程,但它会在存储过程完成后立即提交,如果存储过程在执行过程中抛出错误,我希望能够回滚语句。

【问题讨论】:

【参考方案1】:

请记住,DDL 语句(CREATE TABLE 等)会导致隐式 COMMIT。如果将在事务中调用存储过程,则不应在存储过程中使用此类语句。

https://docs.snowflake.com/en/sql-reference/stored-procedures-usage.html#transaction-management

【讨论】:

以上是关于使用事务内的临时表调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 存储过程 - 创建游标后我可以清空临时表吗

我们如何避免并行执行存储过程?

如何在没有临时表的情况下从另一个存储过程调用存储过程(带参数)

Oracle存储过程中临时表的使用技巧

MySQL 存储过程,获取使用游标查询的结果集

mysql七:视图触发器事务存储过程函数