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

NO_DATA_FOUND undtagelse blev ikke kastet, når den bruges i SELECT INTO

Et minimalt eksempel er:

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

Hvis du gør det:

SELECT raise_exception
FROM   DUAL;

Du får en enkelt række, der indeholder en NULL værdi - Spørg Tom a> siger:

og derefter fulgt op med:

Så undtagelsen er rejst i funktionen, og SQL-klienten ser dette og fortolker dette, da der ikke er nogen data, som er en NULL værdi og "håndterer" undtagelsen.

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

Vil lykkes som DUAL tabel har en enkelt række, og undtagelsen fra funktionen vil blive håndteret (stille), og variablen vil ende med at indeholde en NULL værdi.

Dog

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

Undtagelsen bliver denne gang overført fra funktionen til et PL/SQL scope - som ikke håndterer fejlen og overfører undtagelsen til undtagelseshåndteringsblokken (som ikke eksisterer), så den bliver overført til applikationsomfanget og afslutter eksekveringen af programmet.

Og Spørg Tom udtaler:

Nu, hvis vi ændrer funktionen for at rejse en anden undtagelse:

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

Så begge dele:

SELECT raise_exception
FROM   DUAL;

og:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

ved ikke, hvordan man håndterer undtagelsen og afslutter med ORA-01476 divisor is equal to zero .




  1. MySQL FIND_IN_SET() fungerer ikke som forventet

  2. Hvad er den interne repræsentation af datetime i sql server?

  3. Doktrin DBAL setParameter() med matrixværdi

  4. Sender et array til mysql