Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв БД 2013-03-15.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
12.65 Mб
Скачать

5.4.8. Транзакции

Для управления транзакциями и блокировками имеются операторы:

Commit - фиксация транзакции.

Savepoint <имя контрольной точки> ‑ определение контрольной точки.

Rollback [<имя контрольной точки>]- откат на начало транзакции или на указанную контрольную точку.

5.4.9. Обработка исключений

Исключения представляют собой отклонения от нормального хода вы­пол­не­ния программы из‑за просчетов проектирования, ошибок коди­­ро­ва­ния, сбоев оборудования и др. Хотя невозможно предвидеть все ошибки, вы можете спланировать обработку некоторых из них.

Исключения бывают предопределенными (cursor_already_open, dup_ val_on_in­dex, invalid_cursor, invalid_number, login_denied, no_da­ta_fo­und, not_logged_on, program_error, storage_error, timeout_on_resource, too_ma­ny_ rows, transaction_backed_out, value_error, zero_divide) и пользо­ва­тель­скими.

Пользовательские исключения объявляются в виде:

<имя исключения> Exception;

Для генерации исключения используется оператор:

Raise <имя исключения>;

Оператор вызова обработчика исключений имеет вид:

Exception

When <имя исключения> [ or <имя исключения>] ... Then

<операторы обработки исключения>;

[When <имя исключения> [ or <имя исключения>] ... Then

<операторы обработки исключения>; ] ...

[When Others Then --обработка брошенных исключений

[Begin]

<операторы обработки исключения, не указанные в When>; ]

[Exception when others then null; --для предотвращения зацикливания]

[end;]

End;

Функции Sqlcode и Sqlerrm[(n)] возвращают номера и текст сооб­ще­ния (исключения с заданным номером n) для брошенного исключения соот­вет­ственно (dbms_output.put_line(‘Ошибка: ’||sqlerrm(sqlcode));).

Допускается вложенность обработчиков исключений. Если для блока не установлен обработчик исключительных ситуаций, то управление пере­да­ется следующему блоку более высокого уровня.

Пример создания и генерации пользовательского исключения

declare

out_of_stock exception; --объявление пользовательского исключения

number_on_hand number(4);

begin ...

if number_on_hand < 1 then raise out_of_stock; end if;

...

exception

when out_of_stock then

... -- обработать ошибку

end;

Продолжение работы после возбуждения исключения

После исправления ошибки в обработчике исключений нельзя вер­нут­ься в текущий блок для продолжения работы. Однако сущест­ву­ет спо­соб решения этой проблемы: поместить предло­жение в его собствен­ный подблок вместе с его собственными обработчиками исключений.

Пример

declare proc_vip_plana number(4,1);

begin

begin --начало подблока обработки

select 100 * fact / plan into proc_vip_plana from stroiki where ks = 101;

exception

when zero_divide then proc_vip_plana:= 100; --обработка деления на нуль

end; --конец подблока

insert into stats (ks, pv) values (101, proc_vip_plana);

end;

5.4.10. Динамический sql‑оператор

Текст SQL‑оператора можно сформировать динамически в строковой переменной в процессе выполнения программы и выполнить оператором:

Execute [immediate] <имя строковой переменной> [using <параметр>, ...].

Пример

Procedure Vkluhenij (ptable varchar2, Pprod varchar2, Pdesc varchar2) Is

sql_str varchar2(500); --объявление строковой переменной

Begin sql_str:=’insert into ‘ || ptable || ‘ values (:prod_id, :desc)’;

Execute immediate sql_str Using Pprod, Pdesc;