【发布时间】:2021-05-10 04:49:47
【问题描述】:
我已经使用雪花有一段时间了,但实际上并没有使用过涉及事务的存储过程,我需要使用流,其中一个案例是涉及一些业务逻辑,需要通过条件事务放入 sp回滚。我已经编写了一个这样的程序,但到目前为止还没有成功回滚。
这是我想要实现的东西的伪代码:
CREATE OR REPLACE PROCEDURE TEST_SP(STREAM_NAME varchar,RECORD_ID_KEY varchar)
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
var source_table_row1 = `SELECT RECORD_CONTENT::string from ${STREAM_NAME} limit 1;`;
var statement1 = snowflake.createStatement({sqlText:source_table_row1});
var raw_json='';
try
{
var result_set1=statement1.execute();
while (result_set1.next())
{
raw_json = result_set1.getColumnValue(1);
}
} catch(err)
{
var result = "Failed: Code: " + err.code + "\n State: " + err.state;
result += "\n Message: " + err.message;
return "detailed error is:"+result;
}
snowflake.execute({sqlText:"begin transaction"});
if(raw_json)
{
try
{
//run DDL & DML statmetents
var result_set2=snowflake.createStatement({sqlText:"DDL STMT"}).execute();
var rs=snowflake.createStatement({sqlText: "DML STMT"}).execute();
var rs2=snowflake.createStatement({sqlText: "FINAL DML STMT"}).execute();
}catch(err){
snowflake.execute ({sqlText: "rollback"});
var errorMessage= "Failed: Code: " + err.code + "\n State: " + err.state;
errorMessage += "\n Message: " + err.message+" with net_status="+net_status;
return errorMessage;
}
}
else
{
snowflake.execute({sqlText: "rollback"});
return "no data present in source table";
}
snowflake.execute({sqlText:"rollback"});
return "successfully completed "
$$;
这里的问题是,如果一切顺利,我可以看到 sp 执行所需的操作,但对于查询失败的情况(例如,尝试复制不存在的表单表)。 ,代码进入 catch 块,存储过程完成,但我看不到任何回滚活动因此发生。 有人可以告诉我我在这里想念什么。 谢谢。
【问题讨论】:
标签: stored-procedures snowflake-cloud-data-platform