Cargando

Ir a contenido


 


PostgreSQL - XML

En este tutorial veremos el soporte que nos brinda PostgreSQL a este tipo de dato y las formas en las que podemos trabajar con el.


Escrito por el oct 18 2013 03:57 postgresql postgresql xml xml


PostgreSQL tiene soporte para un tipo de datos XML, a pesar que esto nos puede resultar muy útil muchas veces existen críticas debido a que esto puede derivar a romper muchas de las normas de las bases de datos relacionales como por ejemplo la normalización, aunque esto no ha impedido que todos los manejadores y motores de Bases de Datos de gama alta brinden soporte para este tipo de datos.

 

Cargando datos en XML

 

Antes de ver el funcionamiento desde un punto de vista teórico veamos un ejemplo de como podemos cargar un campo con este tipo de datos.

 


INSERT INTO web_sessions(session_id, session_state)

VALUES ('robe', '<session><screen_properties><prop><name>color</name><val>red</val></prop><prop><name>background</name><val>snoopy</val></prop></screen_properties></session>'::xml);

Como vemos el segundo campo al que le hacemos el insert es el campo XML el cual lo denotamos colocándole ::xml al final de la información que queremos insertar.

 

Haciendo consultas sobre el XML

 

Para hacer consultas sobre el XML podemos utilizar la función xpath() ya que es bastante útil para este propósito, el primer argumento que recibe es un query del tipo XPath y el segundo es un string que contiene el XML, la respuesta es un array de objetos XML que cumplen con las condiciones de la consulta XPath. Veamos un ejemplo de como realizar esto combinándolo con la función unnest() de forma de mostrar los resultados como si fuesen filas de una tabla.

 

 

Desglosemos los puntos enumerados:

 

1. Hacemos un subscripting del array, ya que XPath siempre devuelve un array aunque sea un solo elemento lo que venga en la respuesta a la consulta.

2. Obtenemos el elemento text tanto en nombre como en valor de cada elemento prop.

3. Hacemos el recorrido dentro de las etiquetas <prop>, <name>, </name>, <val>, </val>, </prop> del XML.

 

Como podemos ver es bastante sencillo hacer las consultas para obtener los valores de los campos con tipo de datos XML.

 

Tipos de datos compuestos y personalizados

 

El tipo de objeto compuesto composite es un tipo especial en PostgreSQL porque a menudo es utilizado para construir un objeto y entonces es asociado a un tipo personalizado o como el retorno de una función que necesita retornar múltiples columnas.

 

PostgreSQL crea automáticamente un tipo personalizado para todas las tablas, para cualquier propósito podemos utilizar tipos personalizados como los definidos por defecto dentro de PostgreSQL, inclusive podemos hacer un array de dichos tipos.

 

Veamos un pequeño código al respecto:

 

CREATE TABLE user_facts(user_id varchar(30) PRIMARY KEY, facts census.facts[]);
Luego creamos un registro:

 

ROW(86,'25001010206', 2012, 123, NULL)::census.facts
Y finalmente lo insertamos en nuestra tabla personalizada:

 


INSERT INTO user_facts(user_id, facts)

VALUES('robe', ARRAY[ROW(86, '25001010206', 2012, 123, NULL)::census.facts]);

Inclusive podemos incorporar mas datos a nuestro tipo de la siguiente forma utilizando la concatenación:

 


UPDATE user_facts

SET facts = facts || array(SELECT F FROM census.facts AS F WHERE fact_type_id = 86)

WHERE user_id = 'robe';

Luego al hacer la consulta vemos como todo cobra sentido como en la siguiente imagen:

 

 

Con esto finalizamos este tutorial sobre los tipos de datos XML y los tipos de datos personalizados, como siempre no está de más recomendar practicar los temas aquí vistos para de esta forma para mantener estos conocimientos lo más frescos posibles para su aplicación.


Tutoriales Relacionados


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!
10
VOTA
5
100%
4
0%
3
0%
2
0%
1
0%

  Información

  •   Publicado oct 18 2013 03:57
  •   Actualizado nov 27 2016 19:16
  •   Visitas 2.1K
  •   Nivel
    Profesional