首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle表插入事务日志

oracle表插入事务日志
EN

Stack Overflow用户
提问于 2019-11-06 19:42:53
回答 1查看 595关注 0票数 0

我有一个构建在框架之上的应用程序;该框架处理与DB的所有通信和请求。我有甲骨文12c。

应用程序是一个电子文档管理系统;我有一个文档在尝试提交时会产生一个错误,这个错误并不像begin那样自明,而是由框架控制的,与DB提交过程相关的错误。我试图检查与eDoc相关的特定表的约束/索引,但没有结果。

在插入数据时,我如何从oracle本身获得更多日志,希望我能够更好地了解错误发生的原因。

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-06 20:11:20

如果您有一个可以重现错误的测试数据库,则可以创建一个AFTER SERVERERROR触发器来记录发生的任何错误。

如果您在生产中尝试此操作,则所有访问数据库的用户和应用程序都将面临大规模问题,特别是如果您犯了错误。强烈建议在dev/QA实例中使用

下面是如何做到这一点的一个简短的例子:

代码语言:javascript
复制
-- Create a table to hold the error log
CREATE TABLE matt1_errors (
    error_ts        TIMESTAMP,
    stacktrace      VARCHAR2(4000),
    sql_stmt        VARCHAR2(4000)); 
/

-- Create a trigger to log any server errors that occur
CREATE TRIGGER matt_log_errors AFTER SERVERERROR ON DATABASE
DECLARE
  l_sql_pieces_list DBMS_STANDARD.ora_name_list_t;
  piece_count PLS_INTEGER;
  l_sql_text VARCHAR2(4000);
BEGIN
  piece_count := ora_sql_txt(l_sql_pieces_list);

  FOR i IN 1..piece_count LOOP
    l_sql_text := substr(l_sql_text || l_sql_pieces_list(i), 1, 4000);
  END LOOP;

  INSERT INTO matt1_errors ( error_ts, stacktrace, sql_stmt)
     VALUES (SYSTIMESTAMP, dbms_utility.format_error_stack, l_sql_text);

EXCEPTION 
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE (dbms_utility.format_error_stack);
END;

测试一下..。

代码语言:javascript
复制
-- Create a table to insert into.
CREATE TABLE matt1 ( id NUMBER, text VARCHAR2(4) );
-- Cause an error.
insert into matt1 (id, text) VALUES (1, 'Too long!!!');

-- See what we got...
select * from matt1_errors;


+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
|            ERROR_TS             |                                      STACKTRACE                                      |                        SQL_STMT                        |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
| 06-NOV-19 03.02.18.083116000 PM | ORA-12899: value too large for column "APPS"."MATT1"."TEXT" (actual: 11, maximum: 4) | insert into matt1 (id, text) VALUES (1, 'Too long!!!') |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+

所以,

trigger

  • Reproduce
  1. 创建AFTER SERVERERRORS
  2. 检查触发器写入

的表

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58737431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档