在雪花中调用多个存储过程的处理异常

时间:2020-01-20 11:01:25

标签: javascript stored-procedures snowflake-cloud-data-platform

我有3个存储过程。我有一个编排存储过程,其中包含带有try catch块的错误处理程序。在每个catch块中,我已将自定义错误登录到日志表中以记录错误,然后调用return()退出。

但是,当我从业务流程存储过程调用这3个存储过程时,如果引发任何错误/异常,它将记录日志,然后从该存储过程退出。然后,它开始执行下一个存储过程。

但是,在我的情况下,如果业务流程存储过程中的任何一个存储过程中都引发了任何异常,我也希望它退出并停止执行下一个过程。然后应该退出ORCH_SP。

我该如何实现?

CREATE OR REPLACE PROCEDURE ORCH_SP()       
RETURN VARCHAR LANGUAGUE JAVASCRIPT      
AS $$ {      
    P1();       
    P2();       
    P3();       
} $$;      

2 个答案:

答案 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中显示,过程可能会因抛出错误而终止,而不是显式返回。

可以用以下格式编写基础过程(P1P2P3),其中引发自动成为终止而无需捕获,并且保留任何直接或间接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使用和子功能实现错误处理的方式。