Oracle
 sql >> база данни >  >> RDS >> Oracle

PL/SQL обработка на изключения:не правете нищо (игнорирайте изключение)

Въпреки че съм съгласен, че в 99% от случаите е лоша практика да се игнорират мълчаливо изключенията, без поне да се регистрират някъде, има конкретни ситуации, в които това е напълно приемливо.

В тези ситуации NULL е ваш приятел:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Две типични ситуации, при които игнорирането на изключения може да е желателно са:

1) Вашият код съдържа израз, за ​​който знаете, че понякога ще се провали и не искате този факт да прекъсва потока на вашата програма. В този случай трябва да затворите израза си във вложен блок, както показва следният пример:

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;

Обърнете внимание, че PL/SQL обикновено не позволява тип обработка на изключения On Error Resume Next, известен от Visual Basic, където всички изключения се игнорират и програмата продължава да работи, сякаш нищо не се е случило (вижте При грешка възобновете следващия тип обработка на грешки в PL /SQL oracle ). Трябва изрично да включите потенциално неуспешни изрази във вложен блок.

2) Вашата процедура е толкова маловажна, че игнорирането на всички изключения, които тя хвърля, няма да повлияе на основната ви програмна логика. (Това обаче е много рядко и често може да доведе до кошмар за отстраняване на грешки в дългосрочен план)

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. Как да проверя дали курсорът връща записи в oracle?

  2. PL/SQL групово събиране с клауза LIMIT в базата данни на Oracle

  3. Грешка по време на изпълнение:-2147217887(80040e21) Системата не може да намери текст на съобщение за номер на съобщение 0x80040e21 във файла със съобщения за OraOLEDB

  4. org.hibernate.ObjectDeletedException:изтрит обект ще бъде повторно запазен от каскада (премахване на изтрит обект от асоциации)

  5. Промяна на стойността на XML възел - UpdateXML еквивалент за Oracle 12c