2015-09-14 15 views
5

Attualmente sto lavorando sugli errori di registrazione in una procedura. L'obiettivo di questa procedura deve essere richiamato nei gestori di eccezioni negli altri pacchetti nel DB e registrare gli errori incontrati da ciascun programma. di seguito è il mio codice.numero di registrazione in oracolo

CREATE OR REPLACE PROCEDURE APMS.test_procedure AS 

    procedure write_error_log (errcode number, errstr varchar2) is 
    pragma autonomous_transaction; 
    -- this procedure stays in its own new private transaction 
    begin       
      INSERT INTO error_log 
       (ora_err_tmsp, 
         ora_err_number, 
         ora_err_msg, 
         ora_err_line_no) 
      values (CURRENT_TIMESTAMP, 
        errcode, 
        errstr, 
        'line number'); 
      COMMIT; -- this commit does not interfere with the caller's transaction. 
    end write_error_log; 

BEGIN 
    INSERT INTO mockdata 
     VALUES ('data1', 'mockname', 'mockcity'); 

    exception when others then    
    write_error_log(sqlcode,sqlerrm); 
    raise; 
END test_procedure; 
/

Attualmente sto solo indurre un errore nel mio tavolo mock_data per registrare l'errore nella tabella error_log e vedere se il suo funzionale ho appena dato non posso capire come registrare la colonna numero di riga. Sono un principiante assoluto quindi qualsiasi aiuto sarebbe apprezzato. Addizionalmente, se qualcuno sa come sarei in grado di utilizzare questa procedura in altri pacchetti/procedure per registrare gli errori in altri pacchetti sarebbe anche fantastico. Sono qui per imparare così ogni commento è apprezzato, posso approfondire ulteriormente questo post se non sono chiaro.

+0

Uso questo pacchetto da Steven Feurstein. Apparentemente non è più disponibile da Toad ma può essere trovato qui http://awads.net/wp/2007/08/08/new-oracle-plsql-error-management-framework-released/ Perché scrivilo quando puoi usare uno stabilito pacchetto? – kevinsky

+0

Grazie per le risorse, sfortunatamente, sto usando Toad e il mio superiore vorrebbe che imparassi e scrivessi la procedura per gli altri programmi da eseguire nel loro gestore di eccezioni. – Jules

risposta

2

Provare a utilizzare DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. È possibile cercare here per ulteriori informazioni.

Qualcosa del genere dovrebbe rendere il codice funziona:

CREATE OR REPLACE PROCEDURE APMS.test_procedure AS 

    procedure write_error_log (errcode number, errstr varchar2,errline varchar2) is 
    pragma autonomous_transaction; 
    -- this procedure stays in its own new private transaction 
    begin       
      INSERT INTO error_log 
       (ora_err_tmsp, 
         ora_err_number, 
         ora_err_msg, 
         ora_err_line_no) 
      values (CURRENT_TIMESTAMP, 
        errcode, 
        errstr, 
        errline); 
      COMMIT; -- this commit does not interfere with the caller's transaction. 
    end write_error_log; 

BEGIN 
    INSERT INTO mockdata 
     VALUES ('data1', 'mockname', 'mockcity'); 

    exception when others then    
    write_error_log(sqlcode,sqlerrm,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
    raise; 
END test_procedure; 
+0

Ho provato a scrivere che nella sezione valori così come il gestore delle eccezioni ... continuava a ricevere errori. Anche se leggerò ancora un po '. È possibile che lo stia usando in modo errato. – Jules

+0

giocato con quell'utilità, fantastico, grazie. – Jules

+0

Prego. Felice di aiutare. :) – Aramillo

1

Utilizzare la seguente per ottenere lo stack di chiamate:

  • dbms_utility.format_error_stack
  • dbms_utility.format_error_backtrace

Ad esempio,

SQL> declare 
    2 v1 integer := 1; 
    3 v2 integer := 0; 
    4 v3 integer; 
    5 procedure p1 (v1 in integer, v2 in integer, v3 out integer) is 
    6 begin 
    7  v3 := v1/v2; 
    8 end; 
    9 procedure p2 (v1 in integer, v2 in integer, v3 out integer) is 
10 begin 
11  p1 (v1, v2, v3); 
12 end; 
13 begin 
14 p2 (v1, v2, v3); 
15 exception 
16 when others then 
17  dbms_output.put_line ('---------------------'); 
18  dbms_output.put_line ('This is what you record in log table:'); 
19  dbms_output.put (dbms_utility.format_error_stack); 
20  dbms_output.put (dbms_utility.format_error_backtrace); 
21  dbms_output.put_line ('---------------------'); 
22  raise; 
23 end; 
24/
--------------------- 
This is what you record in log table: 
ORA-01476: divisor is equal to zero 
ORA-06512: at line 7 
ORA-06512: at line 11 
ORA-06512: at line 14 
--------------------- 
declare 
* 
ERROR at line 1: 
ORA-01476: divisor is equal to zero 
ORA-06512: at line 22