Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
Оракл 9.2i
Написал следующий код ( все имена изменены :) )

CREATE OR REPLACE PACKAGE SOME_PKG AS
   type cv_curtype is ref cursor;
   function some_func return cv_curtype;
end;


CREATE OR REPLACE PACKAGE BODY SOME_PKG  AS
function some_func return cv_curtype is
  cv cv_curtype;
  rec some_table%ROWTYPE;
begin
    open cv for some_string;  -- здесь какой-то запрос из some_table вместо some_string
--        fetch cv into rec;  ( * )
    return cv;
end;

end;


Теперь из клиентского приложения ( конкретнее forms 6i ) вызываю

declare
	type cv_curtype is ref cursor;
	cv cv_curtype;
        rec some_table%ROWTYPE;
begin
   	cv := some_pkg.some_func;
        message( decode( cv%ISOPEN, true, 'open', false, 'closed' ) );
        loop
             fetch cv into rec;
             exit when cv%NOTFOUND;
             message(rec.some_field);
        end loop;
        close cv;
end;

Печатает closed, и соответсвенно выкидывает ora-10001 - т.е. курсор закрыт. Почему, ведь он открылся, а потом ссылку передал на уже открытый курсор?
Если раскомментировать строку со звездочкой в пакете, то на сервере мы считаем строку с курсора, и он теперь на клиенте считает его открытым. Что-то я здесь недопонимаю, может кто-нибудь объяснить как это сделать правильно?
7 июл 10, 16:16    [9065648]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Voler48
Member

Откуда:
Сообщений: 152
Valergrad,
Проверял на 9.0.4 - работает с
-- fetch cv into rec; ( * )
7 июл 10, 17:31    [9066385]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
Не совсем. Если fetch в пакете разкомментировать, то на клиенте извлечение начинается со второй строчки, что не есть хорошо.
7 июл 10, 17:46    [9066492]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Voler48
Member

Откуда:
Сообщений: 152
Valergrad
Не совсем. Если fetch в пакете разкомментировать, то на клиенте извлечение начинается со второй строчки, что не есть хорошо.

Сам себя решил обмануть ?
7 июл 10, 18:21    [9066769]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Все должно работать, причина у Вас в чем-то другом (может клиент повторно открывает).
7 июл 10, 18:24    [9066786]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
stax..
Guest
JaRo
Все должно работать, причина у Вас в чем-то другом (может клиент повторно открывает).

c какой версии forms decode можно вызвать не через select?

.....
stax
7 июл 10, 18:32    [9066830]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
JaRo,

Ну, я тоже думал, что должно.

	  if ( cv%ISOPEN ) then message('true'); else message('false'); end if;
	  
	 	loop	 			 	
	 		message('fetched='||cv%ROWCOUNT);	
	 		fetch cv into cur_abit_plan;
	 		exit when cv%NOTFOUND;
	 	end loop;
	 	close cv;

С раскомментированным fetch на сервере выдает 1. И это абсолютно логично, потому что мы уже 1 запись считали.
Но вот нелогично почему он без него считает курсор закрытым...
7 июл 10, 18:43    [9066901]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Девятка...
Вот тут посмотрите
7 июл 10, 18:50    [9066947]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
А теперь совсем запутался.
Если все то же самое выполнить через sql*plus, то все работает как и должно быть.
Т.е. без всяких fetch он считает курсор открытым.
Получается, что почему-то именно формс считает этот курсор закрытым.
Никто не знает как это обойти?
7 июл 10, 19:00    [9067006]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Elic
Member

Откуда:
Сообщений: 29976
andrey_anonymous
Девятка...
Вот тут посмотрите
Мне тоже сперва подумалось в эту сторону. Но здесь нет ref cursor-а как параметра динамики. IMHO, не то.
7 июл 10, 19:05    [9067026]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Elic
andrey_anonymous
Девятка...
Вот тут посмотрите
Мне тоже сперва подумалось в эту сторону. Но здесь нет ref cursor-а как параметра динамики. IMHO, не то.

Я бы попробовал - динамика тоже непонятно почему ломалась - возможно, курсор на "открытость" проверяла :)
7 июл 10, 19:09    [9067045]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
А что попробовать? Насколько я понял в той теме рекомендуют открыть-закрыть курсор.
К сожалению, в формсе я не могу открыть курсор, он
не понимает синтаксис типа

