Страница 1 из 1

ХП селектит таблицу и одновременно инсертит в нее. проблема

Добавлено: 06 май 2006, 09:38
Spa_2002
День добрый всем!

Упрощенно задача такова:

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

/* выбираем записи по вышеописанным условиям*/
for select ... from table1 where .... and not exists(select .. from table1 where ...) into .... получаем (ключевые поля записи)
do
begin
insert into table1 ...
end

ПРОБЛЕМА:такое ощущение что после первого инсерта в теле цикла выборка изменяется !!! и часть записей оказывются не скопированными.
По моему разумению выборка должна быть статичной в течение всего цикла.Все-таки запрос каждый раз перевыполняется или нет ?

Добавлено: 06 май 2006, 10:15
kdv
разумение тебя подвело. for select неатомарен. запрос не перевыполняется, просто он видит изменения, которые делаются в begin/end.
чтобы не видел, запрос, к примеру, должен иметь PLAN SORT. Добавь какой-нибудь ORDER BY, чтобы без индекса было.

Добавлено: 06 май 2006, 10:35
Spa_2002
Не совсем понял как Order By влияет на всевидящее око запроса , но после добавления сортировки все работает как задумано.
Спасибо, kdv!

Добавлено: 07 май 2006, 09:56
kdv
Order By влияет на всевидящее око запроса
не order by, а plan sort. записи сначала сортируются, а потом по ним идет перебор. В первоначальном варианте у тебя шел сразу перебор записей, куда ты добавлял данные. Сервер не гарантирует, что будет записывать данные всегда "в конец" таблицы. данные пишутся на свободное место.