Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что с циклом, почему так работает ??? 8.1.7.4; Это баг или что ??? 
:(
    Опции темы
Marriage
Дата 26.10.2005, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Код

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;





--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
LSD
Дата 26.10.2005, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Marriage
Дата 26.10.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Цитата(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;



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


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
LSD
Дата 26.10.2005, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



После close cMKB10, выполни open cMKB10.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Marriage
Дата 26.10.2005, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Не , при Close cMKB10 пишет "invalid cursor", до open cMKB10 даже дело не дойдет. smile



--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
LSD
Дата 30.10.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



На восьмерке проверить пока не могу, но на 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



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
igon
Дата 31.10.2005, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Цитата
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), чтобы можно было проблему воспроизвести.


--------------------
Хотите поговорить об этом?
PM   Вверх
Marriage
Дата 4.11.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Цитата(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).

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

Это сообщение отредактировал(а) Marriage - 4.11.2005, 11:40


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.