階層構造を表すデータを含むテーブルがあります。単一の「オブジェクト」についてこのテーブルからデータを取得する最も簡単な方法は、再帰クエリです。同じテーブルには、「オブジェクト」に関連付けられている「メンバー変数」も格納されます。1つのクエリでオブジェクト構造と関連するメンバー変数を確認するとよいと思ったので、次のように試しました。
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は「カーソル式は許可されていません」と言っています。
これを2つの別々のカーソルとして実行すると(一方の結果をループし、それらの結果に基づいてもう一方のカーソルを使用する)、すべてが正常に機能するため、単一カーソルソリューションは必要ありません。
カーソル式を使用してこれら2つのクエリを組み合わせることができない理由を知りたかっただけです。または、それらを組み合わせることができて、どういうわけかそれを見逃したのでしょうか。
(Oracleバージョンは10gです)