雪花存储在使用抛出错误而不是返回错误时给出不同的错误

Posted

技术标签:

【中文标题】雪花存储在使用抛出错误而不是返回错误时给出不同的错误【英文标题】:snowflake stored giving different error when used throw error instead of return error 【发布时间】:2021-09-28 19:24:49 【问题描述】:

我有一个存储过程,它从外部阶段加载数据并使用任务调用。当存储过程出错时,我想让任务失败。正如答案How to make the task fail when the calling stored procedure throws an error 中所说,我使用throw err.message 而不是return err.message。这里是示例代码。

returns varchar not null
language javascript
execute as caller
as
$$
try

      try
        
         var create_table=snowflake.cresteStatement(sqlText:`create or replace table tableB like 
                                               tableA`);
          create_table.execute();
        
     catch(err)
        
          var query_id = create_table.getQueryId();
          var query_txt = create_table.getSqlText();
          var log_insert = snowflake.createStatement(sqlText:`insert into error_table
               (code, message, queryid, querytext) VALUES (?,?,?,?);`
               ,binds : [err.code, err.message,queryId,queryText]);
              log_insert.execute();
         throw err.message
        
      var copy_cmd = `copy into tableb from @myext_stg/<folder>
                      file_format=(format_name='my_csv_format')
                      files=('/file_name')
                      on_error=skip_file;`;
      var copy_stmt = snowflake.createStatement(sqlText: copy_cmd)
      var copy_stmt_result = copy_stmt.execute();
          copy_stmt_result.next()
      if(copy_stmt_result.getColumnValue(2)=='LOADED')
        
          var swap_cmd = `alter table tableB swap with tableA;`;
          var swap_stmt = snowflake.createStatement(sqlText: swap_cmd);
          swap_stmt.execute();
        
     else if(copy_stmt_result.getColumnValue(2)=='LOAD_FAILED')
       
         var err_message= result_set.getColumnValue(7);
        var queryId = copy_cmd_stmt.getQueryId();
        var queryText = copy_cmd_stmt.getSqlText();
        var log_insert_into=snowflake.createStatement(sqlText:`insert into error_table
         (code, message, queryid, querytext) VALUES (?,?,?,?);`
         ,binds : [err.code, err_message,queryId,queryText]
          );
         throw `$err_message`
       
 
catch(err)

  throw `final error: $err.message`

$$;

但我收到以下错误:“JavaScript 执行错误:在 MYPROCEDURE 中未捕获未定义的 ' throw final error: $err.message' 位置 1 stackstrace:MYPROCEDURE 行:26。”但实际错误是,架构中有名称为 tableA 的源表。 另一个错误显示为未捕获的错误:不支持的绑定参数类型。但实际错误是该位置不存在文件。 正如问题Snowflake Stored Procedure Exception & Failure 中所回答的那样,在我的情况下,如何防止抛出产生新错误也是如此。 任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

如错误信息所示,变量err在这里未定义:

[err.code, err_message,queryId,queryText]

直到这里的 catch 块才定义该变量:

catch(err)

  throw `final error: $err.message`

在导致错误的行中,您将它放在if 语句的else 块中。这不是 JavaScript 错误条件。它仅检测向 JavaScript 报告为正常变量状态的加载失败。

您应该在此处插入有关加载失败原因的其他可用信息,而不是 err

var log_insert_into=snowflake.createStatement(sqlText:`insert into error_table
         (code, message, queryid, querytext) VALUES (?,?,?,?);`
         ,binds : [err.code, err_message,queryId,queryText]
          );

【讨论】:

以上是关于雪花存储在使用抛出错误而不是返回错误时给出不同的错误的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试使用雪花存储过程执行更改命令时给出错误?

Python Glue 作业 - 雪花存储过程未返回确切的错误消息

雪花存储过程变量绑定错误

ICacheLock 上的 Apache Ignite.NET TryEnter 在网络通信错误时返回 false 而不是抛出异常

尝试获取不同值时雪花 JSON 未知关键字错误

Oracle数据库时间戳(6)转换为雪花timestamp_ntz时抛出错误