明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

使XML本地化與關(guān)系化

[摘要]Oracle XML DB提供本地化格式和關(guān)系數(shù)據(jù)庫訪問。   XML正快速地成為企業(yè)間數(shù)據(jù)交換的首選語言。然而,大多數(shù)企業(yè)把它們的數(shù)據(jù)存儲在如Oracle9i數(shù)據(jù)庫那樣的關(guān)系數(shù)據(jù)庫中。那么你怎樣將分層次的、以文檔為中心的XML和表格式的面向集合的關(guān)系數(shù)據(jù)庫連接起來?你是把XML文檔作為文件存儲在...
Oracle XML DB提供本地化格式和關(guān)系數(shù)據(jù)庫訪問。

  XML正快速地成為企業(yè)間數(shù)據(jù)交換的首選語言。然而,大多數(shù)企業(yè)把它們的數(shù)據(jù)存儲在如Oracle9i數(shù)據(jù)庫那樣的關(guān)系數(shù)據(jù)庫中。那么你怎樣將分層次的、以文檔為中心的XML和表格式的面向集合的關(guān)系數(shù)據(jù)庫連接起來?你是把XML文檔作為文件存儲在文件系統(tǒng)中?還是把XML文檔分開,把數(shù)據(jù)存儲在關(guān)系數(shù)據(jù)庫中?在兩種方法間進(jìn)行選擇時需要根據(jù)你使用數(shù)據(jù)的方式進(jìn)行權(quán)衡。但如果你不必進(jìn)行選擇呢?如果你可以同時使用兩種方法,你會如何做呢?你可以使用Oracle9i數(shù)據(jù)庫第2版中叫做XML DB知識庫(XML DB Repository)的新特性。

  XML DB知識庫說明   
Oracle XML DB既不是一個單獨(dú)的產(chǎn)品也不是一個你必須安裝的單獨(dú)選項(xiàng)。Oracle XML DB指的是在直接內(nèi)置于Oracle9i數(shù)據(jù)庫的XML特性和技術(shù)的集合。其中一個關(guān)鍵特性就是XML DB知識庫。這個知識庫使你能夠在Oracle9i數(shù)據(jù)庫第2版中直接存儲XML文檔。一旦你的XML文檔存儲在該知識庫中,你就能夠以XML為中心的方式或以關(guān)系為中心的方式訪問XML數(shù)據(jù)。

  要把XML數(shù)據(jù)存儲在你的數(shù)據(jù)庫中,你只需簡單地使用FTP、HTTP或WebDAV等所有行業(yè)標(biāo)準(zhǔn)的協(xié)議寫一個XML文檔文件即可。而從數(shù)據(jù)庫中獲取XML數(shù)據(jù)就像執(zhí)行一個SQL查詢或使用上述協(xié)議之一讀文件一樣簡單。

  場景設(shè)置
     
假設(shè)你正在銷售獨(dú)立藝術(shù)家制作的CD。你需要和主要的音樂商店、在線站點(diǎn)和藝術(shù)家自身交換信息。你已經(jīng)開發(fā)了用來描述CD內(nèi)容的如清單1所示的XML文檔格式,現(xiàn)在想利用XML DB 知識庫把信息存儲在數(shù)據(jù)庫中。你想通過SQL輕松地訪問數(shù)據(jù)并輕松地訪問本地XML文檔。簡而言之,你希望數(shù)據(jù)既具有關(guān)系特性又具有層次特性。在這篇文章中,我是你的DBA,實(shí)現(xiàn)它是我的工作。

  注冊XML模式
       我的第一步是使用XML DB知識庫注冊你的XML模式。當(dāng)我注冊一個XML模式時,該知識庫創(chuàng)建能夠保存那個模式實(shí)例的對象類型和對象表。下面對通過SQL*Plus執(zhí)行的dbms_xmlschema.registerURI的調(diào)用從http://gennick.com/cd.xsd獲取如清單2中所示的XML模式,然后注冊它:

BEGIN
dbms_xmlschema.registerURI(
'cd.xsd',
'http://gennick.com/cd.xsd');
END;
/

