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

Откуда:
Сообщений: 148
Есть update_table, в которой мы делаем какие-то действия, только после того как в ней проапдейтились поля status, result (status стал 6, result стал 0).Эти поля могут апдейтиться дргуим юзером.То есть мы ждем пока они изменятся, и только потом что-то делаем. Вопрос в том , как сделать чтобы выбирались данные на текущий момент и только после того как все проапдейтилоось, мы бы шли дальше. в примере ниже такое происходит только с одной записью из курсора, вопрос как мне седлать это для всех записей в курсоре.((((
declare

 CURSOR migr_cur IS
    select t.number, t.status, t.result
      from updating_table t
     where t.number in (/*список*/); 
 currec    migr_cur%ROWTYPE;

begin

  OPEN migr_cur;
  FETCH migr_cur
    INTO currec;
  <<gamma_loop>>
  loop
    if (currec.status <> 6 and currec.result <> 0) then
      dbms_output.put_line('zhdiom');
      CLOSE migr_cur;
      OPEN migr_cur;
      FETCH migr_cur
        INTO currec;
      goto gamma_loop;
    else
      goto gamma_loop2;
    end if;
  end loop;
  <<gamma_loop2>>
  dbms_output.put_line(concat('ok', to_char(currec.status+1)));

end;
31 окт 07, 13:33    [4860137]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116218
Дизайн просто катастрофический.
Если Вы не боитесь бесконечных циклов, которые ИМХО станут
Вашим постоянным ночным кошмаром, то вот

declare
  a number := 1;
begin
  while (a = 1) loop
    select count(*)
      into a
      from dual
     where exists (select null from scott.emp where sal <> 1000);
   end loop;
end;

Крутимся в цикле пока все значения not null- колонки sal не станут равными 1000
(а они точно должны ?)

ИМХО
Но вообще , считаю это вредным советом.
Полезный совет - переделывайте дизайн. Это не годится
31 окт 07, 13:50    [4860244]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
andy_versal
Member

Откуда: оттуда...
Сообщений: 113
а почему бы не сделать джоб со следующим кодом?

declare
 c integer;
begin
  select count(*) into c
  from updating_table t
  where t.number in (/*список*/)
  and status <> 6 and result <> 0;
  if (c=0) then
    /* делаем то, что нам нужно */
  end if;
end;

п.с. исходный код - в мемориз, однозначно! :)
31 окт 07, 14:16    [4860412]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
adar7
Member

Откуда:
Сообщений: 148
немного поясню, поле result сначала апдейтится на null, потом удаленно смотрится, если поле такое null, то проводятся операции по регистрации этой записи(этот шанг делается, мы на него внимания не обращаем). По завершении регистрации, значение null меняется на какое-то другое, причем оно меняется (например на -1 - это значит ошибка в регистрации, -2 - в активном ожидании).Но мы ждем пока status не станет равным 0, как только это происходит, мы разворачиваем боевые действия))))
31 окт 07, 15:27    [4860895]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
adar7
как только это происходит, мы разворачиваем боевые действия))))


Вот это "как только" какое время может занять? не проще раз в 10, (5 или даже 1) минут смотреть в таблицу на все строки где status=0 and result is not null ?
31 окт 07, 15:41    [4860979]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
adar7
Member

Откуда:
Сообщений: 148
это завистит от количества записей, пущенных на регистрацию..в среднем 100 записей минут 25-30 регистрируются
31 окт 07, 15:53    [4861049]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
adar7
это завистит от количества записей, пущенных на регистрацию..в среднем 100 записей минут 25-30 регистрируются


повторю свою мысль: зачем проверять сто-тыщь раз в секунду строку, если можно раз в минуту выбрать все строки по условию и делать с ними что нужно.
31 окт 07, 18:36    [4861922]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
andy_versal
Member

Откуда: оттуда...
Сообщений: 113
объясните, почему подход, который был предложен мной выше (через джобы) не годиться? это как раз именно то, что нужно
1 ноя 07, 10:11    [4863283]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
adar7
Member

Откуда:
Сообщений: 148
andy_versal
объясните, почему подход, который был предложен мной выше (через джобы) не годиться? это как раз именно то, что нужно


НЕ годится из-за того что я не знаю как сделать джоб, мне проще сделать цикл в процедуре
2 ноя 07, 08:54    [4868270]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
Elic
Member

Откуда:
Сообщений: 29988
adar7
НЕ годится из-за того что я не знаю как сделать джоб, мне проще сделать цикл в процедуре
Бедный CPU
2 ноя 07, 09:13    [4868330]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
andy_versal
Member

Откуда: оттуда...
Сообщений: 113
adar7
НЕ годится из-за того что я не знаю как сделать джоб, мне проще сделать цикл в процедуре


проще памперсы одевать, чтобы в туалет не бегать...
доки почитать религия не позволяет?
2 ноя 07, 12:25    [4869774]     Ответить | Цитировать Сообщить модератору
 Re: изменения по условию в изменяющейся таблице  [new]
privet
Member

Откуда:
Сообщений: 52
adar7
НЕ годится из-за того что я не знаю как сделать джоб, мне проще сделать цикл в процедуре

Бедный CPU

+1)
2 ноя 07, 12:32    [4869824]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить