oracle表插入事务日志 测试一下...

我有一个构建在框架之上的应用程序;框架处理与数据库之间的所有通信和请求。我有Oracle 12c。

该应用程序是一个电子文档管理系统;我有一个文档在尝试提交时会生成一个错误,该错误不是由框架开始控制时就不言自明,该错误与DB提交过程有关。 我尝试检查与eDoc相关的特定表的约束/索引,但是没有运气。

在插入数据时如何从oracle本身获取更多日志,希望能更好地了解为什么会发生错误。

致谢

ancen1978 回答:oracle表插入事务日志 测试一下...

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

如果在生产环境中尝试使用此方法,则可能给所有访问数据库的用户和应用程序带来大规模问题,特别是如果您犯了一个错误。 强烈建议在dev / QA实例中执行此操作!

下面是一个简短的示例:

-- 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;

测试一下...

-- 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,'Too long!!!') |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+

所以

  1. 创建AFTER SERVERERRORS触发器
  2. 重现您的错误
  3. 检查触发器写入的表
本文链接:https://www.f2er.com/3149362.html

大家都在问