sql >> Databasteknik >  >> RDS >> Oracle

NO_DATA_FOUND undantag kastas inte när det används i SELECT INTO

Ett minimalt exempel är:

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

Om du gör det:

SELECT raise_exception
FROM   DUAL;

Du kommer att få en enda rad som innehåller en NULL värde - Fråga Tom står:

och följde sedan upp med:

Så undantaget tas upp i funktionen och SQL-klienten ser detta och tolkar detta eftersom det inte finns någon data som är en NULL värde och "hanterar" undantaget.

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

Kommer att lyckas som DUAL tabellen har en enda rad och undantaget från funktionen kommer att hanteras (tyst) och variabeln kommer att innehålla en NULL värde.

Men

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

Undantaget överförs denna gång från funktionen till ett PL/SQL-scope - som inte hanterar felet och skickar undantaget till undantagshanterarblocket (som inte finns) så att det skickas upp till applikationsomfånget och avslutar exekvering av programmet.

Och Ask Tom säger:

Om vi ​​nu ändrar funktionen för att skapa ett annat undantag:

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

Sedan båda:

SELECT raise_exception
FROM   DUAL;

och:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

vet inte hur man hanterar undantaget och avslutar med ORA-01476 divisor is equal to zero .




  1. SQL CASE-sats

  2. Java Exception Error - Sqlite readyStatement.setBlob

  3. Strukturera SQL-fråga baserat på flera kryssrutor

  4. Funktion för Postgresql