Смешайте рекурсивные запросы и выражения курсора - PullRequest
1 голос
/ 02 декабря 2010

У меня есть таблица, которая содержит данные, которые представляют иерархические структуры. Самый простой способ получить данные из этой таблицы для одного «объекта» - это рекурсивный запрос. В той же таблице также хранятся «переменные-члены», связанные с «объектом». Я подумал, что было бы неплохо увидеть структуру объекта, а также связанные переменные-члены в одном запросе, поэтому я попробовал что-то вроде:

cursor object_explorer is
           select (level*2) lvl, ob.object_id, lpad(ot1.object_type_name, 2*level + length(ot1.object_type_name), '.') ob_typ_nam
              from obj_tab ob, obj_type ot1
                  , cursor (select lpad(mv.member_var_name, level + length(mv.member_var_name), ' ') var_nam, /*other stuff*/
                             from obj_type ot2, object_memberVar_value omv, member_variable mv
                              where mv.member_variable_id = omv.member_variable_id
                              and ot2.object_type_id = omv.object_type_id
                              and omv.object_id = ob.object_id)
              where ot1.object_type_id = ob.object_type_id
              and /*other filtering conditions unrelated to problem at hand*/
              start with ob.objecT_id = '1234567980ABC' 
              connect by nocycle ob.parent_object = prior ob.object_id;

... и Oracle говорит мне "Курсорное выражение не разрешено".

Если я делаю это как два отдельных курсора (циклически просматривая результаты одного, а затем используя другой курсор на основе этих результатов), все работает нормально, поэтому мне не нужно один курсор решение.

Я просто хотел узнать, почему я не могу объединить эти два запроса с помощью выражений курсора - или может Я объединю их и просто как-то пропустил?

(версия Oracle 10g)

1 Ответ

2 голосов
/ 03 декабря 2010

Не думаю, что вам нужно использовать ключевое слово CURSOR. Как объясняет ora-22902, CURSOR () применим только в проекции оператора SELECT.

Мы можем использовать встроенные представления в нашем предложении FROM. В вашем случае это будет выглядеть так:

....
from obj_tab ob, obj_type ot1
     , (select omv.object_id
               , lpad(mv.member_var_name, level + length(mv.member_var_name), ' ') var_nam
               , /*other stuff*/
         from obj_type ot2, object_memberVar_value omv, member_variable mv
         where mv.member_variable_id = omv.member_variable_id
         and ot2.object_type_id = omv.object_type_id
         ) iv
where iv.object_id = ob.object_id
and /*filtering conditions unrelated to problem at hand*/
....

Ваше предложение WHERE недостаточно хорошо, потому что вам нужно что-то, что соединяет встроенное представление с OBJ_TYPE и / или OBJ_TAB. Вот почему я переместил omv.object_id в проекцию подзапроса: чтобы перехватить предложение WHERE внешнего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...