新聞中心
前沿:在MySQL中使用XML數(shù)據(jù)可以更好的管理數(shù)據(jù),將所有數(shù)據(jù)進行了格式化,這個過程是怎么樣的呢?

10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有蒲江縣免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
在存儲過程中使用ExtractValue()函數(shù)
上面使用的方法***的缺陷就是在代碼中寫死了要檢索的行,這樣很不靈活,下面我們使用一個存儲過程來解決這個問題。
MySqlDump
有Igor Romanenko編寫的MySqlDump客戶端最初是一個備份程序,它可以備份數(shù)據(jù)庫,或?qū)⒁粋€數(shù)據(jù)庫轉(zhuǎn)移到另一個數(shù)據(jù)庫(MySQL或其它數(shù)據(jù)庫),它的這個備份過程其實是一個創(chuàng)建表,填充表的過程。此外,MySqlDump還可以生成CSV,XML或其它由分隔符控制的文本文件。
雖然不止一種執(zhí)行MySqlDump的方法,但我想使用下面的語法:
- mysqldump --xmldatabasename[tables]
你也可以使用標準的Unix/Dos方法輸出到一個文件,如下面的命令將一個表轉(zhuǎn)成一個XML文件:
- C:\>mysqldump --xml temp_table_article client > c:\\sqldump.xml
打開sqldump.xml看看,我們發(fā)現(xiàn)MySqlDump客戶端包括了比--xml選項更多的信息,但它卻是按每一行、字段名和值的方式輸出的,MySqlDump將表結(jié)構(gòu)和表數(shù)據(jù)單獨輸出。
- name="client">
- client_id Type=int(10)unsignedNull=NO"Key=PRI" Extra=auto_increment/>
- Field="date_of_birth" Type="date" Null="YES" Key="" Extra="" />
- 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
我們使用這個工具創(chuàng)建XML數(shù)據(jù)結(jié)構(gòu)的原因是已經(jīng)有存儲過程可以將MySqlDump XML數(shù)據(jù)插入到表中,MySQL開發(fā)人員Alexander Barkov編寫了這樣一個存儲過程xmldump_load,這個存儲過程可以從mysqldump --xml命令輸出的XML文檔中提取數(shù)據(jù),并將提取到的數(shù)據(jù)插入到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;
- DECLARE ncols INT;
- DECLARE colnum INT DEFAULT 1;
- DECLARE ins_list TEXT DEFAULT '';
- DECLARE val_list TEXT DEFAULT '';
- DECLARE tmp VARCHAR(255);
- # 將XML文件的內(nèi)容載入到字符串中
- SET xml = LOAD_FILE(file_name);
- # 獲得這個表中
的數(shù)量
- SET nrows = ExtractValue(xml,
- 'count(/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row)');
- # 獲得這個表中
的數(shù)量 - SET ncols = ExtractValue(xml,
- 'count(/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row[1]/field)');
- # 對于每一個
|
- WHILE rownum <= nrows DO
- # 對于每一個
(列) - WHILE colnum <= ncols DO
- SET tmp = ExtractValue(xml,
- '/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row[$rownum]/field[$colnum]/@name');
- SET ins_list = CONCAT(ins_list, tmp, IF(colnum
- SET tmp = ExtractValue(xml,
- '/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row[$rownum]/field[$colnum]');
- SET val_list = CONCAT(val_list, '''', tmp ,'''', IF(colnum
- SET colnum = colnum + 1;
- END WHILE;
- SET @ins_text = CONCAT('INSERT INTO t1 (', ins_list, ') VALUES (', val_list, ')');
- SET ins_list = '';
- SET val_list = '';
- PREPARE stmt FROM @ins_text;
- EXECUTE stmt;
- SET rownum = rownum + 1;
- SET colnum = 1;
- END WHILE;
- END |
- DELIMITER ;
仔細閱讀代碼你就會發(fā)現(xiàn)其實這個存儲過程使用了我們前面使用到的工具,如LOAD_FILE()和ExtractValue()函數(shù),它只不過增加了兩個嵌套的While循環(huán),遍歷每一行和列。
下面說說導(dǎo)入sqldump.xml文件的步驟。首先須創(chuàng)建xmldump_load存儲過程。
- C:\> mysql db_name < text_file
- C:\> mysql temp_table_article < c:\xmldump_load.sql
你也可以使用source或\.命令從MySQL客戶端載入存儲過程。
- mysql> source c:xmldump_load.sql;
- OR
- mysql> \. c:xmldump_load.sql;
這個存儲過程接受下面三個輸入?yún)?shù):
- XML輸入文件名
- 目標數(shù)據(jù)庫名
- 要創(chuàng)建的表名
我們還是以前面創(chuàng)建的sqldump.xml文件,數(shù)據(jù)庫和表名為例。
- mysql> call xmldump_load('c:\sqldump.xml ', 'client_info', 'client');
這條命令將向client_info數(shù)據(jù)庫client表中插入sqldump.xml文件中的內(nèi)容。
即將推出的新特性
MySQL 6.0可以接受新的SQL語句,6.0.3版本將提供LOAD XML功能,直接導(dǎo)入XML文件,再也不用啥存儲過程了,在寫本文的時候還是5.4 Beta版本,因此還需耐心等候一段時間。
上文詳細介紹了在MySQL中使用XML數(shù)據(jù)—數(shù)據(jù)格式化,這個看上去全是代碼,可能理解起來并不是那么容易,所以就需要大家深入其中,認真去理解,希望對大家有用處。
本文標題:在MySQL中使用XML數(shù)據(jù)—數(shù)據(jù)格式化
文章位置:http://www.5511xx.com/article/cddgjce.html


咨詢
建站咨詢
