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