获取有关错误日志的更多信息

问题描述 投票:0回答:2

尝试在表中插入行时,无法获取有关错误的正确信息。 举个例子吧。

因此我们创建一个包含四 (04) 列的测试表。

drop table test_tab;
create table test_tab
(
var1 number(2)  ,
var2 number(2)  ,
var3 number(1)  ,
var4 number(2)
);

然后,我们创建一个日志表来记录插入的行与表要求(列大小)不匹配时的错误。

drop table test_tab_err_log;
begin
dbms_errlog.create_error_log(dml_table_name => 'test_tab'
, err_log_table_name => 'test_tab_err_log');
end;
/

然后,我们尝试向该表插入一行,但违反了第三列要求。

SQL> insert into test_tab
  2  select 0,0,25,0
  3  from dual
  4  log errors
  5  into test_tab_err_log ('INSERT')
  6  reject limit unlimited
  7  ;

0 rows created.

问题是,当我们获取导致错误的行时,返回的消息不会告诉我们哪一列引发了错误。

SQL> column ora_err_mesg$ format a80
SQL> select ora_err_number$, ora_err_mesg$ from test_tab_err_log;

ORA_ERR_NUMBER$ ORA_ERR_MESG$
--------------- --------------------------------------------------------------------------------
           1438 ORA-01438: value larger than specified precision allowed for this column

 real: 15
SQL> 

那么,有没有办法或解决方法可以知道 var3 列已被违反。

提前致谢,

sql oracle
2个回答
0
投票

我还没有真正使用过dbms_errlog,但是我通常用于异常日志的是:

dbms_output.put_line('Exception: ' ||SUBSTR(DBMS_UTILITY.format_error_stack(),1,4000));
dbms_output.put_line('Backtrace: ' ||SUBSTR(DBMS_UTILITY.format_error_backtrace,1,4000));

参考


0
投票

log errors into
不幸的是只记录了错误的行和列值以及错误号。它不会将完整错误堆栈中的
line
column
记录为伴随的 ORA-06550,当您记录错误时抛出正常异常:

ORA-06550: line 5, column 8:

这很不幸,因为通过这些信息,您可以找到 SQL 中错误所在的确切位置,并从中您可以找出错误所在的列。

dbms_utility.format_error_stack()
也没有帮助,因为这仅适用于 PL/SQL,并且嵌入 PL/SQL 中的 SQL 只会报告其在 PL/SQL 程序中的起始行位置,而不是 SQL 中的行和列,例如独立的 SQL 错误报告确实如此。

但是,鉴于

log errors into
确实显示了列值,假设您知道每列的数据类型限制和约束,简单的检查应该向人们显示问题所在。

© www.soinside.com 2019 - 2024. All rights reserved.