Что с циклом, почему так работает ???

 
0
 
Oracle
ava
Marriage | 26.10.2005, 13: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;


Comments (7)
ava
LSD | 26.10.2005, 12:53 #
По курсору можно пройтись только один раз. Чтобы пройтись по нему еще раз надо его открыть заново, но сам понимаешь это новый запрос и результат может отличаться от предыдущего.
ava
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;



Выдет ошибку ...
ava
LSD | 26.10.2005, 13:50 #
После close cMKB10, выполни open cMKB10.
ava
Marriage | 26.10.2005, 14:18 #
Не , при Close cMKB10 пишет "invalid cursor", до open cMKB10 даже дело не дойдет. :stena
ava
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
ava
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), чтобы можно было проблему воспроизвести.
ava
Marriage | 04.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).

Приеду домой , попробую проверить.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  LSD   Marriage   igon
advanced
Submit