powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / не могу создать курсор
12 сообщений из 12, страница 1 из 1
не могу создать курсор
    #32106415
snl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
snl
Гость
Всем привет!
Я хочу создать курсор типа
cursor tfacr200 (date_f date, cuno char) is
select a.t$ttyp as ttyp,
(select sum(t$amth+t$cdam)
from baan.ttfacr200308 b
where b.t$ttyp = a.t$ttyp
and b.t$trec <> a.t$trec
and t$docd < date_f) as sum_opl_f,
from baan.ttfacr200308 a
where trim(t$cuno) = trim(cuno)
and t$docd < date_t;
при компиляции ХП возникает ошибка о недопустимости использования второго select - а, но в SQL Plus такой запрос отрабатывается без проблем

В чем может быть ошибка? можно ли как-то переделать курсор
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106474
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты привел именно то запрос, который откомпилировать пытаешься? В нем запятая лишняя после "as sum_opl_f". Если в плюсе отрабатывает без проблем, а в процедуре нет- как правило проблема связана с отсутствием явных прав (не через роли) на объекты, учавствующие в запросе.
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106492
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно поподробнее про явные права? На что это влияет? То бишь дача права роли, а потом предоставление роли не равны прямой дачи права?
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106498
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет - для вьюх, процедур и т.п.
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106501
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разница есть, при компиляции Oracle проверяет прова на объекты используемые в PL\SQL блоке. Они должны быть указаны явно, так как имеется возможность использовать команду SET ROLE, что может привести к ошибкам. Еще имеется возможность выполнения блока с правами вызывающего, тогда можно использовать роли.
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106578
snl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
snl
Гость
Denis,
Строчку объявления курсора я немного сократила, и запята это очепятка

И вряд ли это проблемма с правами, т.к grant на эту таблицу я дала

А жаба при компиляции говорит следующее:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:
и длинный список где ожидался select

что же делать?
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106598
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, и Java внезапно появилась:) Скажи, так где именно ты хочешь объявить курсор: в pl/sql-процедуре или java-классе? покажи, как именно делаешь. И желательно бы иметь структуру таблицы baan.ttfacr200308, точнее только той ее части, которая касается запроса.
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106604
snl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
snl
Гость
Denis,
не совсем пойму при чем тут Java, речь идет о хранимой процедуре PL/SQL
структура таблицы наверное большой роли не играет. Может просто нельзя создавать курсоры со вложенными select-ми? хотя в документации ограничений не нашла :((
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106611
Edw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Edw
Гость
Причина не в правах.
До версии Oracle 9i в PL/SQL был отдельный sql-парсер. Он не учитывал все новшества SQL машины. Не берет он например select (select...) from .
Поэтому в процедуре такие вещи можно использовать только с помощью динамического SQL.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare
  TYPE RefCurType IS REF CURSOR;
  cv RefCurType;
  sql_str varchar2( 2000 );
  param varchar2( 1 ) := 'X';
  rnum number;
begin
  sql_str := 'select (select 555 from sys.dual) from sys.dual where dummy = :b1 ';
  open cv for sql_str using param;
  loop
    fetch cv into rnum;
    exit when cv%notfound;
    DBMS_OUTPUT.PUT_LINE ( 'rnum= ' || rnum );     
  end loop;    
  close cv; 
end;


А можно и просто переписать запрос твоего курсора,
примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select a.t$ttyp as ttyp, sum (t$amth + t$cdam)
  from baan.ttfacr200308 a,
       baan.ttfacr200308 b
 where trim (a.t$cuno) = trim (a.cuno) 
   and a.t$docd < a.date_t
   and b.t$ttyp = a.t$ttyp
   and b.t$trec <> a.t$trec
   and t$docd < date_f
 group by a.t$ttyp
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106616
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"жаба" - это TOAD? Значит, я не так тебя понял. Inline-select действительно появились в 9i.
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106617
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, вру: на 8i тоже идут.
...
Рейтинг: 0 / 0
не могу создать курсор
    #32106643
snl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
snl
Гость
Edw,
Динамический SQL помог
большое спасибо
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / не могу создать курсор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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