snowflake-cloud-data-platform - 如何根据雪花中的返回值提交/回滚存储过程?
问题描述
我有一个返回布尔值的 javascript 存储过程。我希望能够在事务中调用此存储过程并在提交事务之前测试返回值。
BEGIN;
SET result = CALL my_stored_proc();
IF $result = true
COMMIT;
ELSE
ROLLBACK;
如果发生异常或者基于业务逻辑存在一些缺失值,存储过程将返回 false。
我如何在雪花中实现这一点?
编辑:我尝试了以下方法,但没有奏效。事务保持打开状态,并且在存储过程中执行的语句不会回滚,直到发出显式 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
如何回滚在存储过程中执行的语句?
解决方案
我建议通读本文档,因为它提供了几个示例和方法来满足您的要求。
https://docs.snowflake.com/en/sql-reference/stored-procedures-usage.html#transaction-management
推荐阅读
- python - 如何通过python按顺序获取所有时区日期
- java - 如何用 Java 编写这个用 C# 制作的逻辑?C#中返回的类型有哪些?
- javascript - Selenium 文件上传 - 定位器无效
- angular - 使用带有 Angular 状态的 Route.navigate 重新路由到新选项卡
- c# - Web API C# - 基于角色的访问
- laravel - Eloquent 会自行对我的结果进行排序
- r - 特殊字符问题?utf8towcs 错误。如何解决?
- java - 更改参数注释的值
- javascript - 如何遍历数组并每五秒执行一次回调函数?
- linux - 无法安装 gobject-introspection - 符号查找错误:和未定义的符号:g_unicode_type_get_type