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

Obsługa wyjątków PL/SQL:nic nie rób (ignoruj ​​wyjątek)

Chociaż zgadzam się, że w 99% przypadków złą praktyką jest ciche ignorowanie wyjątków bez przynajmniej ich gdzieś rejestrowania, istnieją szczególne sytuacje, w których jest to całkowicie akceptowalne.

W takich sytuacjach NULL jest Twoim przyjacielem:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Dwie typowe sytuacje, w których może być pożądane ignorowanie wyjątków, to:

1) Twój kod zawiera instrukcję, o której wiesz, że od czasu do czasu zawiedzie i nie chcesz, aby ten fakt zakłócał działanie twojego programu. W takim przypadku powinieneś umieścić swoją instrukcję w zagnieżdżonym bloku, jak pokazuje poniższy przykład:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS
    l_empoyee_name  EMPLOYEES.EMPLOYEE_NAME%TYPE;
BEGIN
    -- Catch potential NO_DATA_FOUND exception and continue
    BEGIN 
        SELECT EMPLOYEE_NAME
        INTO l_empoyee_name
        FROM EMPLOYEES
        WHERE EMPLOYEE_ID = 12345;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
        WHEN OTHERS THEN
            RAISE;
    END;

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Propagate exception
        RAISE;
END;

Zauważ, że PL/SQL generalnie nie zezwala na typ obsługi wyjątków On Error Resume Next znany z Visual Basic, gdzie wszystkie wyjątki są ignorowane, a program kontynuuje działanie, jakby nic się nie stało (patrz Po błędzie wznawia następny typ obsługi błędów w PL /wyrocznia SQL ). Musisz wyraźnie zawrzeć potencjalnie błędne instrukcje w zagnieżdżonym bloku.

2) Twoja procedura jest tak nieistotna, że ​​ignorowanie wszystkich zgłoszonych przez nią wyjątków nie wpłynie na logikę głównego programu. (Jednak jest to bardzo rzadki przypadek i na dłuższą metę często może skutkować koszmarem debugowania)

BEGIN

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Ignore all exceptions and return control to calling block
        NULL;
END;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odinstalować / całkowicie usunąć Oracle 11g (klient)?

  2. Problem z rownum w zapytaniu Oracle

  3. jak wywołać funkcję w Oracle

  4. Przykład Oracle Bulk Collect przy użyciu obiektu typu kursora typu Rowtype

  5. Wysyłanie zapytań do tabeli zagnieżdżonej