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
.