Este es el Post #17 del Topic: Guía Práctica de PostgreSQL
SUGERENCIA:
Si has utilizado la base de datos dbadmision en ejercicios previos es mejor volver a crearla.Descargar Script: DBAdmision.sql
En este post me dedicaré a ejemplificar el uso del tipo de dato XML, el uso de las funciones XML y la exportación de consultas hacia XML con PostgreSQL.
La tecnología XML nos ha facilitado constantemente en lograr compatibilidad entre diversos formatos y permitir compartirlos entre distintas aplicaciones y sin duda en bases de datos su funcionalidad debería ser también muy aprovechada.
El esquema que habrá que respetar en el entorno de bases de datos, y en el caso específico de postgres es el siguiente:
<catalogname> <schemaname> <tablename> <row> <colname1>value</colname1> <colname2 xsi:nil='true'/> ... </row> ... </tablename> ... </schemaname> ... </catalogname>
No voy a entrar al detalle de lo que es XML, tampoco de todas las funciones habidas y por haber sobre el, sin embargo desarrollaremos una parte importante que nos sacará de apuros en algún momento o situación. Algunas de las funciones brindades por postgres sobre XML que usaremos en este post son:
- XMLCOMMENT
- XMLCONCAT
- XMLELEMENT
- XMLFOREST
- XMLAGG
- QUERY_TO_XML
- TABLE_TO_XML
Para comprender la funcionalidad de cada uno de ellos creo que más vale una ejecución que mil palabras, ¿hace falta recordar que base de datos usaremos para este ejemplo?.
1- Comprobando algunas funciones XML:
SELECT xmlelement(name Contacto, IDContacto) FROM Persona.Contacto;
SELECT xmlelement(name Paterno, Paterno),xmlelement(name Materno, Materno) FROM Persona.Contacto;
SELECT xmlforest(Paterno, Materno) FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlforest(Paterno, Materno)) FROM Persona.Contacto;
SELECT XMLAgg(XMLForest(Paterno, Materno)) FROM Persona.Contacto;
SELECT XMLElement(name Contacto, XMLAgg(XMLForest(Paterno, Materno))) FROM Persona.Contacto;
2- Creamos una secuencia para usarlo como numeración de la estructura resultante:
--DROP SEQUENCE seq_contacto; CREATE TEMP SEQUENCE seq_contacto; SELECT xmlelement(name Contacto ,xmlattributes(nextval('seq_contacto') AS "row") ,xmlforest(Paterno, Materno) ) FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlforest(Paterno, Materno, Nombres) ) FROM Persona.Contacto;
SELECT xmlelement(name Persona ,xmlelement(name Contacto ,xmlattributes(IDContacto) ,Paterno ,Materno ,Nombres) ) FROM Persona.Contacto;
3- Usando xmlcomment para comentar sobre XML
SELECT xmlelement(name Persona ,xmlcomment('Comentario') ,xmlforest(Paterno, Materno,Nombres)) FROM Persona.Contacto;
SELECT xmlelement(name Paterno, Materno) ,xmlelement(name Materno, Materno) FROM Persona.Contacto;
SELECT xmlconcat(xmlelement(name Paterno, Materno) ,xmlelement(name Nombres, Nombres)) FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlconcat( xmlelement(name Paterno, Paterno) ,xmlelement(name Materbo, Materno))) FROM Persona.Contacto;
4- Creamos una tabla que contenga un campo de tipo XML, veremos luego una manera especial de manipularlas.
--DROP TABLE Persona.ContactoXML; CREATE TABLE Persona.ContactoXML (col1 XML); INSERT INTO Persona.ContactoXML(SELECT xmlelement(name Contacto ,xmlconcat( xmlelement(name Paterno, Paterno) ,xmlelement(name Materno, Materno) ) ) FROM Persona.Contacto);
SELECT col1 FROM Persona.ContactoXML;
5- XPATH nos facilitará en la seleccion de campos dentro de una estructura de datos XML:
SELECT xpath('/contacto/materno/text()', col1) FROM Persona.ContactoXML ;
SELECT xpath('/contacto/paterno/text()', col1) FROM Persona.ContactoXML ;
SELECT columna[1] FROM ( SELECT xpath('/contacto/materno/text()', col1) AS columna FROM Persona.ContactoXML ) AS xmlsource;
6- Mucho ojito a estas dos últimas funciones, su poder radica en que puede generar una completa estructura XML a nivel de consulta o de una tabla completa:
SELECT query_to_xml('SELECT Nombres,Paterno,Materno FROM Persona.Contacto' ,FALSE,FALSE,'Contactos')
SELECT table_to_xml('Persona.Contacto',FALSE,FALSE,'Contactos')
Recursos Utilizados para el desarrollo de este post:
SQLXML-For-Postgres-Developers
XML Document Support
XML and Databases
XML Type
Thanks for sharing. I read many of your blog posts, cool, your blog is very good.