Ver Mensaje Individual
  #3 (permalink)  
Antiguo 13/10/2008, 09:43
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: XML DB Oracle, Sql Server, MySQL

Motor: MySQL
Versión Mínima: MySQL 5.1.5
Fuente: http://dev.mysql.com/doc/refman/5.1/...functions.html http://dev.mysql.com/tech-resources/...ql5.1-6.0.html

1. Fichero XML

Código:
D:\xml>dir
 Volume in drive D has no label.
 Volume Serial Number is CE41-1E7C

 Directory of D:\xml

13/10/2008  12:07    <DIR>          .
13/10/2008  12:07    <DIR>          ..
13/10/2008  12:11               445 data.xml
               1 File(s)            445 bytes
               2 Dir(s)   5.093.183.488 bytes free
2. Tabla XML. En el caso de MySQL, no existen (por ahora) los tipos de datos XML, por lo tanto, hay que utilizar BLOBs, cosa que no me gusta mucho, dado que las APIs que existen actualmente para el acceso a este tipo de datos son un poco limitadas.

Código:
mysql> create table t1 (id int, xml_data blob);
Query OK, 0 rows affected (0.00 sec)
3. Carga del fichero XML via SQL.

Código:
mysql> insert into t1 values (1,LOAD_FILE('d:\\xml\\data.xml'));
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;

| id   | xml_data

|    1 | <?xml version='1.0' encoding='UTF-8' ?>
<root>

  <entity>
    <id>1</id>
    <f_name>nombre_1</f_name>
    <l_name>apellido_1</l_name>
    <dni>dni_1</dni>
  </entity>

  <entity>
    <id>2</id>
    <f_name>nombre_2</f_name>
    <l_name>apellido_2</l_name>
    <dni>dni_2</dni>
  </entity>

  <entity>
    <id>3</id>
    <f_name>nombre_3</f_name>
    <l_name>apellido_3</l_name>
    <dni>dni_3</dni>
  </entity>

</root>

1 row in set (0.00 sec)
4. Ejemplos de XQuery y XPath

Código:
mysql> select ExtractValue(xml_data,'root//entity[1]//l_name') from t1;
+--------------------------------------------------+
| ExtractValue(xml_data,'root//entity[1]//l_name') |
+--------------------------------------------------+
| apellido_1                                       |
+--------------------------------------------------+
1 row in set (0.00 sec)


mysql> select id from t1
    -> where ExtractValue(xml_data,'root//entity[1]//l_name') = 'apellido_1';
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
5. No implementado en forma nativa
6. Actualizar datos

Código:
mysql> update t1 set xml_data =
    -> UpdateXML(xml_data,'root//entity[1]//l_name','<l_name>apellido_11</l_name>') ;

Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;

| id   | xml_data
|    1 | <?xml version='1.0' encoding='UTF-8' ?>
<root>

  <entity>
    <id>1</id>
    <f_name>nombre_1</f_name>
    <l_name>apellido_11</l_name>
    <dni>dni_1</dni>
  </entity>

  <entity>
    <id>2</id>
    <f_name>nombre_2</f_name>
    <l_name>apellido_2</l_name>
    <dni>dni_2</dni>
  </entity>

  <entity>
    <id>3</id>
    <f_name>nombre_3</f_name>
    <l_name>apellido_3</l_name>
    <dni>dni_3</dni>
  </entity>

</root>

1 row in set (0.00 sec)
7. Transformar una tabla a XML

Código:
mysql> create table t2
    -> (id int,
    -> f_name varchar(30),
    -> l_name varchar(30),
    -> dni varchar(30)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t2 values (1,'nombre_1','apellido_1','dni_1');
Query OK, 1 row affected (0.69 sec)

mysql> insert into t2 values (2,'nombre_2','apellido_2','dni_2');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t2 values (3,'nombre_3','apellido_3','dni_3');
Query OK, 1 row affected (0.00 sec)
7.1 Lamentablemente, en forma nativa, la única manera documentada es con el parámetro --xml del binario mysql, lo que facilita el volcado del resulset a un fichero XML, pero lo complica para enviarlo a un Recordset de cualquier lenguaje de programación. Existen UDFs de terceros que se pueden utilizar, lib_mysqludf_xql.

Código:
mysql -u root --xml=TRUE -e "SELECT * FROM xml.t1 ORDER BY id" -p xml
No publico el output, por problemas de caracteres con la consola de MS-DOS.

Última edición por matanga; 13/10/2008 a las 09:55