有没有办法如何在SQLCODE和SQLSTATE旁边返回实际的错误消息文本?
当然我可以通过SQLCODE在DBC.ERRORMSGS中查找错误消息,但显然我无法从那里解析与错误相关的对象名称。
的Fe。我从DBC.ERRORMSGS得到的只是'对象'%VSTR'不存在。'
有没有办法解决对象名称,所以我会得到类似'对象DATABASEXOXO.TABLEXOXO不存在'的内容。“
由于
答案 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.