Domanda

Ho una tabella che contiene i dati che rappresentano le strutture gerarchiche. Il modo più semplice per ottenere i dati di questa tabella per un singolo "oggetto" è una query ricorsiva. La stessa tabella memorizza anche "variabili utente" che sono associati con il "oggetto". Ho pensato che sarebbe stato bello vedere la struttura dell'oggetto, così come variabili membro associate in una singola query, quindi ho cercato qualcosa di simile:

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;

... e Oracle mi dice "espressione cursore non consentita".

Se faccio questo come due cursori separati (scorrendo i risultati di uno e poi con l'altro cursore sulla base di tali risultati), tutto funziona bene, quindi non mi necessità di un singolo cursore soluzione.

Volevo solo sapere perché non riesco a combinare questi due query utilizzando le espressioni del cursore -? O può I combinarli e ho appena perso in qualche modo

(versione di Oracle 10g è)

È stato utile?

Soluzione

Non credo che voi ci necessario utilizzare il CURSORE parola chiave. Per quanto la spiegazione per gli stati ora-22902, cursore () è applicabile solo nella proiezione di un'istruzione SELECT.

Si può utilizzare una vista in linea nel nostro clausola FROM. Nel tuo caso, che sarà simile:

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

Il tuo clausola WHERE non è abbastanza buono, perché avete bisogno di qualcosa che unisce la vista in linea di OBJ_TYPE e / o OBJ_TAB. Ecco perché ho spostato omv.object_id nella proiezione di sub-query: per dare un gancio per l'esterno Query clausola WHERE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top