powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / курсорная переменная - ошибка "fetch out of sequence"
24 сообщений из 24, страница 1 из 1
курсорная переменная - ошибка "fetch out of sequence"
    #32155748
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с проблемой и не могу понять в чем дело. Есть у меня пакадж:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
PACKAGE GL
  IS

  TYPE TRecord IS RECORD (
     x tester.test.fx%TYPE,
     y tester.test.fy%TYPE);
  TYPE TCursor IS REF CURSOR RETURN TRecord;

END;

и есть функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
FUNCTION test_func RETURN  GL.TCursor IS

  cur_get GL.TCursor;
  rec_get GL.TRecord;

BEGIN 
  OPEN cur_get FOR
    SELECT x, y  FROM tester.test
    WHERE y = '0';
    LOOP
      FETCH cur_get INTO rec_get;      
      EXIT WHEN cur_get%NOTFOUND;
      .....
    END LOOP;
  RETURN cur_get;
  
END;

Вся проблема в том, что при вызове этой функции из клиентской программы выскакивает ошибка ora-01002:fetch out of sequence. В чем тут может быть дело?
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155768
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, ты открыл курсор, пробежался по ему до конца, а потом возвращаешь клиенту. В оракле курсоры однонаправленные, т.е. после такого тебе следует заново его открыть.
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155795
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как же так? я добрался до конца курсора, хорошо, но курсор-то еще открыт!
если я теперь его опять открывать буду, это же криво, нельзя ли теперь вернутся к началу курсора?
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155805
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ах да, однонаправленные говоришь.. блин, как неудобно!!! эх, Оракл, блин :(
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155806
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"но курсор-то еще открыт! "

Курсор это такая-же переменная памяти, как и все остальные.
Все переменные обьявленные в обычных прцедурах и функциях - локальны - это означает, когда функция или процедура заверщается - высвобождаются все локальные переменные.
В данном сдучае переменная cur_get GL.TCursor обьявлена внутри функции - она не может существовать вне функции.

Если ты хочешь обращаться к курсору, обьяви его в пакете(модуле).
Потомучто переменные пакета являются глобальными и будут высвобождены только после завершения сессии.
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155834
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не получается обявить глобально в модуле переменную типа ref cursor...
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155837
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты обьяви просто курсор
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155839
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж очень хочется извернуться - выложи данные запроса в объектную таблицу, пробегись по ней, сделай все, что надо, а потом открой курсор как запрос из нее. Если нет - помни о том, что курсоры в Оракле работают в одну сторону.
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155843
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так тип ref cursor уже объявлен, в модуле GL, а где я буду использовать этот тип в теле этого же модуля или где-то еще, не все ли равно?
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155844
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот выдержка из книги

При этом открытие и закрытие курсора должно выполняться в приложении очень аккуратно для возможности его повторного использования в закрытых SQL областях.

Как же тогда можно использовать курсор повторно если он однонаправленный? Или здесь по аналогии с soft parse - если курсор уже открыт то его повторное открытие делается быстро типа soft open?

А если отпарсенный SQL инвалидируется, инвалидируется ли ассоциированный с ним курсор? или потом при обращении к нему, SQL просто парсится заново?
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155869
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть имеется в виду следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare
  cursor cr is
    select * from scott.emp;
  v cr%rowtype;
begin
  open cr;
  loop
    fetch cr into v;
    exit when cr%notfound;
  end loop;
  close cr;
   -- Повторное использование.
 
  open cr;
  fetch cr into v;
  close cr;
   -- А здесь демонстрация "аккуратного использования".
 
exception when others then
  if cr%isopen then close cr; end if;
  raise;
end;
/
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155885
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так при этом дважды будет выполняться запрос! а иначе нельзя?
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155892
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет. Про "иначе" я уже говорил - заполни объектную таблицу и бегай по ней.
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155910
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пардон, я с объектными таблицами не работал. В чем тут будет собственно разница по сравнению с обычной реляционной таблицей, все равно же она будет "реальной"(?), а мне нужно, что бы все это дело было в оперативке и только на момент выполнения функции.
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155934
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не будет она "реальной". Будет только объявление типа. Начиная с Oracle 8i:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
create or replace type t_emp as object (
    empno number( 4 )
  , ename varchar2( 10 )
  , job varchar2( 9 )
  , mgr number( 4 )
  , hiredate date
  , sal number( 7 , 2 )
  , comm number( 7 , 2 )
  , deptno number( 2 )
)
/
create or replace type tbl_emp as table of t_emp
/

declare vt_emp tbl_emp;
        cr sys_refcursor;
begin                    
   -- Заполнил переменную.
 
  select cast(multiset(select * from scott.emp) as tbl_emp)
  into vt_emp
  from dual;            
   -- Делай с ней что хочешь.
 
  for i in vt_emp.first..vt_emp.last loop
    null;
  end loop;                 
   -- Открывай курсор по ней же.
 
  open cr for
    select * from table (cast(vt_emp as tbl_emp));
end;
/


Я не предполагал, что еще раз разрожусь на подобные примеры:)
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32155941
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нельзя сделать нечто

reset(cr);
fetch cr into v;

тогда хочется согласиться с guilty это же криво .

Ведь поставить курсор на начало вроде бы проще чем открыть его заново.

Конечно есть подозрение что такая ситуация с однонаправленностью имеет место из-за поддержки консистентности. Открыли курсор - есть гарантия что пробежав по нему мы получим консистентные данные на момент открытия. Насколько я знаю и в обычных запросах тоже курсоры используются только неявно.

Если бы курсор можно было использовать повторно сколь угодно долго, была бы большая нагрузка на роллбэк для поддержки read consistency и высокая вероятность snapshot too old.
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156004
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Denis Popov - хм, вот это уже наверно больше подходит, спасибо! А насчет Я не предполагал, что еще раз разрожусь на подобные примеры:) , хорошо что разродился ;) , думаю, что нашлись еще люди, которым небезынтересно было это увидеть.

2 Violina - насчет snapshot too old - резонная причина, как мне кажется, но такая забота создателей Оракл о консистентности, превращается в головную боль разработчиков на нем ;)
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156274
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще говоря, как оказалось, я рано радовался :(
пример, который привел Denis Popov рабочий, но не особо красивый, но как оказалось "причесать" его нельзя!!! под "причесыванием" я имею ввиду объявление табличной переменной:
Код: plaintext
TYPE TTable IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;

и работать с ней, однако, такой номер не проходит, выдается ошибка компиляции при использовании ее в
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
...
  tbl_emp TTable;
begin
...
  select cast(multiset(select * from scott.emp) as tbl_emp)
  into vt_emp
  from dual;
...
end;
,
впрочем не проходит и создание типа объектной таблицы:
Код: plaintext
TYPE TObj AS OBJECT (rec emp%ROWTYPE);

как оказалось, такое объявление недопустимо! вобщем, как в басне: "а воз и ныне там..."
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156284
LG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>cast(multiset(select * from scott.emp) as tbl_emp)
вот к этому >>create or replace type t_emp as object
Для таблица оф %ROWTYPE кастить не надо.
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156290
LG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, еще, если будеш делать не select ... from dual, используй bulk collect
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156293
LG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще: PL/SQL User's Guide and Reference, 4. Collections and Records
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156301
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как насчет http:// для PL/SQL User's Guide and Reference, 4. Collections and Records?
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156304
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что ты привел PL/SQL таблицу е не объектную
...
Рейтинг: 0 / 0
курсорная переменная - ошибка "fetch out of sequence"
    #32156328
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / курсорная переменная - ошибка "fetch out of sequence"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]