首页 > 数据库 > Oracle > 用触发器捕捉数据库所有报错sql
|
create or replace trigger t_error_sql
after SERVERERROR on database
when (user not in('SYS') and ora_sysevent not in ('COMMENT'))
declare
n int; --n个的意思
sql_text ora_name_list_t;
--v_sql clob; ORA_SQL_TXT读取到的sql含“/*中文*/”会乱码,clob装载这些乱码会报错
v_sql varchar(32767); --有可能读取到乱码
v_error varchar2(30);
begin
IF (IS_SERVERERROR(0942)) THEN
v_error := '0942';
end if;
if v_error is not null then
n := ORA_SQL_TXT(sql_text);
--sql_text(i)过了51就会报错,受不了这么大的值
if n < 51 then
for i in 1 .. n loop
--dbms_output.put_line(sql_text(i));
v_sql := v_sql || sql_text(i);
end loop;
end if;
insert /*+append*/
into util_error_log
values
(user,
sys_context('userenv', 'host'),
sys_context('userenv', 'os_user'),
sys_context('userenv', 'ip_address'),
v_error,
sysdate,
v_sql); --也有补获不到sql的情况
end if;
/*exception --调试信息
when others then
dbms_output.put_line(n);
raise_application_error(-20000,
sqlerrm || ' ' ||
dbms_utility.format_error_backtrace() || ' N:' || n);*/
end t_error_sql;
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30109892/viewspace-1993180/ ,如需转载,请注明出处,否则将追究法律责任。