многократное использование курсора
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



многократное использование курсора Expand / Collapse
Автор
Сообщение
19.11.2001 9:05
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 04.12.2001 11:31
Сообщ.: 4, Visits: 45
Проблема заключается в следующем:
В хранимой процедуре необходимо многократно выбирать данные из курсора. В документации прочитал, что возможности перейти на начало курсора нет. Для повторнрго использования курсора
предлагается его открывать вновь. Проблемма заключается в том, что цикл выполняется всего один раз. После первого закрытия курсора происходит выход из процедуры. Подскажите, что я делаю не правильно. Привожу условный фрагмент текста из процедуры :

CURSOR curTest is (SELECT ID_TESTNAME FROM SD_TEST WHERE NAME='xxx');
idName Number;

BEGIN
.
.
.
WHILE (i < 20) LOOP
.
.
.
OPEN curTest; loop
FETCH curRoute INTO idName;
if curTest%FOUND then
INSERT INTO SD_TEMPNAME (ID_NAME) VALUES (idName);
else CLOSE curTest;
end if;
END LOOP;
.
.
.
i:=i+1;
END LOOP;
.
.
.
END;
Сообщ. #733381
19.11.2001 10:35
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 24.04.2002 10:25
Сообщ.: 72, Visits: 793
Тут два момента:
1. Разные имена курсоров (думаю очепятка)
2. Вложенный цикл LOOP ... END LOOP у тебя вечный
3. А так вроде бы все правильно,
Вот "живой" код:
declare
cursor c is select field1 from table1 where field2='...';
i number;
n number;
begin
i:=0;
while (i<10) loop
dbms_output.put_line('Iteration i='||to_char(i));
open c;
loop
fetch c into n;
if c%found then
dbms_output.put_line('Fount n='||to_char(n));
else
dbms_output.put_line('Not Fount. Close cursor');
close c;
exit;
end if;
end loop;
i:=i+1;
end loop;
end;
Сообщ. #733400
19.11.2001 12:08
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 04.12.2001 11:31
Сообщ.: 4, Visits: 45
Правильно конечно же читать curTest. Так оно и есть, очепятка.
exit в цикл не попал по причине того, что код отладочный, сделан только для нахождения причины не работоспособности хранимой процедуры. И в данном случае это не принципиально т.к. проход по циклу выполняется всего один раз. После первого close curTest происходит выход, как из цикла, так и процедуры.

Приведенный пример, как я понял, взят из тела программы. А проблема находится именно в хранимой процедуре.

Благодарю за отклик!
Сообщ. #733424
19.11.2001 13:00
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 24.04.2002 10:25
Сообщ.: 72, Visits: 793
Ну на тебе "живую" процедуру:
create or replace procedure prc_a
is
cursor c is select id_terminal from terminal where num>5;
i number;
n number;
begin
i:=0;
while (i<10) loop
dbms_output.put_line('Iteration i='||to_char(i));
open c;
loop
fetch c into n;
if c%found then
dbms_output.put_line('Fount n='||to_char(n));
else
dbms_output.put_line('Not Fount. Close cursor');
close c;
exit;
end if;
end loop;
i:=i+1;
end loop;
end;
/
execute prc_a;
Сообщ. #733437
22.11.2001 13:46
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 04.12.2001 11:31
Сообщ.: 4, Visits: 45
Все заработало!

Код был правильным. Проблемма ушла после переустановки OS и сервера из за давно накопившихся проблем.

Еще раз благодарю за отклик!
Сообщ. #733979
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 5:24