как правильно считать строку / или вставить ее в случае если ее нет ?

--Eugene--
Дата: 10.03.2011 15:05:52
вот юскейс:

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

код примерно такой:
<<xxx>>
begin
	select ...
		into ...
		from t
		where id = :id;
exception
	when no_data_found then
		begin
			insert into t (id, ...)
				values (:id, ...);
		exception
			when dup_val_on_index then
				goto xxx;
		end;
end;
но этот код всеравно недостаточно хорош.

подскажите хороший способ?
-2-
Дата: 10.03.2011 15:08:27
--Eugene--,

insert+dup_val_on_index
--Eugene--
Дата: 10.03.2011 15:11:51
-2-,

<<xxx>>
begin
	insert into t (id, ...)
		values (:id, ...);
exception
	when dup_val_on_index then
		begin
			select ...
				into ...
				from t
				where id = :id;
		exception
			when no_data_found then
				goto xxx;
		end;
end;
?
-2-
Дата: 10.03.2011 15:13:04
--Eugene--,

Зачем no_data_found и goto, возможны удаления?
--Eugene--
Дата: 10.03.2011 15:13:46
-2-,

возможны
_Nikotin
Дата: 10.03.2011 15:16:10
посмотри на unwrap DBMS_LOCK.ALLOCATE_UNIQUE почти то же самое что и у тебя
-2-
Дата: 10.03.2011 15:19:11
--Eugene--
возможны
тогда исходить из вероятности наличия строки, чтобы реже срабатывал exception.