sql >> Database >  >> RDS >> Oracle

NO_DATA_FOUND uitzondering niet gegenereerd bij gebruik in SELECT INTO

Een minimaal voorbeeld is:

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

Als je dat doet:

SELECT raise_exception
FROM   DUAL;

U krijgt een enkele rij met een NULL waarde - Vraag het aan Tom staten:

en vervolgde met:

Dus de uitzondering wordt opgeworpen in de functie en de SQL-client ziet dit en interpreteert dit omdat er geen gegevens zijn die een NULL zijn waarde en "verwerkt" de uitzondering.

Dus

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

Zal slagen als de DUAL tabel heeft een enkele rij en de uitzondering van de functie zal (stil) worden afgehandeld en de variabele zal uiteindelijk een NULL bevatten waarde.

Echter,

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

De uitzondering is dat deze keer wordt doorgegeven van de functie naar een PL/SQL-scope - die de fout niet afhandelt en de uitzondering doorgeeft aan het exception-handlerblok (dat niet bestaat), zodat het wordt doorgegeven aan het toepassingsbereik en de uitvoering beëindigt van het programma.

En Ask Tom zegt:

Als we nu de functie wijzigen om een ​​andere uitzondering op te werpen:

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

Dan beide:

SELECT raise_exception
FROM   DUAL;

en:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

weet niet hoe de uitzondering moet worden afgehandeld en moet eindigen met ORA-01476 divisor is equal to zero .




  1. PostgreSQL-weergaven:verwijzen naar een berekend veld in een ander berekend veld

  2. JDBC:Kan ik een verbinding delen in een multithreading-app en genieten van leuke transacties?

  3. Laravel 4 gebruikt UUID als primaire sleutel

  4. Hoe gegevens uit MYSQL te selecteren met LIMIT bevat één element met waarde, bijvoorbeeld. 1