Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / массовый селект фор апдейт / 8 сообщений из 8, страница 1 из 1
06.08.2019, 10:13
    #39845704
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
Код: plsql
1.
2.
3.
4.
5.
6.
7.
FOR rec IN (    SELECT *
                      FROM my_TBL
                     WHERE ID IN (SELECT * FROM TABLE (get_list_int ( :p_LIST_ID)))
                FOR UPDATE WAIT 30)
    LOOP
        exit; -----------------
    END LOOP; 

поллеги, давно селект фор апдейт массовый не писал

подскажите, такая конструкция корректна?
или залочит первые 100 строк и дальше нет?
...
Рейтинг: 0 / 0
06.08.2019, 12:45
    #39845812
maglevdevice
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
andreymx,

залочит одну строчку.
...
Рейтинг: 0 / 0
06.08.2019, 13:18
    #39845828
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
maglevdeviceзалочит одну строчку.

FOR UPDATE работает в два прохода. Первый (при открытии курсора -явном или неявном) fetch + lock всех строк выбираемых SELECToм, второй проход это собственно fetch клиентом. Тaк-что залочит все записи выбираемыe SELECToм.

SY.
...
Рейтинг: 0 / 0
06.08.2019, 13:29
    #39845834
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
Спасибо
...
Рейтинг: 0 / 0
06.08.2019, 13:53
    #39845851
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
SYFOR UPDATE работает в два прохода. Первый (при открытии курсора -явном или неявном) fetch + lock всех строк выбираемых SELECToм, второй проход это собственно fetch клиентом.
И давно?
...
Рейтинг: 0 / 0
06.08.2019, 13:57
    #39845855
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
andrey_anonymousИ давно?

С сотворения мира.

Сессия 1:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> DECLARE
  2      CURSOR V_CUR IS SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE;
  3  BEGIN
  4      OPEN V_CUR;
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL>



Сессия 2:

Код: plsql
1.
2.
SQL> UPDATE EMP SET SAL = SAL WHERE ENAME = 'CLARK'
  2  / -- висим



Сессия 3:

Код: plsql
1.
2.
SQL> UPDATE EMP SET SAL = SAL WHERE ENAME = 'KING'
  2  / -- висим



Сессия 4:

Код: plsql
1.
2.
SQL> UPDATE EMP SET SAL = SAL WHERE ENAME = 'MILLER'
  2  / -- висим



SY.
...
Рейтинг: 0 / 0
06.08.2019, 14:14
    #39845865
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
SYС сотворения мира.
Мне skip locked почудился, сорри.
...
Рейтинг: 0 / 0
06.08.2019, 14:21
    #39845871
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массовый селект фор апдейт
andrey_anonymousSYС сотворения мира.
Мне skip locked почудился, сорри.

Собственно, для полноты картины (вдруг кто не в курсе):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
create table dropme_t as select rownum N, 'Value for row '||rownum||rpad(' ',500,' ') V from dual connect by level < 10;
Table created

declare
  cursor c is select * from dropme_t for update SKIP LOCKED;
  function check_lock_n(i_n number) return varchar2 is
    pragma autonomous_transaction;
    ResourceBusy exception; pragma exception_init(ResourceBusy, -54);
    result varchar2(100);
  begin
    select N ||' is Not locked' into result from dropme_t where n = i_n for update nowait;
    rollback;
    return result;
  exception
    when ResourceBusy then return i_n || ' is Locked';
  end;
begin
  for i in c loop
   dbms_output.put_line('Fetched: '||i.n||', '||check_lock_n(9));
  end loop;
  rollback;
end;
/

Fetched: 1, 9 is Not locked
Fetched: 2, 9 is Not locked
Fetched: 3, 9 is Not locked
Fetched: 4, 9 is Not locked
Fetched: 5, 9 is Not locked
Fetched: 6, 9 is Not locked
Fetched: 7, 9 is Not locked
Fetched: 8, 9 is Not locked
Fetched: 9, 9 is Locked

PL/SQL procedure successfully completed

SQL> 
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / массовый селект фор апдейт / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]