|
|
|
новичок
      
участник
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;
|
|
|
|
|
Forum 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;
|
|
|
|
|
новичок
      
участник
Last Login: 04.12.2001 11:31
Сообщ.: 4,
Visits: 45
|
|
Правильно конечно же читать curTest. Так оно и есть, очепятка. exit в цикл не попал по причине того, что код отладочный, сделан только для нахождения причины не работоспособности хранимой процедуры. И в данном случае это не принципиально т.к. проход по циклу выполняется всего один раз. После первого close curTest происходит выход, как из цикла, так и процедуры.
Приведенный пример, как я понял, взят из тела программы. А проблема находится именно в хранимой процедуре.
Благодарю за отклик!
|
|
|
|
|
Forum 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;
|
|
|
|
|
новичок
      
участник
Last Login: 04.12.2001 11:31
Сообщ.: 4,
Visits: 45
|
|
Все заработало!
Код был правильным. Проблемма ушла после переустановки OS и сервера из за давно накопившихся проблем.
Еще раз благодарю за отклик!
|
|
|
|