2009-10-19 12 views
12

Sto lavorando su uno script pl-sql, in cui ho circa 10 conversioni TO_CHAR.C'è un modo per ottenere il numero di riga in cui è stata generata un'eccezione?

Uno di loro sta gettando un'eccezione

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

.

Attualmente, im la registrazione il messaggio con questo pezzo di codice

EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.put_line('Exception message is '||SQLERRM(sqlcode)); 
    ROLLBACK; 

Vorrei aggiungere (per lo più a scopo di debug) la linea in cui viene generata l'eccezione, al fine di ricevere un messaggio nella modulo di

ORA-06502: PL/SQL: numeric or value error: character string buffer too small (at line x) 

C'è un modo semplice per fare questo?

risposta

0

È possibile inserire il gestore di eccezioni attorno a ogni istruzione.

9

Le risposte hanno menzionato entrambi, $$PLSQL_LINE & DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. Ma vorrei aggiungere un po 'la differenza tra loro:

  1. Predefined Inquiry Directives$$PLSQL_LINE & $$PLSQL_UNIT
    PLSQL_LINE direttiva inchiesta predefinito è un valore letterale PLS_INTEGER che indica il numero di riga di riferimento a $$ PLSQL_LINE nell'unità di programma in corso.
    Dalla sua definizione, PLSQL_LINE non è adatto per la registrazione delle eccezioni poiché fornirà il numero di riga dell'eccezione, piuttosto che il numero di riga dell'errore occorso. Ciò rende difficile rilevare la posizione dell'errore soprattutto con unità di programma grandi, a meno che non si avvolga ogni istruzione con il gestore di eccezioni come dichiarato da Jeffrey.
    Tuttavia, la cosa buona di PLSQL_LINE, fornisce il numero senza la necessità di alcuna estrazione o analisi delle stringhe. Quindi, potrebbe essere più adatto per altri scopi di registrazione.
  2. DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
    Questa procedura visualizza lo stack di chiamate nel punto in cui è stata sollevata un'eccezione, anche se la procedura viene chiamata da un gestore di eccezioni in un ambito esterno.
    Il vantaggio di utilizzare questa procedura è che fornisce il numero esatto della riga nel programma utilizzando dove si verifica l'errore e non dove viene visualizzata la chiamata alla procedura Tuttavia, la procedura restituisce una stringa come ORA-XXXXX: at "<program_unit_name>", line xx.Quindi, se sei interessato a estrarre il numero di riga stesso, per qualsiasi scopo di registrazione desideri, dovrai analizzare la stringa.

Infine, per chiarire la differenza, di seguito sono due procedure, con lo stesso contenuto. È possibile eseguire e notare la differenza di uscita

CREATE OR REPLACE PROCEDURE proc_plsql_line 
    IS 
    BEGIN 
     RAISE VALUE_ERROR; 
    EXCEPTION 
     WHEN VALUE_ERROR 
     THEN 
      DBMS_OUTPUT.put_line ('Error raised in: '|| $$plsql_unit ||' at line ' || $$plsql_line || ' - '||sqlerrm); 
    END; 
/

E

CREATE OR REPLACE PROCEDURE proc_backtrace 
    IS 
    BEGIN 
     RAISE VALUE_ERROR; 
    EXCEPTION 
     WHEN VALUE_ERROR 
     THEN 
      DBMS_OUTPUT.put_line ('Error raised: '|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE || ' - '||sqlerrm); 
    END; 
/

Esecuzione:

exec proc_plsql_line; 

Error raised in: PROC_PLSQL_LINE at line 8 - ORA-06502: PL/SQL: numeric or value error 


exec proc_backtrace; 

Error raised: ORA-06512: at "PROC_BACKTRACE", line 4 - ORA-06502: PL/SQL: numeric or value error 
+2

questa dovrebbe essere la risposta "ACCEPTED"! –

0

La dichiarazione DBMS_UTILITY.format_error_backtrace vi darà il numero di riga

begin 
select 1/0 from dual; 
exception 
    when others then 
    dbms_output.put_line('ERROR_STACK: ' || DBMS_UTILITY.FORMAT_ERROR_STACK); 
    dbms_output.put_line('ERROR_BACKTRACE: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
end; 
Problemi correlati