Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyjątek NO_DATA_FOUND nie jest zgłaszany, gdy jest używany w SELECT INTO

Minimalny przykład to:

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

Jeśli tak:

SELECT raise_exception
FROM   DUAL;

Otrzymasz pojedynczy wiersz zawierający NULL wartość - Zapytaj Toma stany:

a następnie kontynuował:

Więc wyjątek jest zgłoszony w funkcji, a klient SQL widzi to i interpretuje to, ponieważ nie ma danych, które są NULL wartość i "obsługuje" wyjątek.

Więc

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

Odniesie sukces jako DUAL tabela ma jeden wiersz i wyjątek od funkcji zostanie obsłużony (po cichu), a zmienna będzie zawierać NULL wartość.

Jednak

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

Wyjątkiem jest tym razem przekazanie z funkcji do zakresu PL/SQL - który nie obsługuje błędu i przekazuje wyjątek do bloku obsługi wyjątków (który nie istnieje), a następnie zostaje przekazany do zakresu aplikacji i kończy wykonywanie programu.

Zapytaj Toma stwierdza:

Teraz, jeśli zmienimy funkcję, aby zgłosić inny wyjątek:

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

Następnie oba:

SELECT raise_exception
FROM   DUAL;

i:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

nie wiem jak obsłużyć wyjątek i zakończyć za pomocą dzielnika ORA-01476 divisor is equal to zero .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego OracleDataAdapter.Fill() działa bardzo wolno?

  2. Przetrwanie audytu Oracle

  3. ORA-29283:nieprawidłowa operacja na pliku ORA-06512:w SYS.UTL_FILE, wiersz 536

  4. wyrażenie oracle niewłaściwego typu podczas sprawdzania zmiennej

  5. Jaka jest maska ​​formatowania daty Oracle dla stref czasowych?