Это то, чем я занимаюсь, извиняюсь перед тем, с кого это изначально пришло, я знаю, что взял это с какого-то сайта, но сейчас не могу вспомнить, где именно.
В подготовительном производстве у меня есть
create table caught_errors (
dt date,
username varchar2( 30), -- value from ora_login_user
msg varchar2(2000),
stmt varchar2(2000)
);
create or replace trigger catch_errors
after servererror on database
declare
sql_text ora_name_list_t;
msg_ varchar2(2000) := null;
stmt_ varchar2(2000) := null;
begin
for depth in 1 .. ora_server_error_depth loop
msg_ := msg_ || ora_server_error_msg(depth);
end loop;
for i in 1 .. ora_sql_txt(sql_text) loop
stmt_ := stmt_ || sql_text(i);
end loop;
insert into
caught_errors (dt , username ,msg ,stmt )
values (sysdate, ora_login_user,msg_,stmt_);
end;
/
Каждый раз, когда порождается servererror, оно перехватывается и регистрируется в таблице, я могу затем проверить эту таблицу, чтобы найти ошибочные запросы, и вернуть их по мере необходимости, чтобы увидеть отсутствующую таблицу (когда вы запускаете запрос в sqlplus, он будет расскажу за столом)
Заметьте, да, с этим есть проблемы, например, что, если catch_errors сброшен или выдает саму ошибку, вы можете получить рекурсивный цикл, поэтому он существует только при подготовке производства.