Oracle
 sql >> Datenbank >  >> RDS >> Oracle

NO_DATA_FOUND-Ausnahme wird nicht ausgelöst, wenn sie in SELECT INTO verwendet wird

Ein Minimalbeispiel ist:

CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE NO_DATA_FOUND;
END;
/

Wenn ja:

SELECT raise_exception
FROM   DUAL;

Sie erhalten eine einzelne Zeile, die einen NULL enthält Wert - Frag Tom Zustände:

und dann gefolgt von:

Die Ausnahme wird also in der Funktion ausgelöst und der SQL-Client sieht dies und interpretiert dies, da es keine Daten gibt, die ein NULL sind Wert und "handhabt" die Ausnahme.

Also

DECLARE
  variable_name VARCHAR2(50);
BEGIN
  SELECT raise_exception
  INTO   variable_name
  FROM   DUAL
END;
/

Erfolgreich als DUAL Die Tabelle hat eine einzelne Zeile und die Ausnahme von der Funktion wird (stillschweigend) behandelt und die Variable enthält am Ende einen NULL Wert.

Allerdings

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

Die Ausnahme wird dieses Mal von der Funktion an einen PL/SQL-Bereich übergeben, der den Fehler nicht behandelt und die Ausnahme an den Ausnahmebehandlungsblock (der nicht existiert) weiterleitet, sodass er dann an den Anwendungsbereich weitergeleitet wird und die Ausführung beendet des Programms.

Und Ask Tom sagt:

Wenn wir nun die Funktion ändern, um eine andere Ausnahme auszulösen:

CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE ZERO_DIVIDE;
END;
/

Dann beides:

SELECT raise_exception
FROM   DUAL;

und:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

weiß nicht, wie die Ausnahme behandelt werden soll, und endet mit ORA-01476 divisor is equal to zero .