注意:我除了需要對各種模式對象類型的CREATE權(quán)限外,為了注冊模式和創(chuàng)建這篇文章中的例子我還需要ALTER SESSION和QUERY REWRITE權(quán)限。

  清單3顯示了由于注冊CD模式而創(chuàng)建的一些結(jié)構(gòu)和對象。一個名字是CD331_TAB的XML表被創(chuàng)建來保存模式的實(shí)例:在知識庫中的每個CD文檔將由這個表中的一行來表示。我可以通過查詢USER_XML_TABLES數(shù)據(jù)字典視圖得到XML表的一個列表。在這個例子中,我簡單地在模式注冊前后查詢視圖然后查找新的表名。CD331_TAB中的每一行將包含一個CD327_T類型的實(shí)例,這個類型對應(yīng)于我們的XML模式來創(chuàng)建的。XML文檔的第一層元素被表示為CD327_T類型的屬性,屬性名和XML字段名相匹配。例如,該對象類型中的Title字段直接對應(yīng)于XML模式中的Title元素。Songs字段對應(yīng)于Songs元素。Songs是XML模式中的一個復(fù)雜元素,同樣地它被映射到另一個對象類型"Songs328_T"。如果我使用SQL*Plus命令DESCRIBE "Songs328_T",并繼續(xù)研究Songs字段的定義,我會看到歌曲集合最終被作為一個VARRAY實(shí)現(xiàn),在VARRAY中,每個元素都表示一首歌曲。

  當(dāng)我注冊一個模式時,我可以控制Oracle9i數(shù)據(jù)庫生成的對象和類型名;我也可以控制被用來存儲我的XML數(shù)據(jù)的特定數(shù)據(jù)類型?梢酝ㄟ^使用XML DB知識庫定義的屬性和oraxdb名字空間的部分注釋XML模式來進(jìn)行這些控制。當(dāng)我不提供那些屬性時,Oracle9i數(shù)據(jù)庫為我生成它們,我可以通過查看存儲在該知識庫中的模式版本來簡單地瀏覽Oracle9i數(shù)據(jù)庫所生成的內(nèi)容。圖1說明了你如何能夠方便地訪問知識庫數(shù)據(jù),這次是通過HTTP,使用一個標(biāo)準(zhǔn)的Web瀏覽器來訪問的。圖1顯示了我的知識庫中的CD模式的一部分,你可以看到模式注釋,它們?nèi)家?oraxdb"開始。注意,URL使用8080端口,它是知識庫使用的默認(rèn)HTTP端口。

  默認(rèn)情況下,注冊模式時創(chuàng)建的全部對象將屬于注冊模式的用戶所有。在這個例子中,我擁有清單3中的表和類型以及其他與該CD模式相關(guān)的所有對象。因?yàn)槭俏易粤四莻模式,所以任何我保存到知識庫中的XML文件(是該CD模式的實(shí)例)將被拆開然后存儲在CD331_TAB表中。該模式和注冊是特定于我的。其他用戶保存的CD文件將不會被存儲在我的表中。你可以對dbms_xmlschema.register模式使用一個可選參數(shù),來創(chuàng)建一個影響所有用戶的全局模式,以便所有用戶都可以把CD文檔保存到該表中。

  創(chuàng)建XML文件夾

  如果要把CD XML文檔存儲在XML DB知識庫中,我就需要一個存放它們的文件夾。要創(chuàng)建一個文件夾,我作為SYSTEM用戶登錄到Oracle并執(zhí)行清單4中的PL/SQL塊。調(diào)用dbms_xdb.createfolder創(chuàng)建名為/CD的第一層文件夾。PL/SQL塊然后使用dbms_xdb.setAcl過程創(chuàng)建把所有文件夾權(quán)限賦予擁有者(也就是SYSTEM用戶)、把讀權(quán)限賦予其他所有用戶的訪問控制列表(ACL)。下一步為了把文件夾的擁有者由SYSTEM改變?yōu)镚ENNICK,需要對資料庫的RESOURCE_VIEW調(diào)用UPDATE語句。在文件夾創(chuàng)建后,提交是重要的;直到你提交后,該文件夾才對其他會話可見,F(xiàn)在我可以作為GENNICK使用FTP或WebDAV連接并把XML文件保存到/CD文件夾中。

  保存XML文檔

  一旦我注冊了模式然后創(chuàng)建一個文件夾來保存我的XML文檔,把文檔保存到知識庫就像拷貝文件那樣簡單。清單5顯示了一個拷貝(清單1中所示的)LegendsOfTheGreatLakes.xml文件到知識庫的FTP會話。FTP open命令使用的端口2100是知識庫為FTP會話使用的默認(rèn)端口。注意,我可以不使用FTP,而是像以前那樣在WebDAV和Windows Web文件夾簡單地使用Windows拷貝和粘貼操作。


[page_break]

使用RESOURCE_VIEW

  你應(yīng)該知道的一個重要視圖是名為RESOURCE_VIEW的視圖。RESOURCE_VIEW視圖為你所訪問的知識庫中的每個文檔和文件夾返回一行。例如,通過執(zhí)行下面的查詢你可以得到/CD文件夾下所有XML文檔的一個列表。

