Oracle
 sql >> Database >  >> RDS >> Oracle

Calcola la percentuale della radice posseduta dai suoi genitori

In 11g, probabilmente qualcosa come-

SELECT a.*, LEVEL AS lvl
      ,XMLQuery( substr( sys_connect_by_path( percent_owned, '*' ), 2 ) RETURNING CONTENT).getnumberval() AS calc
   FROM hierarchy_test a
  START WITH id = 1
CONNECT BY nocycle PRIOR parent_id = id;

SQL Fiddle .

Oppure, secondo il tuo '1'|| trucco-

SELECT a.*, LEVEL AS lvl
      , XMLQuery( ('1'|| sys_connect_by_path( percent_owned, '*' )) RETURNING CONTENT).getnumberval() AS calc
   FROM hierarchy_test a
  START WITH id = 1
CONNECT BY nocycle PRIOR parent_id = id;

Sfortunatamente in 10g, XMLQuery non può accettare funzioni e si aspetta sempre una stringa letterale per la valutazione, ad esempio-

select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val 
  from dual;

funziona e restituisce 0.25 , ma

select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
   from dual;

restituisce ORA-19102: XQuery string literal expected .

La query potrebbe rallentare man mano che il numero di livelli su un albero aumenta con un sovraccarico aggiuntivo della creazione interna dell'albero da parte di XMLQuery si. Il metodo più ottimale per ottenere il risultato sarebbe comunque una funzione PL/SQL che, tra l'altro, funzionerebbe sia in 10g che in 11g.