我有3个存储过程。我有一个编排存储过程,其中包含带有try catch块的错误处理程序。在每个catch块中,我已将自定义错误登录到日志表中以记录错误,然后调用return()
退出。
但是,当我从业务流程存储过程调用这3个存储过程时,如果引发任何错误/异常,它将记录日志,然后从该存储过程退出。然后,它开始执行下一个存储过程。
但是,在我的情况下,如果业务流程存储过程中的任何一个存储过程中都引发了任何异常,我也希望它退出并停止执行下一个过程。然后应该退出ORCH_SP。
我该如何实现?
CREATE OR REPLACE PROCEDURE ORCH_SP()
RETURN VARCHAR LANGUAGUE JAVASCRIPT
AS $$ {
P1();
P2();
P3();
} $$;
答案 0 :(得分:0)
如何将try / catch块引入ORCH_SP()并检查对子SP的每次调用的返回值,以确定是否在生成(并退出)时再次抛出错误-或继续调用下一个SP ...下面是一个简化的示例,粗略地说明了该方法:
CREATE OR REPLACE PROCEDURE ORCH_SP()
RETURNS VARCHAR LANGUAGE JAVASCRIPT
AS $$ {
var return_msg = "";
try {
var sp_call = "call P1()";
var result = snowflake.execute({sqlText: sp_call});
result.next();
var return_msg = result.getColumnValue(1);
if (return_msg!='SUCCESS') {
throw return_msg;
}
else {
// call P2() and P3() from here...
// perhaps in their own try/catch blocks
}
}
catch (err) {
return return_msg;
}
return return_msg;
} $$;
CREATE OR REPLACE PROCEDURE P1()
RETURNS varchar
LANGUAGE javascript
AS $$ {
var result = "SUCCESS";
try {
// comment/uncomment the next line to simulate success/failure
throw 'naughty naughty';
}
catch (err) {
result = err;
}
return result;
} $$; ```
答案 1 :(得分:0)
Mike has already answered通过检查返回的值是否存在内容错误,您可以在上面做出最直接的更改。以下只是添加另一种可能的方法。
-
在some of examples within the Snowflake documentation中显示,过程可能会因抛出错误而终止,而不是显式返回。
可以用以下格式编写基础过程(P1
,P2
,P3
),其中引发自动成为终止而无需捕获,并且保留任何直接或间接CALL的错误上下文:
CREATE OR REPLACE PROCEDURE P1()
RETURN VARCHAR LANGUAGUE JAVASCRIPT
AS $$ {
// (… logic …)
if (faultyCondition) {
throw 'p1 failure reason';
}
} $$;
-- Repeat above pattern for (P2, P3, etc.)
然后可以通过以下方式编写调用父过程,并且将在发生任何错误时停止执行而不是继续执行:
CREATE OR REPLACE PROCEDURE ORCH_SP()
RETURN VARCHAR LANGUAGUE JAVASCRIPT
AS $$ {
try {
// Note: Add more args / call directly as necessary for real-life use
function run(call_name) {
snowflake.createStatement({ sqlText: `CALL $call_name();` }).execute();
}
run("P1");
run("P2");
run("P3");
// (… other logic …)
} catch (err) {
result = err;
}
return result;
} $$;
此模式更符合通常使用try-catch使用和子功能实现错误处理的方式。