Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oblicz procent korzenia posiadanego przez jego rodziców

W 11g, prawdopodobnie coś w rodzaju-

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;

Skrzypce SQL .

Lub, zgodnie z Twoim '1'|| sztuczka-

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;

Niestety w 10g, XMLQuery nie może akceptować funkcji i zawsze oczekuje literału ciągu do oceny, na przykład-

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

działa i zwraca 0.25 , ale

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

daje ORA-19102: XQuery string literal expected .

Zapytanie może działać wolniej wraz ze wzrostem liczby poziomów w drzewie z dodatkowym obciążeniem wewnętrznym tworzeniem drzewa przez XMLQuery samo. Najbardziej optymalną metodą osiągnięcia tego rezultatu byłaby nadal funkcja PL/SQL, która, nawiasem mówiąc, działałaby zarówno w 10g, jak i 11g.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pomiń błędy ORA-00942 w skryptach tworzenia ddl

  2. Globalna tabela tymczasowa

  3. Jak przekazać w tablicy podczas wywoływania procedury składowanej za pomocą Spring Data JPA?

  4. Czy istnieje sposób na dodanie kolumny w określonej pozycji w tabeli Oracle?

  5. Jak zobaczyć aktualną instrukcję Oracle SQL, która jest wykonywana?