Omet navegació

3.7 - Ampliació

Amb les nocions anteriors tenim el suficient per a treballar prou còmodament documents XML en PostgreSQL.

Es pot aprofundir molt més per a arribar a resultats més que acceptables. Tanmateix s'escapa de l'objectiu del present curs. 

Únicament a mode d'indicador de la possible potència es mostra algun exemple.

En el següent exemple, i per mig d'una única sentència, s'aconsegueix crear un document XML amb les comarques i dins de cada comarca tots els seus pobles. Evidentment, la sentència ha de quedar un poc complicada. Aprofitarem per a inserir en la nostra taula de documents: P_XML

 
INSERT INTO P_XML VALUES ( 8 , 
(SELECT xmlelement(name comarques, 
(SELECT xmlagg(xmlelement(name comarca,xmlforest(nom_c,provincia),
xmlelement(name pobles, (SELECT xmlagg(xmlelement(name poble,xmlforest(nom,altura)))
FROM POBLACIONS
WHERE nom_c = COMARQUES.nom_c ) ) ) )
 FROM COMARQUES))));
 

 Evidentment és complicada, però en una única sentència tenim la creació del document XML, a partir de les taules COMARQUES i POBLACIONS. El resultat serà aquest:

<comarques>
<comarca>
<nom>Safor</nom>
<provincia>València</provincia>
<pobles>
<poble>
<nom>Alfauir</nom>
<altura>75</altura>
</poble>
<poble>
<nom>Almiserà</nom>
<altura>75</altura>
</poble>
<poble>
<nom>Beniflà</nom>
<altura>50</altura>
</poble>
...
</pobles>
</comarca>
...
</comarques>

Des de pgAdmin no el veurem tabulat així. Per poder veure el resultat, podem "exportar" l'execució d'una sentència SQL que traga només aquest document, de manera que l'execució vaja cap a un fitxer.

Es deixa com a exercici totalment voluntari l'ampliació de la sentència anterior per a que incorpore també tots els instituts de cada poble.

Amb aquest document que és un poc més complicat, ja que incorpora les comarques i dins d'elles els pobles, podríem fer una consulta XPATH que ens diga les comarques que tenen més de 30 pobles:

SELECT xpath('//comarca[count(pobles/poble)>=30]/nom_c/text()',(SELECT doc FROM P_XML WHERE num=8));