open cv for some_string;

( почему собственно я делаю это на сервере).
7 июл 10, 19:11    [9067058]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Valergrad
А что попробовать? Насколько я понял в той теме рекомендуют открыть-закрыть курсор.
К сожалению, в формсе я не могу открыть курсор, он
не понимает синтаксис типа

Нет.
Попробуйте так:
function some_func return cv_curtype is
  cv cv_curtype;
  rec some_table%ROWTYPE;
begin
    open cv for 'select * from dual';
    close cv;
    open cv for some_string;  -- здесь какой-то запрос из some_table вместо some_string
--        fetch cv into rec;  ( * )
    return cv;
end;
7 июл 10, 19:14    [9067073]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
Попробовал, не помогло. Но это и логично, т.к. на сервере все и без передергиваний прекрасно работает. Проблема возникает именно в момент перехода с сервера на формс.
Я попробовал даже так - добавить в пакет

function some_func2 return cv_curtype is
  cv cv_curtype;
  rec some_table%ROWTYPE;
begin
    open cv for some_string;  -- здесь какой-то запрос из some_table вместо some_string
    fetch cv into rec;  
    return cv;
end;


и на клиенте
cv := some_pkg.some_func2; 
if ( cv%ISOPEN ) then message('true'); else message('false'); end if; -- true
cv := some_pkg.some_func; -- с тайной надеждой, что курсор останется открытым...
if ( cv%ISOPEN ) then message('true'); else message('false'); end if; -- хрен, false
7 июл 10, 19:23    [9067115]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
По всей видимости баг формса...
И dbms_sql он тоже не воспринимает...
Долбаный формс...
Блин, как же мне в нем реализовать систему фильтров по некоторой таблице.
7 июл 10, 19:53    [9067239]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Hard Core
Guest
select 1, ..... from dual
union all
select 2, ..... from need_table
order by 1
7 июл 10, 20:03    [9067272]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Valergrad
Блин, как же мне в нем реализовать систему фильтров по некоторой таблице.

Ээээ... Формс как раз славен тем, что его самого достаточно для ораганизации поисков-фильтров и т.п. - без приседаний на стороне сервера.
7 июл 10, 20:06    [9067281]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
andrey_anonymous,

Да, конечно, пришлось так и сделать - создать блок, у него динамически изменять where сlause, и обходить получившиеся записи. Но мне эти записи совсем не нужно было выводить на форму, а просто обрабатывать определенным образом, и вообще это серьезное падение производительности по-моему.
7 июл 10, 20:12    [9067306]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Valergrad

Да, конечно, пришлось так и сделать - создать блок, у него динамически изменять where сlause, и обходить получившиеся записи. Но мне эти записи совсем не нужно было выводить на форму, а просто обрабатывать определенным образом, и вообще это серьезное падение производительности по-моему.

Минуточку.
Либо Вы ставите динамически where clause, либо "обходите" ненужные строки - Вы уж определитесь.
Первое - это именно то, как надо делать.
Второе - ...

Есть и более простой путь.
Почитайте-ка формовскую доку на предмет enter-query.
Заодно научитесь запросы делать из форм.
Познав это дао однажды - будете сильно по нему скучать в любом другом клиенте :)
7 июл 10, 21:24    [9067567]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
Valergrad
Member

Откуда:
Сообщений: 703
andrey_anonymous,

вы меня не поняли совсем.
Enter-query не позволяет сложные фильтры, с функциями, с зависимостью между полями и т.д.
Не говоря о том, что учить с ним работать конечного пользователя себе дороже.
И под "обходить" я имел ввиду "обрабатывать" а не "уворачиваться".
8 июл 10, 08:51    [9068730]     Ответить | Цитировать Сообщить модератору
 Re: REF CURSOR - что-то недопонимаю  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Valergrad
Enter-query не позволяет сложные фильтры, с функциями, с зависимостью между полями и т.д.

Умеет
.
Говорю же - почитайте.
Особенно про знак "двоеточие" ;)
8 июл 10, 16:24    [9073258]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить