You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake中如何将存储过程执行信息及报错记录到日志表

存储过程错误捕获与日志写入实现方案

完全可以实现需求,核心是在业务存储过程(如你提到的SP1)中加入数据库原生的异常捕获块,提前记录存储过程启动时间、传入参数等上下文,执行过程中触发异常时,将捕获到的错误信息直接传入日志存储过程LOG_STORED_PROCEDURE写入即可。


不同数据库实现示例

1. SQL Server 版本

SQL Server使用TRY...CATCH块捕获异常,CATCH块内可调用系统错误函数获取完整错误信息:

CREATE OR ALTER PROCEDURE SP1
    @Param1 INT,
    @Param2 VARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON;
    -- 预存日志所需上下文参数
    DECLARE 
        @StartTime DATETIME = GETDATE(),
        @Params VARCHAR(MAX) = CONCAT('@Param1=',@Param1,', @Param2=',@Param2),
        @ErrorMsg VARCHAR(MAX);

    BEGIN TRY
        -- 此处编写SP1原有业务逻辑
        SELECT 1/0; -- 模拟异常的测试代码,实际使用可删除

        -- 执行无异常,写入正常执行日志
        EXEC LOG_STORED_PROCEDURE
            @PROCEDURE_NAME = 'SP1',
            @PARAMETERS_PASSED = @Params,
            @START_TIME = @StartTime,
            @END_TIME = GETDATE(),
            @ERROR_MESSAGE = '';
    END TRY
    BEGIN CATCH
        -- 组装完整错误信息
        SET @ErrorMsg = CONCAT('错误号:',ERROR_NUMBER(),', 错误描述:',ERROR_MESSAGE(),', 出错行号:',ERROR_LINE());
        -- 写入错误日志
        EXEC LOG_STORED_PROCEDURE
            @PROCEDURE_NAME = 'SP1',
            @PARAMETERS_PASSED = @Params,
            @START_TIME = @StartTime,
            @END_TIME = GETDATE(),
            @ERROR_MESSAGE = @ErrorMsg;
        -- 可选:将错误抛回给上层调用方
        THROW;
    END CATCH
END

2. MySQL 版本

MySQL使用DECLARE HANDLER FOR SQLEXCEPTION捕获异常,配合GET DIAGNOSTICS获取错误详情:

DELIMITER //
CREATE PROCEDURE SP1(IN Param1 INT, IN Param2 VARCHAR(50))
BEGIN
    -- 预存日志所需上下文参数
    DECLARE StartTime DATETIME DEFAULT NOW();
    DECLARE Params VARCHAR(1000) DEFAULT CONCAT('Param1=',Param1,', Param2=',Param2);
    DECLARE ErrorMsg VARCHAR(1000);
    -- 声明异常捕获逻辑
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        -- 获取错误信息
        GET DIAGNOSTICS CONDITION 1 ErrorMsg = MESSAGE_TEXT;
        -- 写入错误日志
        CALL LOG_STORED_PROCEDURE('SP1', Params, StartTime, NOW(), ErrorMsg);
        -- 可选:回滚业务事务并抛出错误
        ROLLBACK;
        RESIGNAL;
    END;

    -- 此处编写SP1原有业务逻辑
    SELECT 1/0; -- 模拟异常的测试代码,实际使用可删除

    -- 执行无异常,写入正常执行日志
    CALL LOG_STORED_PROCEDURE('SP1', Params, StartTime, NOW(), '');
END //
DELIMITER ;

3. Oracle 版本

Oracle使用EXCEPTION块捕获异常,通过SQLCODE、SQLERRM获取错误信息:

CREATE OR REPLACE PROCEDURE SP1(Param1 NUMBER, Param2 VARCHAR2)
AS
    StartTime DATE := SYSDATE;
    Params VARCHAR2(1000) := 'Param1='||Param1||', Param2='||Param2;
    ErrorMsg VARCHAR2(1000);
BEGIN
    -- 此处编写SP1原有业务逻辑
    SELECT 1/0 FROM DUAL; -- 模拟异常的测试代码,实际使用可删除

    -- 执行无异常,写入正常执行日志
    LOG_STORED_PROCEDURE('SP1', Params, StartTime, SYSDATE, '');
EXCEPTION
    WHEN OTHERS THEN
        -- 组装完整错误信息
        ErrorMsg := '错误码:'||SQLCODE||', 错误描述:'||SQLERRM;
        -- 写入错误日志
        LOG_STORED_PROCEDURE('SP1', Params, StartTime, SYSDATE, ErrorMsg);
        -- 可选:将错误抛回给上层调用方
        RAISE;
END;
/

注意事项

  • 日志存储过程建议使用独立事务(Oracle可声明自治事务,SQL Server/MySQL可在日志存储过程内单独处理事务提交),避免业务逻辑回滚时连带日志记录被回滚
  • 拼接参数时注意对特殊字符做转义处理,避免参数中的引号、特殊符号导致拼接异常
  • 日志表的ERROR_MESSAGE字段建议设置足够大的长度(如MAX类型、TEXT类型),避免长错误信息被截断

内容的提问来源于stack exchange,提问作者RMC_DEV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:15:01