1

階層構造を表すデータを含むテーブルがあります。単一の「オブジェクト」についてこのテーブルからデータを取得する最も簡単な方法は、再帰クエリです。同じテーブルには、「オブジェクト」に関連付けられている「メンバー変数」も格納されます。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です)

4

1 に答える 1

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*/
....

インラインビューをOBJ_TYPEやOBJ_TABに結合するものが必要なため、WHERE句は十分ではありません。そのためomv.object_id、サブクエリのプロジェクションに移動しました。外部クエリのWHERE句のフックを指定するためです。

于 2010-12-02T23:29:36.743 に答える