Sintaxa funcţiei este:
XMLTABLE(sir_XQuery [optiuni]) XMLTABLE(spatiu_nume, sir_XQuery [optiuni])
PASSING expr [AS alias] [, expr [AS alias]]...]
COLUMNS nume tip PATH 'expresie_Path' [, nume tip PATH 'expresie_Path'] ...
SELECT * FROM XMLTable( 'for $i in ora:view("sectii") return <sectia>{$i//COD}{$i//DENUMIRE}</sectia> ' COLUMNS cod VARCHAR(10) PATH 'COD',denumire varchar(100) path 'DENUMIRE');
SELECT t.* FROM xml1 x, XMLTABLE ( 'for $r in $facultate//SECTIE return $r' PASSING x.xml AS "facultate" COLUMNS cod integer path 'COD', denumire varchar(100) PATH 'DENUMIRE') t where c='2'
Explicaţie.
<SECTIE num="1"> <COD>1</COD> <DENUMIRE>Matematica</DENUMIRE> </SECTIE>
SELECT t.* FROM xml1 x, XMLTABLE ( '$facultate//SECTIE' PASSING x.xml AS "facultate" COLUMNS cod integer path 'COD', denumire varchar(100) PATH 'DENUMIRE') t where c='2'
SELECT t.xml.getStringVal() v FROM xml1 x, XMLTABLE ( 'for $r in $facultate return $r//SECTIE' PASSING x.xml AS "facultate" COLUMNS xml XMLType PATH '.') t where c='2';
<country car_code="RO" area="237500" capital="cty-cid-cia-Romania-2" memberships="org-ACCT org-BIS org-BSEC org-CEI org-CE org-CCC org-ECE org-EBRD org-EU org-FAO org-G-9 org-G-77 org-IAEA org-IBRD org-ICAO org-ICFTU org-Interpol org-IFRCS org-IFC org-IFAD org-ILO org-IMO org-Inmarsat org-IMF org-IOC org-IOM org-ISO org-ICRM org-ITU org-Intelsat org-NAM org-ANC org-NSG org-OSCE org-OAS org-PFP org-PCA org-UN org-UNAVEM-III org-UNESCO org-UNIDO org-UNIKOM org-UPU org-WEU org-WCL org-WFTU org-WHO org-WIPO org-WMO org-WToO org-WTrO org-ZC"> <name>Romania</name> <population>21657162</population> <population_growth>-1.21</population_growth> <infant_mortality>23.2</infant_mortality> <gdp_total>105700</gdp_total> <gdp_agri>19.6</gdp_agri> <gdp_ind>36.3</gdp_ind> <gdp_serv>44.1</gdp_serv> <inflation>25</inflation> <indep_date>1881-01-01</indep_date> <government>republic</government> <encompassed continent="europe" percentage="100"/> <ethnicgroups percentage="0.4">German</ethnicgroups> <ethnicgroups percentage="1.6">Roma</ethnicgroups> <ethnicgroups percentage="8.9">Hungarian</ethnicgroups> <ethnicgroups percentage="89.1">Romanian</ethnicgroups> <religions percentage="6">Roman Catholic</religions> <religions percentage="6">Protestant</religions> <religions percentage="70">Christian Orthodox</religions> <border country="SRB" length="476"/> <border country="H" length="443"/> <border country="UA" length="531"/> <border country="BG" length="608"/> <border country="MD" length="450"/> <province id="prov-cid-cia-Romania-2" capital="cty-cid-cia-Romania-Alba-Iulia" country="RO"> <name>Alba</name> <area>6231</area> <population>428000</population> <city id="cty-cid-cia-Romania-Alba-Iulia" is_state_cap="yes" country="RO" province="prov-cid-cia-Romania-2"> <name>Alba Iulia</name> </city> </province> ..... </country>
select col,count(*) from (SELECT t.* FROM xml1 x, XMLTABLE ( 'for $e in $xml/mondial/* return <a>{$e/name()}</a>' PASSING x.xml AS "xml" COLUMNS col varchar(20) PATH '.' ) t where c='4' ) group by col order by 1
Rezultatul care se obţine este:
COL COUNT(*) ---------------------------------------------------------------------------------------------------- ---------------------- continent 5 country 238 desert 63 island 276 lake 130 mountain 240 organization 153 river 218 sea 34
SELECT t.* FROM xml1 x, XMLTABLE ( '$xml//country' PASSING x.xml AS "xml" COLUMNS cod varchar(3) PATH '@car_code', denumire varchar(50) PATH 'name', suprafata integer PATH '@area', populatia integer PATH 'population' ) t where c='4' order by 2;
SELECT t.* FROM xml1 x, XMLTABLE ( 'for $c in $xml//country for $x in $c//city where $x/@is_country_cap="yes" return <tara><nume>{$c/name}</nume><capitala populatia="{$x/population/text()}">{$x/name}</capitala></tara> ' PASSING x.xml AS "xml" COLUMNS denumire varchar(50) PATH 'nume', capitala varchar(50) PATH 'capitala', populatia_cap integer PATH 'capitala/@populatia' ) t where c='4' order by 1
SELECT t.* FROM xml1 x, XMLTABLE ( 'for $c in $xml//country let $x:=$c//city[@is_country_cap="yes"] return <tara><nume>{$c/name}</nume><capitala populatia="{$x/population/text()}">{$x/name}</capitala></tara> ' PASSING x.xml AS "xml" COLUMNS denumire varchar(50) PATH 'nume', capitala varchar(50) PATH 'capitala', populatia_cap integer PATH 'capitala/@populatia' ) t where c='4' order by 1
SELECT t.denumire,t.granita.getStringVal() FROM xml1 x, XMLTABLE ('$xml//country' PASSING x.xml AS "xml" COLUMNS denumire varchar(50) PATH 'name', granita XMLType PATH 'border' ) t where c='4' order by 1;
SELECT t.* FROM xml1 x, XMLTABLE ( 'for $t in $xml//country for $b in $t/border return <tara cod="{$t/@car_code}" vecin="{$b/@country}" lungime="{$b/@length}"/> ' PASSING x.xml AS "xml" COLUMNS tara varchar(3) PATH '@cod', vecin varchar(3) PATH '@vecin', lungime integer PATH '@lungime' ) t where c='4' order by 1,2;
SELECT t.oras,t.judet, decode(t.populatia,null,0,t.populatia) as populatia FROM xml1 x, XMLTABLE ( 'for $t in $xml//country for $p in $t/province for $c in $p/city where $t/@car_code="RO" return <oras><nume>{$c/name/text()}</nume> <populatia>{$c/population/text()}</populatia> <judet>{$p/name/text()}</judet></oras> ' PASSING x.xml AS "xml" COLUMNS oras varchar(50) PATH 'nume', populatia integer PATH 'populatia', judet varchar(50) PATH 'judet' ) t where c='4' order by 3 desc