Oracle
 sql >> Base de données >  >> RDS >> Oracle

Calculer le pourcentage de la racine détenue par ses parents

En 11g, Probablement quelque chose comme-

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 .

Ou, selon votre '1'|| astuce-

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;

Malheureusement en 10g, XMLQuery ne peut pas accepter les fonctions et attend toujours un littéral de chaîne pour l'évaluation par exemple-

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

fonctionne et renvoie 0.25 , mais

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

donne ORA-19102: XQuery string literal expected .

La requête peut devenir plus lente à mesure que le nombre de niveaux sur une arborescence augmente avec une surcharge supplémentaire de création d'arborescence interne par XMLQuery lui-même. La méthode la plus optimale pour obtenir le résultat serait toujours une fonction PL/SQL qui, soit dit en passant, fonctionnerait à la fois en 10g et 11g.