Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Berechnen Sie den Prozentsatz des Stamms, der seinen Eltern gehört

In 11g, wahrscheinlich so etwas wie-

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-Geige .

Oder gemäß Ihrem '1'|| Trick-

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;

Leider in 10g, XMLQuery kann keine Funktionen akzeptieren und erwartet immer ein String-Literal zur Auswertung, zum Beispiel-

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

funktioniert und gibt 0.25 zurück , aber

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

ergibt ORA-19102: XQuery string literal expected .

Die Abfrage wird möglicherweise langsamer, wenn die Anzahl der Ebenen in einem Baum zunimmt, was zu einem zusätzlichen Overhead der internen Baumerstellung durch XMLQuery führt selbst. Die optimale Methode, um das Ergebnis zu erzielen, wäre immer noch eine PL/SQL-Funktion, die übrigens sowohl in 10g als auch in 11g funktionieren würde.