Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Select for update и cursor  [new]
Гусар
Member

Откуда: Киров
Сообщений: 802
cделал курсор для того чтобы залочить какуюто запись

cursor c is select *  from ref_list_lock 
		  where list_table = a_table and parent_object = a_parent for update nowait;

а дальше его надо просто открыть? читать из него мне не надо.
20 май 10, 12:12    [8805085]     Ответить | Цитировать Сообщить модератору
 Re: Select for update и cursor  [new]
JaRo
Member

Откуда:
Сообщений: 1659
А чего Вы мучаетесь?
for rec in (select * from ref_list_lock 
	  where list_table = a_table and parent_object = a_parent for update nowait) loop
  exit;
end loop;
20 май 10, 12:29    [8805289]     Ответить | Цитировать Сообщить модератору
 Re: Select for update и cursor  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Гусар,

Да, чтобы залочить, достаточно открыть (open либо в цикле for).
Если уверены, что в рез-те запроса лочится всегда одна запись (не больше и не меньше), то необязательно исп-ть явный курсор. Достаточно
    select 1
    into l_num
    from ...
    where ...
    for update nowait;
20 май 10, 12:29    [8805290]     Ответить | Цитировать Сообщить модератору
 Re: Select for update и cursor  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Простите, товарищи,

вот смотрите

курсор запроса, вытаскивающего несколько млн. записей (select * from bigtable where ... for update). он откроется также быстро как и "не for update" ?
- если да (если также быстро) - то непонятно каким образом так быстро лочится такое большое кол-во записей
- если нет, то, получается, что он будет открываться ооооооочень долго?
20 май 10, 12:51    [8805556]     Ответить | Цитировать Сообщить модератору
 Re: Select for update и cursor  [new]
AmKad
Member

Откуда:
Сообщений: 5222
--Eugene--,

select count(*) from my_table;

9909421

select bytes from dba_segments
where owner = 'USER'
AND segment_name = 'MY_TABLE'

2 964 324 352

declare  -- работает моментально
cursor l_cur is select * from MY_TABLE; 
begin
    open l_cur;
    close l_cur;
end;

declare  -- работает ооооооочень долго
cursor l_cur is select * from MY_TABLE for update nowait; 
begin
    open l_cur;
    close l_cur;
end;
20 май 10, 13:15    [8805853]     Ответить | Цитировать Сообщить модератору
 Re: Select for update и cursor  [new]
коркодил
Member [заблокирован]

Откуда:
Сообщений: 290
--Eugene--
Простите, товарищи,

вот смотрите

курсор запроса, вытаскивающего несколько млн. записей (select * from bigtable where ... for update). он откроется также быстро как и "не for update" ?
- если да (если также быстро) - то непонятно каким образом так быстро лочится такое большое кол-во записей
- если нет, то, получается, что он будет открываться ооооооочень долго?
20 май 10, 13:23    [8805940]     Ответить | Цитировать Сообщить модератору
 Re: Select for update и cursor  [new]
Гусар
Member

Откуда: Киров
Сообщений: 802
AmKad
Гусар,

Да, чтобы залочить, достаточно открыть (open либо в цикле for).
Если уверены, что в рез-те запроса лочится всегда одна запись (не больше и не меньше), то необязательно исп-ть явный курсор. Достаточно
    select 1
    into l_num
    from ...
    where ...
    for update nowait;

во, спасибо, так заработало. Чтото я не допер сделать фиктивную выборку в переменную.
20 май 10, 15:16    [8807336]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить