Un esempio minimo è:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Se lo fai:
SELECT raise_exception
FROM DUAL;
Otterrai una singola riga contenente un NULL
valore - Chiedi a Tom afferma:
e poi proseguito con:
Quindi l'eccezione viene sollevata nella funzione e il client SQL lo vede e lo interpreta poiché non ci sono dati che siano NULL
value e "gestisce" l'eccezione.
Quindi
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Avrà successo come DUAL
table ha una singola riga e l'eccezione dalla funzione verrà gestita (silenziosamente) e la variabile finirà per contenere un NULL
valore.
Tuttavia,
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
L'eccezione è che questa volta viene passato dalla funzione a un ambito PL/SQL, che non gestisce l'errore e passa l'eccezione al blocco del gestore dell'eccezione (che non esiste), quindi viene passato all'ambito dell'applicazione e termina l'esecuzione del programma.
E Chiedi a Tom afferma:
Ora, se cambiamo la funzione per sollevare un'eccezione diversa:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Quindi entrambi:
SELECT raise_exception
FROM DUAL;
e:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
non so come gestire l'eccezione e terminare con ORA-01476 divisor is equal to zero
.