Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Calcule a porcentagem da raiz de propriedade de seus pais


Em 11g, provavelmente 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 .

Ou, conforme seu '1'|| truque-
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;

Infelizmente em 10g, XMLQuery não pode aceitar funções e sempre espera uma string literal para avaliação, por exemplo-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val 
  from dual;

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

fornece ORA-19102: XQuery string literal expected .

A consulta pode ficar mais lenta à medida que o número de níveis em uma árvore aumenta com uma sobrecarga adicional de criação de árvore interna por XMLQuery em si. O método mais ideal para alcançar o resultado ainda seria uma função PL/SQL que, por sinal, funcionaria tanto em 10g quanto em 11g.