Oracle
 sql >> Database >  >> RDS >> Oracle

Eccezione NO_DATA_FOUND non generata quando utilizzata in SELECT INTO

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 .