sql >> Databáze >  >> RDS >> Oracle

Při použití v SELECT INTO nebyla vyvolána výjimka NO_DATA_FOUND

Minimálním příkladem je:

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

Pokud tak učiníte:

SELECT raise_exception
FROM   DUAL;

Získáte jeden řádek obsahující NULL hodnota – Zeptejte se Toma uvádí:

a poté následuje:

Takže výjimka je vyvolána ve funkci a klient SQL to vidí a interpretuje to, protože neexistují žádná data, která mají NULL hodnotu a „zpracuje“ výjimku.

Takže

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

Bude úspěšný jako DUAL tabulka má jeden řádek a výjimka z funkce bude zpracována (potichu) a proměnná skončí obsahující NULL hodnotu.

Nicméně,

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

Výjimka je tentokrát předána z funkce do rozsahu PL/SQL – který chybu nezpracovává a předá výjimku bloku obsluhy výjimek (který neexistuje), takže je předán do rozsahu aplikace a ukončuje provádění programu.

A Ask Tom uvádí:

Nyní, když změníme funkci tak, aby vyvolala jinou výjimku:

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

Pak obojí:

SELECT raise_exception
FROM   DUAL;

a:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

nevím, jak zpracovat výjimku a ukončit s ORA-01476 divisor is equal to zero .




  1. Zkontrolujte dva datum nebylo mezi dvěma dalším datem + MYSQl

  2. Naše nejoblíbenější databázové blogové příspěvky v roce 2017

  3. JodaTime s hodnotami JPA, PostgreSQL a NULL

  4. Úvod do funkcí PL/SQL v databázi Oracle