2010-12-02 9 views
1

Ich habe eine Tabelle, die Daten enthält, die hierarchische Strukturen darstellt. Der einfachste Weg, Daten aus dieser Tabelle für ein einzelnes "Objekt" zu erhalten, ist eine rekursive Abfrage. Die gleiche Tabelle speichert auch "Mitgliedsvariablen", die dem "Objekt" zugeordnet sind. Ich dachte, es wäre schön, die Objektstruktur sowie assoziiertes Mitglied Variablen in einer einzigen Abfrage zu sehen, so habe ich versucht, so etwas wie:Mix rekursive Abfragen und Cursor-Ausdrücke

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; 

... und Oracle sagt mir „Cursor Ausdruck ist nicht zulässig“.

Wenn ich dies als zwei separate Cursor tun (durch die Ergebnisse einer Looping und dann die anderen Cursor auf Grundlage dieser Ergebnisse verwenden), alles funktioniert gut, so dass ich nicht Notwendigkeit eine Single-Cursor Lösung.

Ich wollte nur wissen, warum ich diese beiden Abfragen nicht kombinieren kann mit Cursor-Ausdrücke - oder kann ich Ich kombiniere sie und ich habe es einfach irgendwie verpasst?

(Oracle Version 10g)

+0

Ich denke nicht, dass Sie den Cursor-Ausdruck in der Klausel from verwenden können. Ich verstehe auch nicht genau, was Sie hier versuchen. Können Sie ein Beispiel für die von Ihnen erhoffte Ausgabe geben? – Craig

+0

@Craig: Du hast Recht. Ich musste den Cursor-Ausdruck in die SELECT-Klausel verschieben. – FrustratedWithFormsDesigner

Antwort

2

Ich glaube nicht, Sie müssen dort die CURSOR Schlüsselwort verwenden. Wie die Erklärung für ora-22902 Zustände gibt, ist CURSOR() nur in der Projektion einer SELECT-Anweisung anwendbar.

Wir können Inline-Views in unserer FROM-Klausel verwenden. In Ihrem Fall, dass würde so aussehen:

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

Ihre WHERE-Klausel nicht gut genug ist, weil Sie etwas brauchen, die die Inline-Ansicht auf obj_type und/oder OBJ_TAB verbindet. Deshalb habe ich omv.object_id in die Projektion der Unterabfrage verschoben: um einen Haken für die WHERE-Klausel der äußeren Abfrage zu geben.

+0

Sie sind richtig, ich war zu schnell, um den zusätzlichen Müll loszuwerden Ich habe die Join-Bedingungen loswerden. Ich korrigiere es ... – FrustratedWithFormsDesigner

+0

Yup, aus irgendeinem Grund hatte ich den Cursor-Ausdruck in den falschen Teil der Abfrage. Ich las deine Antwort noch einmal, sah noch einmal, machte eine Gesichtspalme und reparierte sie. Läuft jetzt gut. – FrustratedWithFormsDesigner