Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Что с циклом, почему так работает ???


Автор: Marriage 26.10.2005, 12:26
Код

CURSOR cMKB10 IS 
                   SELECT DISTINCT fc_mkb10
                       FROM TMyTable
                     START WITH fk_owner=nId
                     CONNECT BY PRIOR fk_id=fk_owner;
(курсор возвращает 'E00-E99','I10-I25','N70-N98')

begin
  FOR M1 IN cMKB10 LOOP
         FOR C IN curNaz(M1.fc_mkb10) LOOP
           ---тело цикла (M1.fc_mkb10 изменяется в соответствии с курсором, то есть 'E00-E99','I10-I25','N70-N98'  )
         END LOOP; 
 END LOOP;



  FOR M1 IN cMKB10 LOOP
         FOR C IN curNaz(M1.fc_mkb10) LOOP
           --- Вот в этом теле цыкла то ли глюк, то л и что ....
           --- здесь M1.fc_mkb10 выбираеться 3 раза 'N70-N98' )
           ---
         END LOOP; 
  END LOOP;
 
end;



Автор: LSD 26.10.2005, 12:53
По курсору можно пройтись только один раз. Чтобы пройтись по нему еще раз надо его открыть заново, но сам понимаешь это новый запрос и результат может отличаться от предыдущего.

Автор: Marriage 26.10.2005, 13:43
Цитата(LSD @ 26.10.2005, 12:53)
его открыть заново

Как ???
Пишу
Код

begin
  FOR M1 IN cMKB10 LOOP
         FOR C IN curNaz(M1.fc_mkb10) LOOP
           ---тело цикла (M1.fc_mkb10 изменяется в соответствии с курсором, то есть 'E00-E99','I10-I25','N70-N98'  )
         END LOOP; 
 END LOOP;

close cMKB10

  FOR M1 IN cMKB10 LOOP
         FOR C IN curNaz(M1.fc_mkb10) LOOP
           --- Вот в этом теле цыкла то ли глюк, то л и что ....
           --- здесь M1.fc_mkb10 выбираеться 3 раза 'N70-N98' )
           ---
         END LOOP; 
  END LOOP;
 
end;



Выдет ошибку ...

Автор: LSD 26.10.2005, 13:50
После close cMKB10, выполни open cMKB10.

Автор: Marriage 26.10.2005, 14:18
Не , при Close cMKB10 пишет "invalid cursor", до open cMKB10 даже дело не дойдет. smile

Автор: LSD 30.10.2005, 18:42
На восьмерке проверить пока не могу, но на 10-ке такой код работает без проблем:
Код
declare 
  cursor cur is select value from test_tbl order by id;
  d varchar2(50);
begin

  dbms_output.put_line('First circle');
  open cur;
  loop
    fetch cur into d;
    exit when cur%notfound;
    dbms_output.put_line(d);
  end loop;
  close cur;

  dbms_output.put_line('Second circle');
  open cur;
  loop
    fetch cur into d;
    exit when cur%notfound;
    dbms_output.put_line(d);
  end loop;
  close cur;
  
end;

В результате получаю:
Код
First circle
Val 1
Val 2
Second circle
Val 1
Val 2

Автор: igon 31.10.2005, 01:31
Цитата
In most situations that require an explicit cursor, you can simplify coding by using a cursor FOR loop instead of the OPEN, FETCH, and CLOSE statements,
т.е. Marriage вполне корректно использовал более простой код, не потеряв в функциональности.
Другое дело - почему второй вызов сложной, но той же самой конструкции приводит к другим результатам? Как видно из текста курсора, используется иерархический запрос, причем с непонятно откуда взятым параметром nID (fk_id и fk_owner тоже хорошо бы пояснить).
Далее, используется курсор с параметром curNaz. Его текст также хорошо бы увидеть.
Могу только предположить, но, например, если nID - некая переменная в хранимой, которая меняется во время/после работы первого M1, результат работы второго M1 вполне может быть иным...
Попробуй сделать тестовую таблицу сходной структуры с 10-15 записями и на ней протестировать хранимую (убрать, например, START WITH и CONNECT BY PRIOR). Если проблема останется, запости сюда все нужные данные (минимум!!! smile), чтобы можно было проблему воспроизвести.

Автор: Marriage 4.11.2005, 11:39
Цитата(igon @ 31.10.2005, 01:31)
причем с непонятно откуда взятым параметром nID

Это параметр функции


Цитата(igon @ 31.10.2005, 01:31)
fk_id и fk_owner тоже хорошо бы пояснить

FK_ID - идешник записи в таблице.
FK_OWNER - По этому полю отбираються все "дети" . То есть...

FK_ID FK_OWNER FC_NAME
1 0 a
2 0 b
3 1 c
4 2 d
5 2 e

Иерархия следующая
Код

b
  d
  e

и
Цитата

a
  c


Цитата(igon @ 31.10.2005, 01:31)
Далее, используется курсор с параметром curNaz. Его текст также хорошо бы увидеть.

А разве он может чем-нибудь навредить ???
Я бы привел , но я уже не могу привести код пока, так как нахожусь далеко от рабочьего места ...smile
Цитата(igon @ 31.10.2005, 01:31)
Могу только предположить, но, например, если nID - некая переменная в хранимой, которая меняется во время/после работы первого M1, результат работы второго M1 вполне может быть иным...

НЕт , не меняеться...

Цитата

Попробуй сделать тестовую таблицу сходной структуры с 10-15 записями и на ней протестировать хранимую (убрать, например, START WITH и CONNECT BY PRIOR).

Приеду домой , попробую проверить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)