SELECT any_path
FROM resource_view
WHERE under_path(res,'/CD')=1
AND extractValue(res,
'/Resource/ContentType')='text/xml';

ANY_PATH
-------------------------------
/CD/Gospel/NothingLess.xml
/CD/LegendsOfTheGreatLakes.xml
 

  上面顯示的新的UNDER_PATH函數(shù)使你能夠測試一個給定的知識庫資源是否在你指定的文件夾(或路徑)中。在這個例子中,我使用該函數(shù)把查詢結(jié)果限定在/CD文件夾及其子文件夾的資源中。通過使用對基本表所創(chuàng)建的一個層次式域索引可以使對RESOURCE_VIEW視圖進(jìn)行的基于路徑的查詢更高效。這個索引是該知識庫的一部分;你不用創(chuàng)建它。

使XML本地化和關(guān)系化
圖1:XML DB知識庫中示例CD模式的一部分

   資源視圖中的RES字段并不代表資源自身,而只是代表資源的元數(shù)據(jù)。對RES字段運(yùn)用新的extractValue函數(shù)檢查每個資源的內(nèi)容類型。因此查詢的結(jié)果被進(jìn)一步地限制到指向XML文檔的路徑。'/Resource/ContentType'語法代表XPath表示法。XPath是指定XML文檔各部分的標(biāo)準(zhǔn)表示法;你將在許多對XML數(shù)據(jù)的查詢中使用它。

  給定一個資料庫路徑,你可以使用新的XDBUriType對象類型檢索全部或部分基本XML文檔。清單6顯示兩個查詢。第一個查詢是對以上代碼的擴(kuò)展,使用XDBUriType來檢索/CD文件夾下的所有XML文檔。為了只提取CD標(biāo)題,清單6中的第二個查詢進(jìn)行了進(jìn)一步的改進(jìn),把標(biāo)準(zhǔn)的XPath語法附加到URL的末端。

對知識庫數(shù)據(jù)的關(guān)系訪問
       也可以通過直接訪問基本表來訪問知識庫中的XML數(shù)據(jù)。我注冊CD模式時創(chuàng)建的基本表是CD331_TAB。你可以直接對這個表編寫查詢語句,但這些查詢必須是支持XML的。要簡化通過設(shè)計用于關(guān)系數(shù)據(jù)的報表工具訪問XML數(shù)據(jù),你可以創(chuàng)建一個如清單7中所示的視圖。除了視圖,清單7還對藝術(shù)家名字創(chuàng)建了一個索引。視圖和索引使我能夠有效地執(zhí)行諸如下面的標(biāo)準(zhǔn)關(guān)系查詢:

  SELECT title
  FROM cd_master
  WHERE artist='Carl Behrend';

  更新XML數(shù)據(jù)

  不幸的是,因?yàn)樵赾d_master視圖中的所有字段都是基于SQL函數(shù)的,所以該視圖不能被更新。然而,可以更新知識庫中的XML數(shù)據(jù);我只需要如下所示更新注冊模式時所創(chuàng)建的基本表:

UPDATE CD331_TAB cd
SET VALUE(cd) = updateXML(
value(cd),
'/CD/Website/text()',
'http://greatlakeslegends.com/
legends.htm');

  注意這個新的updateXML函數(shù)中的XPath語法的使用。路徑'/CD/Website/text()'說明我要更新CD文檔的Website元素的文本。updateXML的第三個參數(shù)為那個文本指定新值。這是一個恰當(dāng)?shù)母,并非常高效。XML DB知識庫并不需要重建被改變的整個XML文檔。因?yàn)槟J奖蛔粤,所以XML DB知識庫能夠以在底層對象結(jié)構(gòu)只有Website屬性被觸及的方式重寫這個查詢。

  結(jié)論

  通過使用XML DB知識庫,你可以把XML文檔存儲在數(shù)據(jù)庫中,并使用標(biāo)準(zhǔn)的互聯(lián)網(wǎng)協(xié)議訪問那些文檔。同時,你還可以使用標(biāo)準(zhǔn)的關(guān)系查詢訪問相同的XML文檔或是那些文檔的部分。你沒有XML數(shù)據(jù)和關(guān)系數(shù)據(jù),只有數(shù)據(jù)。"XML"和"關(guān)系"只是查看數(shù)據(jù)的不同范例。通過把數(shù)據(jù)從范例中分離出來,Oracle9i保護(hù)你最重要的資產(chǎn)之一--數(shù)據(jù)--免受范例改變的影響。