lunedì 16 settembre 2013

Ricavare dettaglio Errore in Oracle


Il software vi da un errore Oracle e non potete andare in debug  (o non volete perchè ci vuole troppo), ecco una utile soluzione.
Tacciare gli errori oracle mediante un trigger che si attiva al servererror

create table track_detail (val varchar2(4000));

create or replace procedure track (p_text IN VARCHAR2) IS
  PRAGMA AUTONOMOUS_TRANSACTION;
begin
  insert into track_detail(val)
  values (p_text);
  commit;
end;

create or replace TRIGGER log_err after servererror on schema
DECLARE
  v_temp VARCHAR2(2000) := substr(dbms_utility.format_error_stack,1,2000);
  v_num NUMBER;
  v_sql_text ora_name_list_t;
begin
  v_temp := translate(v_temp,'''','"');
  track(v_temp);
  v_num  := ora_sql_txt(v_sql_text);
  v_temp := null;
  BEGIN
    FOR i IN 1..v_num LOOP
      v_temp := v_temp || v_sql_text(i);
    END LOOP;
  EXCEPTION
    WHEN VALUE_ERROR THEN NULL;
  END;
  v_temp := translate(v_temp,''''||chr(0)||chr(10),'"');
  track(v_temp);
end;

dopo una bella
select * from track_detail

vi fornirà errore e select che l'applicativo vuole richiamare e la potete lanciare da un query browser o altro ide.

Attenzione: Eliminare dopo l'uso il trigger e la tabella
drop trigger LOG_ERR;

drop table TRACK_DETAIL;

Nessun commento: