Teradata存储过程 - 如何从错误处理程序获取错误消息文本

时间:2014-06-17 16:40:48

标签: stored-procedures error-handling teradata

有没有办法如何在SQLCODE和SQLSTATE旁边返回实际的错误消息文本?

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

的Fe。我从DBC.ERRORMSGS得到的只是'对象'%VSTR'不存在。'

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

由于

3 个答案:

答案 0 :(得分:2)

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

GET DIAGNOSTICS EXCEPTION 1 myval = MESSAGE_TEXT;

查看存储过程手册以获取更多详细信息。

答案 1 :(得分:0)

不幸的是,MESSAGE_TEXT限制为128个字符。对于较新版本的Teradata,单个列/表名称可以是128个字符。因此,从诊断中,您无法始终获得完整的错误消息。我所知道的另一种方法是通过dbc.qrylog.ErrorText。但qrylog并不总是最新的,必须打开。

答案 2 :(得分:0)

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.