我有一个构建在框架之上的应用程序;框架处理与数据库之间的所有通信和请求。我有Oracle 12c。
该应用程序是一个电子文档管理系统;我有一个文档在尝试提交时会生成一个错误,该错误不是由框架开始控制时就不言自明,该错误与DB提交过程有关。 我尝试检查与eDoc相关的特定表的约束/索引,但是没有运气。
在插入数据时如何从oracle本身获取更多日志,希望能更好地了解为什么会发生错误。
致谢
答案 0 :(得分:1)
如果您有一个可以在其中重现错误的测试数据库,则可以创建一个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, text) VALUES (1, 'Too long!!!') |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
所以
AFTER SERVERERRORS
触发器