• tracciare gli errori in PL/SQL

    Tracciare gli errori in PL/SQL

    A partire dalla versione 10g di Oracle, PL/SQL mette a disposizione la funzione DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, che costituisce un significativo passo avanti per la gestione delle eccezioni e per tracciare gli errori.

    Come vengono gestite le eccezioni?

    Quando viene lanciata un’eccezione, una delle informazioni più importanti da capire è quale linea di codice l’ha scatenata. Prima di Oracle 10g, l’unico modo per farlo era non gestire l’eccezione.

    Rivediamo il comportamento di gestione delle eccezioni nel Database Oracle 9i. Il codice che segue mostra tre stored procedures: proc3 chiama proc2, che a sua volta chiama proc1. Quest’ultima lancia l’eccezione NO_DATA_FOUND.

    CREATE OR REPLACE PROCEDURE proc1 IS
    BEGIN
      DBMS_OUTPUT.put_line ('esecuzione proc1');
      RAISE NO_DATA_FOUND;
    END;
    /
    
    CREATE OR REPLACE PROCEDURE proc2 IS
    BEGIN
      DBMS_OUTPUT.put_line ('esecuzione proc2: chiamata a proc1');
      proc1;
    END;
    /
    
    CREATE OR REPLACE PROCEDURE proc3 IS
    BEGIN
      DBMS_OUTPUT.put_line ('esecuzione proc3: chiamata a proc2');
      proc2;
    END;
    /

     

    Se si esegue la proc3 da un client Oracle, ad esempio da SQL Developer, si vedrà il seguente risultato:

    Errore con inizio alla riga : 2 nel comando –
    exec proc3
    Report error –
    ORA-01403: no data found
    ORA-06512: at “HR.PROC1”, line 4
    ORA-06512: at “HR.PROC2”, line 4
    ORA-06512: at “HR.PROC3”, line 4
    ORA-06512: at line 1
    01403. 00000 – “no data found”
    *Cause: No data was found from the objects.
    *Action: There was no data from the objects which may be due to end of fetch.
    esecuzione proc3: chiamata a proc2
    esecuzione proc2: chiamata a proc1
    esecuzione proc1

     

    Questo è lo stack trace degli errori di un’eccezione non gestita, che mostra che l’errore è stato generato nella riga 4 di proc1. Da un lato, con questa informazione è possibile intervenire sul codice e risolvere il problema. Dall’altro lato, si è ottenuta questa informazione solo perché l’eccezione non è stata gestita. Ma di solito, le eccezioni occorre gestirle.
    Se infatti modifcassi la proc3 e gestissi l’eccezione nel seguente modo, cosa succederebbe andando ad eseguire proc3?

    CREATE OR REPLACE PROCEDURE proc3
    IS
    BEGIN
      DBMS_OUTPUT.put_line ('esecuzione proc3: chiamata a proc2');
      proc2;
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.put_line (DBMS_UTILITY.FORMAT_ERROR_STACK);
    END;
    /

    DBMS_UTILITY.FORMAT_ERROR_STACK non mostra l’intero error stack con i numeri di riga. SQLERRM opera nello stesso modo.

    esecuzione proc3: chiamata a proc2
    esecuzione proc2: chiamata a proc1
    esecuzione proc1
    ORA-01403: no data found

    Utilizzo di DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

    Con la versione Oracle Database 10g, è stata introdotta la funzione DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, che mostra lo stack nel punto in cui l’eccezione è stata lanciata. Chiamare DBMS_UTILITY.FORMAT_ERROR_BACKTRACE all’interno di un blocco di gestione dell’eccezione in cima allo stack fornisce l’informazione relativa a dove è stato generato l’errore.
    Aggiorniamo quindi proc3 con la chiamata a DBMS_UTILITY.FORMAT_ERROR_BACKTRACE.

    CREATE OR REPLACE PROCEDURE proc3
    IS
    BEGIN
      DBMS_OUTPUT.put_line ('esecuzione proc3: chiamata a proc2');
      proc2;
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.put_line ('Error stack at top level:');
        DBMS_OUTPUT.put_line (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
    END;
    /

    L’esecuzione della proc3 stavolta darà il seguente output:

    esecuzione proc3: chiamata a proc2
    esecuzione proc2: chiamata a proc1
    esecuzione proc1
    Error stack at top level:
    ORA-06512: at “HR.PROC1”, line 4
    ORA-06512: at “HR.PROC2”, line 4
    ORA-06512: at “HR.PROC3”, line 5

     

    In altre parole, l’informazione che prima era disponibile solo mediante eccezioni non gestite, adesso si può ottenere dal codice PL/SQL.

     

    Giulio Cantali – IT Consultant

    Creatore di Database Master, il primo percorso per diventare esperti di database

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">