首页 > 解决方案 > 我正在尝试对雪花存储过程进行尝试并捕获错误处理。在存储过程中有四种不同的语句

问题描述

我正在尝试对雪花存储过程进行错误处理。存储过程里面有4条SQL语句。我需要检查所有 for 语句的错误。当错误弹出时,我需要知道哪个 Statement 错误。如何做到这一点?提前致谢。我很感激。

 CREATE OR REPLACE PROCEDURE dw.sp_fidctp_audit_trail_load(SYSDATE varchar)
    RETURNS STRING
    LANGUAGE javascript
    AS
    
    ' 
    
    
      var sql_command = "truncate table STG.tb_fidctp_audit_trail_input";
      var result =  snowflake.execute ( {sqlText: sql_command, binds: [SYSDATE]});
      
        
      sql_command =`COPY INTO STG.tb_fidctp_audit_trail_input (record_id,ORDER_ID,PARENT_ORDER_ID,EVENT_TYPE,EVENT_DATETIME,PRIMARY_STATE,SECONDARY_STATE,CURRENT_SERVICE_ID,CURRENT_EXECUTOR_ID,TRADING_QUANTITY,LIMIT_PRICE,EVENT_TEXT,ORDER_NOTES,REASON_TEXT,ROUTED_ORDER_CODE,ROOT_ORDER_ID,INSTRUMENT_CODE,ORDER_SOURCE,LEAVES,ACCT_ID,CUST_CROSS_ID,ORDER_FLAGS)
             from @STG.CTP_STAGE/AUDIT_TRAIL.TOP.`;
   
      sql_command += SYSDATE;

      sql_command += ".psv.gz file_format = (FORMAT_NAME = ''STG.CTP_AUDIT_TRAIL_FF'', ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE, encoding = ''iso-8859-1'') ";
      
      try{
       result = snowflake.execute (
              {sqlText: sql_command, binds: [SYSDATE]}
              );
          return "Succeeded.";   // Return a success/error indicator.
          }
      catch (err)  {
          return "Failed: " + err + "ERROR ON COPY STATEMENT";   // Return a success/error indicator.
          }
        
        
        sql_command = `delete from DW.tb_fidctp_audit_trail
                 where  SYSDATE = to_date((:1), ''YYYYMMDD'')`;
        result =  snowflake.execute ( {sqlText: sql_command, binds: [SYSDATE]});
      
     
                
        sql_command = ` insert into DW.tb_fidctp_audit_trail(sysdate, order_id, parent_order_id, root_order_id, event_datetime, instrument_code, event_text,reason_text, current_service_id, current_executor_id, trading_quantity, leaves )
                   select  to_date(left(event_datetime, 8), ''YYYYMMDD''), order_id, parent_order_id, root_order_id, to_timestamp(left(event_datetime, 24), ''YYYYMMDD HH24:MI:SS.FF''), instrument_code, event_text, reason_text, current_service_id, current_executor_id, cast(trading_quantity as NUMBER(18,0)), cast(leaves as NUMBER(18,0))
                  from  STG.tb_fidctp_audit_trail_input
                 `;
         try{
          snowflake.execute (
              {sqlText: sql_command, binds: [SYSDATE]}
              );
          return "Succeeded.";   // Return a success/error indicator.
          }
      catch (err)  {
          return "Failed: " + err + "ERROR ON INSERT STATEMENT";   // Return a success/error indicator.
          }
        
      
   
    
   '
    ;

标签: snowflake-cloud-data-platform

解决方案


这里有几件事要做。让我们从创建标头开始:

 CREATE OR REPLACE PROCEDURE dw.sp_fidctp_audit_trail_load(SYSDATE varchar)
    RETURNS STRING
    LANGUAGE javascript
    AS
    
    ' 

当您使用单引号将 JavaScript 过程的主体括起来时,这使得在主体内部的 SQL 语句中使用单引号非常麻烦,不得不将单引号加倍。为避免这种情况,您可以在 Snowflake 中使用备用字符串终止符,$$如下所示:

CREATE OR REPLACE PROCEDURE dw.sp_fidctp_audit_trail_load(SYSDATE varchar)
  RETURNS STRING
  LANGUAGE javascript
  AS
$$
  // Body goes here. There's no longer a need to escape single quotes
$$; 

返回值的问题在于这部分:

      return "Succeeded.";   // Return a success/error indicator.
      }
  catch (err)  {
      return "Failed: " + err + "ERROR ON COPY STATEMENT";   // Return a success/error indicator.
      }

在 JavaScript 中,当return在 main 函数中使用该语句时,它会离开 main 函数,从而终止存储过程。这意味着如果复制语句成功,该过程将退出并返回“Succeeded”。如果复制语句失败,它将命中不同的返回语句并退出并显示错误消息。

无论哪种方式,它都会在该代码块之后终止执行。

return语句从 try/catch 块的成功分支中取出,最后一个除外。


推荐阅读