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