sql >> Base de Datos >  >> RDS >> Oracle

Calcular el porcentaje de la raíz propiedad de sus padres

En 11g, probablemente algo como-

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 .

O, según su '1'|| truco-

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;

Desafortunadamente en 10g, XMLQuery no puede aceptar funciones y siempre espera una cadena literal para la evaluación, por ejemplo-

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

funciona y devuelve 0.25 , pero

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

da ORA-19102: XQuery string literal expected .

La consulta puede volverse más lenta a medida que aumenta la cantidad de niveles en un árbol con una sobrecarga adicional de la creación interna del árbol por parte de XMLQuery sí mismo. El método más óptimo para lograr el resultado seguiría siendo una función PL/SQL que, por cierto, funcionaría tanto en 10g como en 11g.