"+" и "-" обработки исключения, вместо его предотвращения

amiksam
Дата: 03.08.2005 11:31:07
Всем привет,
возник следующий вопрос: Что лучше (правильней, надежней) обрабатывать исключение или предварительными проверками его не допустить.
Пример:

ПЕРВЫЙ ВАРИАНТ:
begin
insert into table1 (id, name) values (:1, :2);
exception
when dup_val_on_index then
update table1 set name = :2 where id = :id;
end;

ВТОРОЙ ВАРИАНТ:
declare
lCount integer;
begin
select count(*) into lCount from table1 where id = :id;

if lCount = 0 then
insert into table1 (id, name) values (:1, :2);
else
update table1 set name = :2 where id = :id;
end if;
end;
Вячеслав Любомудров
Дата: 03.08.2005 11:34:09
1. В данном примере использовать MERGE ;-)
2. В зависимости от вероятности наступления на грабли - можно поискать - как-то Я и ежик проводил подобное "исследование"
Вячеслав Любомудров
Дата: 03.08.2005 11:35:54
softwarer
Дата: 03.08.2005 14:16:41
amiksam
Пример:

Я бы отметил, что оба примера замечательны возможностью "пролететь", то есть не сделать ни insert-а, ни update-а, а второй - еще и возможностью напороться на DUP_VAL_ON_INDEX :)
hell
Дата: 03.08.2005 23:46:55
без мержа трудновато, но в общем случае можно так:

1) попробовать select into x for update;
2) если он прошел - радуемся, делаем апдейт и вываливаемся
3) если no_data_found - делаем инсерт.
При этом между 1-3 уже может произойти инсерт, что при этом надо сделать - или ничего или проапдейтить на наше значение - это уже зависит от задачи

"The CBO without stats is like a morning without coffee." T.Kyte