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

Откуда:
Сообщений: 8
Помогите разобраться. При переходе с 9 оракла на 11 столкнулся с проблемой.

В 9 следующий запрос работал:
select l.oper, l.dt, cursor (select p.zn_new, p.zn_old from ibd_log_pole p where l.id=p.id_log)
from ibd_log l
connect by prior l.id=l.id_parent
start with l.id=1


В 11 выдает ошибку: ORA-22902 выражение CURSOR не разрешено
Как заставить такой запрос работать?

Заметил, если закоментарить "start with l.id=1" то запрос запускается без ошибки
8 май 13, 13:14    [14273278]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Попробуйте вынести курсор на уровень выше (над деревом)
8 май 13, 14:46    [14274048]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
JaRo
Member

Откуда:
Сообщений: 1659
И кстати какая именно 11?
8 май 13, 14:51    [14274086]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
MegaN
Member

Откуда:
Сообщений: 8
JaRo
И кстати какая именно 11?


11.2.0.3
8 май 13, 15:37    [14274430]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
MegaN,

а там точно курсор нужен? там что, несколько строк в подзапросе?
8 май 13, 16:09    [14274688]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
JaRo
Member

Откуда:
Сообщений: 1659
JaRo
Попробуйте вынести курсор на уровень выше (над деревом)

+ вот так
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
 
SQL> SELECT t.OBJECT_NAME,
  2         CURSOR( select t2.OBJECT_NAME
  3                 from all_objects t2
  4                 where t2.OBJECT_ID = t.object_id) crs
  5  FROM all_objects t
  6   START WITH t.OBJECT_ID  = 1
  7  CONNECT BY PRIOR t.OBJECT_ID = t.DATA_OBJECT_ID
  8  /
 
SELECT t.OBJECT_NAME,
       CURSOR( select t2.OBJECT_NAME
               from all_objects t2
               where t2.OBJECT_ID = t.object_id) crs
FROM all_objects t
 START WITH t.OBJECT_ID  = 1
CONNECT BY PRIOR t.OBJECT_ID = t.DATA_OBJECT_ID
 
ORA-22902: CURSOR expression not allowed

SQL> SELECT OBJECT_NAME,
  2         CURSOR( select t2.OBJECT_NAME
  3                 from all_objects t2
  4                 where t2.OBJECT_ID = t.object_id) crs
  5  from (
  6  SELECT t.OBJECT_NAME, t.object_id
  7  FROM all_objects t
  8   START WITH t.OBJECT_ID  = 1
  9  CONNECT BY PRIOR t.OBJECT_ID = t.DATA_OBJECT_ID
 10  ) t
SQL> /
 
OBJECT_NAME                    CRS
------------------------------ ---
 
SQL> 
8 май 13, 16:26    [14274808]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
andreymx
а там точно курсор нужен? там что, несколько строк в подзапросе?


Насчет строк не знаю, но полей точно два :).

SY.
8 май 13, 16:27    [14274812]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
SY
andreymx
а там точно курсор нужен? там что, несколько строк в подзапросе?


Насчет строк не знаю, но полей точно два :).

SY.
type рулит. или запрос сверху + джойн

но курсоры... мало ли кто и когда их закрывает
8 май 13, 16:31    [14274832]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
SY
Насчет строк не знаю, но полей точно два :).


А по существу, START WITH вероятней всего реализован через view. A для view курсор запрещен:

SQL> select  empno,
  2          sal,
  3          cursor(select * from dept where dept.deptno = emp.deptno) c
  4    from  emp
  5    where rownum = 1
  6    connect by mgr = prior empno
  7  /

     EMPNO        SAL C
---------- ---------- --------------------
      7788       3000 CURSOR STATEMENT : 3

CURSOR STATEMENT : 3

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS


SQL> create or replace
  2    view emp_vw
  3      as
  4  select  empno,
  5          sal,
  6          cursor(select * from dept where dept.deptno = emp.deptno) c
  7    from  emp
  8    where rownum = 1
  9    connect by mgr = prior empno
 10  /
        cursor(select * from dept where dept.deptno = emp.deptno) c
        *
ERROR at line 6:
ORA-22902: CURSOR expression not allowed


SQL> 


SY.

Сообщение было отредактировано: 8 май 13, 17:17
8 май 13, 17:13    [14275051]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
andreymx
type рулит. или запрос сверху + джойн


B этом случае все данные тупо выбираются а CURSOR очень удобен для drill-down reports где данные из CURSOR выбираются только тогда когда затребованы.

SY.

Сообщение было отредактировано: 8 май 13, 17:22
8 май 13, 17:22    [14275082]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
SY
andreymx
type рулит. или запрос сверху + джойн


B этом случае все данные тупо выбираются а CURSOR очень удобен для drill-down reports где данные из CURSOR выбираются только тогда когда затребованы.

SY.
как насчёт согласованности?

если курсор отбирает данные на момент выполнения главного запроса, то рискуем нарваться на 01555
если на момент своего чтения - то рискуем нарваться на несогласованные данные

ЗЫ: честно признаю, что, к своему сожалению, этого я не знаю
8 май 13, 18:19    [14275311]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
ну и в некоторых случаях вполне реально получить
автор
ORA-00604: ошибка на рекурсивном SQL-уровне 1
ORA-01000: количество открытых курсоров превысило допустимый максимум
8 май 13, 18:22    [14275321]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
MegaN
Member

Откуда:
Сообщений: 8
[quot JaRo]
JaRo
Попробуйте вынести курсор на уровень выше (над деревом)


Спасибо за идею, вынес на уровень выше курсор, все работает, сам че-то не подумал об этом, зациклил мысли на том как не изменяя запрос заставить работать. Странно что в 9i все же работал курсор в дереве.
8 май 13, 18:35    [14275378]     Ответить | Цитировать Сообщить модератору
 Re: использование cursor в запросе дерева  [new]
JaRo
Member

Откуда:
Сообщений: 1659
MegaN
Странно что в 9i все же работал курсор в дереве.
Баг явно. С 10ки, судя по отзывам. В 11.1.0.6 что-то правили с этой ошибкой, но там описание никакое, так что непонятно - то или нет.
MegaN
как не изменяя запрос заставить работать.
В качестве идеи можно поиграться с параметром "_old_connect_by_enabled". Как раз в 10ке деревяшки очень сильно поменяли свой ход/план выполнения и вероятнее всего ошибка наводится чем-то типа появлением view merging, который "не дружит" с курсорными выражениями. Например :) Это всё на уровне предположения.
8 май 13, 19:44    [14275674]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить