Google bigquery 将@@error.stack_跟踪保存在表中以便记录

Google bigquery 将@@error.stack_跟踪保存在表中以便记录,google-bigquery,Google Bigquery,我正在google BigQuery中创建一个数据仓库解决方案。 我想做的是创建一个日志表,这样我就可以查看数据更改过程的结果。但也能够在不干扰程序的情况下查看出了什么问题 在脚本中,我引发异常以捕获错误,并使用单独的过程更新日志表。唯一的问题是我无法保存错误的@error.stack_跟踪部分。它是我想保存在字符串中的数组值。虽然我将用户数组_改为字符串(@@error.stack_trace,'-#-')用于更改值,但它会在数组_改为字符串错误时不断遇到错误。 下面是我的过程和错误消息 我存

我正在google BigQuery中创建一个数据仓库解决方案。 我想做的是创建一个日志表,这样我就可以查看数据更改过程的结果。但也能够在不干扰程序的情况下查看出了什么问题

在脚本中,我引发异常以捕获错误,并使用单独的过程更新日志表。唯一的问题是我无法保存错误的@error.stack_跟踪部分。它是我想保存在字符串中的数组值。虽然我将用户数组_改为字符串(@@error.stack_trace,'-#-')用于更改值,但它会在数组_改为字符串错误时不断遇到错误。 下面是我的过程和错误消息

我存储@@error.stack_跟踪的表字段是字符串类型

在此方面的任何帮助都将不胜感激

脚本:

begin 

    Declare oQuery String;                                                  
    DECLARE oCntr int64 default 0;                                          
    Declare oProcedures String;                    
    declare oIdentifier,oIdentifierNr int64;    
    declare oDataset STRING;
    declare oProcedure STRING;
    declare oStartingTime TIMESTAMP;
 --   declare oStartingTimeStep TIMESTAMP;  → this was the reason for the error
    declare oEndTime TIMESTAMP;
    declare oDuration STRING;   
    declare oStepNumber int64;  
    declare oError STRING;
    declare oErrorMessag STRING;
    declare oErrorStackTrace STRING;
    declare oErrorStatement STRING;

    begin         set oStepNumber = 0;
        set oDataset = '01_Processing';
        set oProcedure = 'ExecuteProcedure';
        set oStartingTime = current_timestamp() ;
        call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTime,oEndTime,oDuration,oStepNumber,oError,oErrorMessag,oErrorStackTrace,oErrorStatement,oIdentifier);
 
        
        begin 
            set oStartingTimeStep = current_timestamp() ;
            set oStepNumber = 1;
            set oIdentifierNr = null;
            call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTimeStep,oEndTime,oDuration,oStepNumber,oError,oErrorMessag,oErrorStackTrace,oErrorStatement,oIdentifierNr);

            set oProcedures = (
                select 
                    ARRAY_TO_STRING(ARRAY_AGG('\t call `'||a.dataset||'.'||a.procedure||'`(); \n'  order by a.order),'' )
                from `pfg-datawarehouse-test.01_Processing.ExcecutionOrder` a
                where a.active = true
                );

            set oEndTime = current_timestamp() ;
            set oDuration = cast(timestamp_diff(oEndTime,oStartingTime,second) as string) ;
            call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTimeStep,oEndTime,oDuration,oStepNumber,oError,oErrorMessag,oErrorStackTrace,oErrorStatement,oIdentifierNr);
            
            EXCEPTION WHEN ERROR THEN
                set oEndTime = current_timestamp() ;
                set oDuration = cast(timestamp_diff(oEndTime,oStartingTime,second) as string) ;
                call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTime,oEndTime,oDuration,oStepNumber,
                    @@error.formatted_stack_trace,@@error.message,ARRAY_TO_STRING(@@error.stack_trace, '-#-'),@@error.statement_text,oIdentifierNr);

        end;

        begin 
            set oStartingTimeStep = current_timestamp() ;
            set oStepNumber = 2;
            set oIdentifierNr = null;
            call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTimeStep,oEndTime,oDuration,oStepNumber,oError,oErrorMessag,oErrorStackTrace,oErrorStatement,oIdentifierNr);

            set oQuery = 'CREATE or replace PROCEDURE `01_Processing.ExecuteProcedureDynamicly`() \n'||'begin \n' || oProcedures || 'end' ;
            

            EXECUTE IMMEDIATE oQuery;

           set oEndTime = current_timestamp() ;
            set oDuration = cast(timestamp_diff(oEndTime,oStartingTime,second) as string) ;
            call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTimeStep,oEndTime,oDuration,oStepNumber,oError,oErrorMessag,oErrorStackTrace,oErrorStatement,oIdentifierNr);

            EXCEPTION WHEN ERROR THEN
                set oEndTime = current_timestamp() ;
                set oDuration = cast(timestamp_diff(oEndTime,oStartingTime,second) as string) ;
                call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTime,oEndTime,oDuration,oStepNumber,
                    @@error.formatted_stack_trace,@@error.message,ARRAY_TO_STRING(@@error.stack_trace, '-#-'),@@error.statement_text,oIdentifier);
  
        end;   
    
        call `01_Processing.ExecuteProcedureDynamicly`();

       set oEndTime = current_timestamp() ;
        set oDuration = cast(timestamp_diff(oEndTime,oStartingTime,second) as string) ;
        set oStepNumber = 0;
        call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTime,oEndTime,oDuration,oStepNumber,oError,oErrorMessag,oErrorStackTrace,oErrorStatement,oIdentifier);

        EXCEPTION WHEN ERROR THEN
            set oEndTime = current_timestamp() ;
            set oDuration = cast(timestamp_diff(oEndTime,oStartingTime,second) as string) ;
            call `01_Processing.logProcedure`(oDataset,oProcedure,oStartingTime,oEndTime,oDuration,oStepNumber,
                   @@error.formatted_stack_trace,@@error.message,ARRAY_TO_STRING(@@error.stack_trace, '-#-'),@@error.statement_text,oIdentifier);
    end;


    
end
错误消息:

No matching signature for function ARRAY_TO_STRING for argument types: ARRAY<STRUCT<line INT64, column INT64, filename STRING, ...>>, STRING. Supported signatures: ARRAY_TO_STRING(ARRAY<STRING>, STRING, [STRING]); ARRAY_TO_STRING(ARRAY<BYTES>, BYTES, [BYTES]) at xxxx
参数类型:数组、字符串的函数数组\u到\u字符串没有匹配的签名。支持的签名:数组到字符串(数组,字符串,[STRING]);xxxx处的数组到字符串(数组,字节,[字节])