2013-02-04 7 views
16

Essendo ancora un novizio in PL/SQL, sono stato copiare e incollare tutto il seguente trigger:Fa 'ECCEZIONE QUANDO GLI ALTRI ALZANO' fa qualcosa?

CREATE OR REPLACE TRIGGER FOO_TRG1 
    BEFORE INSERT 
    ON FOO 
    REFERENCING NEW AS NEW OLD AS OLD 
    FOR EACH ROW 
BEGIN 
    IF :NEW.FOO_ID IS NULL THEN 
     SELECT FOO_SEQ1.NEXTVAL INTO :NEW.FOO_ID FROM DUAL; 
    END IF; 

    EXCEPTION 
     WHEN OTHERS THEN RAISE; 
END FOO_TRG1; 
/
ALTER TRIGGER FOO_TRG1 ENABLE; 

Ho il sospetto che il codice di gestione delle eccezioni in dotazione non fa nulla a tutti e potrebbe semplicemente ottenere rimosso, dal momento che Riceverà comunque un messaggio di errore se qualcosa va storto. Ho ragione?

(immagino tale codice è il risultato di un'ulteriore modifica del codice precedente.)

risposta

28

sì, tale eccezione non fa altro che aumentare lo stesso errore fuori. inoltre serve per mascherare il numero di riga reale dell'errore. lo rimuoverei se fossi in te.

es:

SQL> declare 
    2 v number; 
    3 begin 
    4 select 1 into v from dual; 
    5 select 'a' into v from dual; 
    6 exception 
    7 when others 
    8 then 
    9  raise; 
10 end; 
11/
declare 
* 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 9 

vs:

SQL> declare 
    2 v number; 
    3 begin 
    4 select 1 into v from dual; 
    5 select 'a' into v from dual; 
    6 end; 
    7/
declare 
* 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 5 

il numero di riga nella prima punta al rilancio invece del numero reale linea. può rendere più difficile rintracciare gli errori.

0

Non fa semplicemente niente, è quasi criminale. In pratica dice "Solo per divertimento, farò finta che l'errore si sia verificato su questa linea piuttosto che sulla linea reale".

La gestione delle eccezioni è l'aspetto più frainteso dell'intera lingua. Quanto sopra è molto comune, e penso che derivi dall'idea sbagliata di base che una "eccezione non gestita" sia una cosa negativa (quasi si pone la domanda - perché non l'hai gestita?). Se solo Oracle avesse usato la terminologia 'eccezione occorsa' o 'eccezione incontrata', noi poveri gente che deve supportare questo codice avrebbe molti meno handler di eccezioni 'WHEN OTHERS' che rendono le nostre vite miserabili.