Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / курсорная переменная - ошибка "fetch out of sequence" / 24 сообщений из 24, страница 1 из 1
08.05.2003, 10:13
    #32155748
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
Столкнулся с проблемой и не могу понять в чем дело. Есть у меня пакадж:
Код: 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
08.05.2003, 10:36
    #32155768
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
Хм, ты открыл курсор, пробежался по ему до конца, а потом возвращаешь клиенту. В оракле курсоры однонаправленные, т.е. после такого тебе следует заново его открыть.
...
Рейтинг: 0 / 0
08.05.2003, 10:56
    #32155795
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
как же так? я добрался до конца курсора, хорошо, но курсор-то еще открыт!
если я теперь его опять открывать буду, это же криво, нельзя ли теперь вернутся к началу курсора?
...
Рейтинг: 0 / 0
08.05.2003, 11:05
    #32155805
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
ах да, однонаправленные говоришь.. блин, как неудобно!!! эх, Оракл, блин :(
...
Рейтинг: 0 / 0
08.05.2003, 11:05
    #32155806
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
"но курсор-то еще открыт! "

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

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

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

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

А если отпарсенный SQL инвалидируется, инвалидируется ли ассоциированный с ним курсор? или потом при обращении к нему, SQL просто парсится заново?
...
Рейтинг: 0 / 0
08.05.2003, 11:38
    #32155869
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
Может быть имеется в виду следующее:
Код: 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
08.05.2003, 11:48
    #32155885
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
так при этом дважды будет выполняться запрос! а иначе нельзя?
...
Рейтинг: 0 / 0
08.05.2003, 11:52
    #32155892
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
Будет. Про "иначе" я уже говорил - заполни объектную таблицу и бегай по ней.
...
Рейтинг: 0 / 0
08.05.2003, 11:59
    #32155910
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
пардон, я с объектными таблицами не работал. В чем тут будет собственно разница по сравнению с обычной реляционной таблицей, все равно же она будет "реальной"(?), а мне нужно, что бы все это дело было в оперативке и только на момент выполнения функции.
...
Рейтинг: 0 / 0
08.05.2003, 12:09
    #32155934
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
Не будет она "реальной". Будет только объявление типа. Начиная с 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
08.05.2003, 12:12
    #32155941
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
курсорная переменная - ошибка "fetch out of sequence"
Если нельзя сделать нечто

reset(cr);
fetch cr into v;

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

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

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

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

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


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