在MySQL中使用XML数据—数据格式化
在MySQL中运用XML数据—数据格式化 数据复原软件 :// xunlongsoft 在ExtractValue()函数输出中添加我们自己的标题 在上一篇文章中,我们运用LOAD_FILE()函数导入了一个XML文档,然后运用ExtractValue()函数提取了某些字段。 CREATE TEMPORARY TABLE client_citizenship ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, xml_data TEXT NOT NULL ); SET @xml = LOAD_FILE(“c:\\client_citizenships.xml“); INSERT INTO client_citizenship VALUES (NULL, @xml); SELECT xml_data FROM client_citizenship LIMIT 1 INTO @xml; SELECT ExtractValue(@xml, //row[2]/field[1]/@name ), ExtractValue(@xml, //row[2]/field[1] ); 最终一个SELECT语句提取的是其次个节点中的第一个。 . (row[2]) 2(field[1]) 1944-01-15 . 其结果集如下: +----------------------------------------------+----------------------------------------+ |ExtractValue(@xml, “//row[2]/field[1]/@name“) |ExtractValue(@xml, //row[2]/field[1] ) | +----------------------------------------------+----------------------------------------+ |client_id |2 | +----------------------------------------------+----------------------------------------+ 留意MySQL运用的是表达式作为列的标题,为了运用列字段名格式化结果集的标题,我们须要运用Prepared Statement,Prepared Statement是一种特别类型的SQL语句,它是预编译的,这意味着Prepared Statement执行时,数据库不用再编译SQL了,这样可以有效削减执行时间。在这个例子中,运用Prepared Statement的好处是可以设置标题,然后连接到我们的查询字符串中。 SET @header = SELECT ExtractValue(@xml, “//row[2]/field[1]/@name“); SET @qry = CONCAT(“SELECT ExtractValue(@xml, \“//row[2]/field[1]\“) AS “, @header, “;“); PREPARE stmt FROM @qry; CUTE stmt; DEALLOCATE PREPARE stmt; 现在我们看到的数据格式就是和我们平常看到的一样了。 +-----------+ | client_id | +-----------+ | 2 | +-----------+ 在存储过程中运用ExtractValue()函数 上面运用的方法最大的缺陷就是在代码中写死了要检索的行,这样很不敏捷,下面我们运用一个存储过程来解决这个问题。 MySqlDump 有Igor Romanenko编写的MySqlDump客户端最初是一个备份程序,它可以备份数据库,或将一个数据库转移到另一个数据库(MySQL或其它数据库),它的这个备份过程其实是一个创建表,填充表的过程。此外,MySqlDump还可以生成CSV,XML或其它由分隔符限制的文本文件。 虽然不止一种执行MySqlDump的方法,但我想运用下面的语法: mysqldump --xml databasename [tables] 你也可以运用标准的Unix/Dos方法输出到一个文件,如下面的吩咐将一个表转成一个XML文件: C:\>mysqldump --xml temp_table_article client > c:\\sqldump.xml 打开sqldump.xml看看,我们发觉MySqlDump客户端包括了比--xml选项更多的信息,但它却是按每一行、字段名和值的方式输出的,MySqlDump将表结构和表数据单独输出。 Collation=“A“ Cardinality=“4“ Null=““ Index_type=“BTREE“ Comment=““ /> Collation=“A“ Cardinality=“4“ Null=““ Index_type=“BTREE“ Comment=““ /> Data_length=“16384“ Max_data_length=“0“ Index_length=“16384“ Data_free=“10485760“ Auto_increment=“5“ Create_time=“2009-10-05 17:51:34“ Collation=“latin1_swedish_ci“ Create_options=““ Comment=““ /> 1 1976-02-12 M 1 2 1944-01-15 F 0 3 1956-06-04 M 1 4 1938-11-19 F 0 我们运用这个工具创建XML数据结构的缘由是已经有存储过程可以将MySqlDump XML数据插入到表中,MySQL开发人员Alexander Barkov编写了这样一个存储过程xmldump_load,这个存储过程可以从mysqldump --xml吩咐输出的XML文档中提取数据,并将提取到的数据插入到MySQL表的列中,下面是这个存储过程的全部代码。 DELIMITER | DROP PROCEDURE IF EXISTS xmldump_load | CREATE PROCEDURE xmldump_load( file_name VARCHAR(128), database_name VARCHAR(128), table_name VARCHAR(128)) BEGIN DECLARE xml TEXT; DECLARE nrows INT; DECLARE rownum INT DEFAULT 1;