【问题标题】:Teradata Stored Procedure - How to get error message text from error handlerTeradata 存储过程 - 如何从错误处理程序中获取错误消息文本
【发布时间】:2014-08-07 18:45:09
【问题描述】:

除了 SQLCODE 和 SQLSTATE 之外,有没有办法返回实际的错误消息文本?

当然,我可以通过 SQLCODE 在 DBC.ERRORMSGS 中查找错误消息,但显然我无法从那里解析与错误相关的对象名称。

铁。我能从 DBC.ERRORMSGS 得到的只是“对象 '%VSTR' 不存在。”

有没有办法解决对象名称,所以我会得到类似“对象 DATABASEXOXO.TABLEXOXO 不存在。”?

谢谢

【问题讨论】:

    标签: stored-procedures error-handling teradata


    【解决方案1】:

    Teradata 支持标准 SQL 的错误处理,即有一个“诊断区域”,其中一个字段是包含错误文本的 MESSAGE_TEXT。它通常在条件处理程序中使用 GET DIAGNOSTIC 语句访问,如下所示:

    GET DIAGNOSTICS EXCEPTION 1 myval = MESSAGE_TEXT;
    

    查看存储过程手册了解更多详细信息。

    【讨论】:

    • 非常感谢。您的回答为我指明了正确的方向。祝你有美好的一天!
    【解决方案2】:

    很遗憾,MESSAGE_TEXT 限制为 128 个字符。对于较新版本的 Teradata,单个列/表名称可以是 128 个字符。所以从诊断中你不能总是得到完整的错误信息。我知道的唯一其他方法是通过 dbc.qrylog.ErrorText。但是 qrylog 并不总是最新的,必须打开。

    【讨论】:

      【解决方案3】:
      create table log_table (log_msg varchar(2000), added_ts timestamp(0));
      
      replace procedure sp_error_test
      (
      IN in_database varchar(50), IN in_table varchar(50), IN in_column varchar(50)
      )
      begin
        declare l_sql varchar(2000);
        declare l_err varchar(2000);
      
        DECLARE EXIT HANDLER
        FOR SQLEXCEPTION
        BEGIN
          GET DIAGNOSTICS EXCEPTION 1 l_err = MESSAGE_TEXT;
          INSERT INTO log_table VALUES ( 'State: ' || :SQLSTATE || ' Code:' || :SQLCODE ||
            ' Msg: ' || l_err, Current_Timestamp(0));  
        END;
      
        -- dynamic sql to track execution of --
        set l_sql = 'update ' || in_database || '.' || in_table || 
          ' set ' || in_column || '=' || in_column || ' ';
        execute immediate l_sql;  
      end;
      
      call sp_error_test('Dbc','NON_EXISTENT_TABLE','non_existent_column');
      select top 100 * from log_table order by added_ts desc;
      

      输出:

      State: 42000 Code:  3807 Msg: Object 'DBC.NON_EXISTENT_TABLE' does not exist.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 2017-04-21
        • 2018-10-25
        相关资源
        最近更新 更多