среда, 4 февраля 2015 г.

Обработка исключительных ситуаций, коды ошибок



В PL/SQL ошибки при выполнении программы вызывают исключения (exception). Исключения могут быть системные и определенные пользователем.
Обработка исключения может быть определена в любой части pl/sql блока.
Когда происходит ошибка вызывается исключение  (командой raise). При этом нормальное выполнение кода прекращается, контроль над программой переходит к обработчику исключительной ситуации определенном в блоке с ошибкой.
Системные ошибки вызываются автоматически, команда raise для них не нужна.
Для примера:
 
declare

   d   number;

   v   varchar2 (100);

begin

   v := 'Нормальное выполнение';

   begin                                         ---Начало блока с исключением

      d := 1 / 0;

   exception

      when zero_divide

      then

         v := ('Ошибка. При вычислениях произошло деление на ноль');

      when others

      then

         begin                                               -- блок обработки

            v := ('Ошибка' || sqlcode || '      ' || sqlerrm);

         end;                                                               --

   end;                                       --окончание и исключения и блока



   dbms_output.put_line (v);


end;


В обработке исключений, как в примере, можно воспользоваться стандартными переменными, содержащие код и описание ошибки SQLCODE,SQLERRM.

Список стандартных исключений

Исключение
Код ошибки
Значение  SQLCODE
ACCESS_INTO_NULL
ORA-06530
-6530
CASE_NOT_FOUND
ORA-06592
-6592

COLLECTION_IS_NULL
ORA-06531
-6531

CURSOR_ALREADY_OPEN
ORA-06511
-6511

DUP_VAL_ON_INDEX
ORA-00001
-1

INVALID_CURSOR
ORA-01001
-1001

INVALID_NUMBER
ORA-01722
-1722

LOGIN_DENIED
ORA-01017
-1017

NO_DATA_FOUND
ORA-01403
+100

NOT_LOGGED_ON
ORA-01012
-1012

PROGRAM_ERROR
ORA-06501
-6501

ROWTYPE_MISMATCH
ORA-06504
-6504

SELF_IS_NULL
ORA-30625
-30625

STORAGE_ERROR
ORA-06500
-6500

SUBSCRIPT_BEYOND_COUNT
ORA-06533
-6533

SUBSCRIPT_OUTSIDE_LIMIT
ORA-06532
-6532

SYS_INVALID_ROWID
ORA-01410
-1410

TIMEOUT_ON_RESOURCE
ORA-00051
-51

TOO_MANY_ROWS
ORA-01422
-1422

VALUE_ERROR
ORA-06502
-6502

ZERO_DIVIDE
ORA-01476
-1476


Кгогда появится вдохновление допишу про определение собственных исключений, вызов и перевызов исключений, переопределение стандартных исключений, перезапуск транзакций при исключениях и другое.

Комментариев нет:

Отправить комментарий