当前位置: 首页 > 知识库问答 >
问题:

如何在雪花中基于返回值提交/回滚存储过程?

梁丘洲
2023-03-14

我有一个返回布尔值javascript存储过程。我希望能够在事务内部调用这个存储过程,并在提交事务之前测试返回值。

BEGIN;
SET result = CALL my_stored_proc();

IF $result = true 
COMMIT;
ELSE
ROLLBACK;
USE COMMON;


CREATE TABLE LOG
(
LOG_ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_LOG_ID PRIMARY KEY,
LOG_LEVEL VARCHAR (50) NOT NULL,
LOGGER VARCHAR (500) NOT NULL,
MESSAGE VARCHAR NOT NULL,
EXCEPTION VARCHAR NULL,
APPLICATION_NAME VARCHAR(500) NOT NULL,
LOGGED_ON DATETIME DEFAULT TO_TIMESTAMP_NTZ(CURRENT_TIMESTAMP()) NOT NULL,
LOGGED_BY VARCHAR(200) DEFAULT CURRENT_USER() NOT NULL
);

CREATE OR REPLACE PROCEDURE TEST_TRANSACTION() 
RETURNS VARCHAR 
LANGUAGE javascript 
EXECUTE AS CALLER
AS 
$$
snowflake.execute({sqlText:`
INSERT
            INTO
                COMMON.LOG (LOG_LEVEL, LOGGER, MESSAGE, EXCEPTION, APPLICATION_NAME)
            VALUES ('DEBUG', 'TEST_TRANSACTION', 'This is a test transaction.', '', 'DATA LOADER'); 
`});
snowflake.execute({sqlText:`
INSERT
            INTO
                COMMON.LOG (LOG_LEVEL, LOGGER, MESSAGE, EXCEPTION, APPLICATION_NAME)
            VALUES ('DEBUG', 'TEST_TRANSACTION', 'This message should not be in the logs.', '', 'DATA LOADER'); 
`});

throw 'Test error'
$$
;
-- Run the next 3 lines as a batch
BEGIN;
CALL COMMON.TEST_TRANSACTION(); -- This Fails
COMMIT; -- Commit is NOT executed

SELECT * FROM COMMON.LOG WHERE LOGGER = 'TEST_TRANSACTION'; -- The insert is successful & the transaction is still OPEN

如何回滚存储过程中执行的语句?

共有1个答案

帅博远
2023-03-14

因此,可以在存储过程中发出事务控制命令(BEGIN、COMMIT、ROLLBACK)。我可以作为事务,检查存储过程中的返回值,并决定提交或回滚。

应该有人更新雪花文档。

CREATE OR REPLACE PROCEDURE TEST_TRANSACTION(result BOOLEAN) 
RETURNS BOOLEAN NOT NULL 
LANGUAGE javascript 
EXECUTE AS CALLER
AS 
$$
snowflake.execute({sqlText:`BEGIN;`});

snowflake.execute({sqlText:`
INSERT
            INTO
                COMMON.LOG (LOG_LEVEL, LOGGER, MESSAGE, EXCEPTION, APPLICATION_NAME)
            VALUES ('DEBUG', 'TEST_TRANSACTION', 'This is a test transaction.', '', 'DATA LOADER'); 
`});
snowflake.execute({sqlText:`
INSERT
            INTO
                COMMON.LOG (LOG_LEVEL, LOGGER, MESSAGE, EXCEPTION, APPLICATION_NAME)
            VALUES ('DEBUG', 'TEST_TRANSACTION', 'This message should not be in the logs.', '', 'DATA LOADER'); 
`});

if ( RESULT ) { snowflake.execute( {sqlText: "COMMIT" }) } 
    else {
        snowflake.execute( {sqlText: "ROLLBACK" }) };

return true;
$$
;
 类似资料:
  • 创建过程GetLastUpdateDate()以$$的形式返回布尔语言javascript

  • 我有一个存储过程,它接受参数并返回一个长值。 我如何使用jdbcTemplate来调用这个存储过程并获得返回的值。 这样对吗?

  • 1选定列的参数(选定的筛选器/下拉属性或从UI发送的列名) 2 dynamic where子句的参数,用于为点1中选择的类似下拉列表值准备 从视图中获取数据,并以这种方式检索结果 注意:在这一点上没有要求显示特定于某个用户的数据。同样忽略上面代码中的参数插值部分 是否存在任何数据完整性问题,不同的用户将看不到UI上更新的值(为了提供更多的上下文,从此过程中的视图中提取数据,并且该视图数据在应用程序

  • 问题内容: 我正在执行上面的存储过程。我收到以下错误: 消息245,级别16,状态1,过程S_Comp,第8行在将varchar值“存在的Amruthanot”转换为数据类型int时,转换失败。 请帮我解决这个问题 问题答案: 您将结果放在值中,而不是传递的值中。 从MSDN (返回) 是 返回 的整数值。存储过程可以将整数值返回到调用过程或应用程序。 更改您的程序。 调用程序

  • 本文向大家介绍基于Postgresql 事务的提交与回滚解析,包括了基于Postgresql 事务的提交与回滚解析的使用技巧和注意事项,需要的朋友参考一下 用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行begin;的话,一执行完就马上提交了,不能