混合递归查询和游标表达式

时间:2010-12-02 20:22:42

标签: sql oracle recursive-query

我有一个包含表示层次结构的数据的表。从单个“对象”中获取数据的最简单方法是递归查询。同一个表还存储与“对象”相关联的“成员变量”。我认为在单个查询中查看对象结构以及关联的成员变量会很好,所以我尝试了类似的东西:

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 个答案:

答案 0 :(得分:2)

我认为你不需要在那里使用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子句提供一个钩子。