理解DB2 9中新的查詢:XQuery
IBM 新的 DB2 9 為開發(fā)人員提供了一種更快、更有效的方式來管理關(guān)系數(shù)據(jù)庫中的 XML 文檔。然而,為了挖掘出更多的潛能,數(shù)據(jù)庫開發(fā)人員還需要在他們的武器庫中增加一種新的語法:XQuery。雖然 XQuery 學(xué)起來很簡單,但是它非常完善,足以構(gòu)造更高級的耗時(shí)且費(fèi)力的查詢。
進(jìn)入 DB2 9 Developer Workbench。新的 Workbench 被打包成一個(gè)單獨(dú)的安裝程序,它取代了其前輩 DB2 Development Center。它基于 Eclipse 引擎,在 Visual XQuery Builder 中提供了新的高級 XML 功能,包括基于已有的 XML 字段或單獨(dú)的 XML 模式文檔可視化地設(shè)計(jì) XQuery 的能力。Developer Workbench 還可以與 DB2 for z/OS 數(shù)據(jù)服務(wù)器一起使用。
Visual XQuery Builder
您可以在 SAMPLE 數(shù)據(jù)庫上運(yùn)行一些簡單的查詢,試一試 XQuery Builder。隨 DB2 9 一起發(fā)布的 SAMPLE 數(shù)據(jù)庫中有一些具有 XML 字段的表,這些表都填充了示例數(shù)據(jù)。例如 CUSTOMER 表,這個(gè)表有 XML 類型的 INFO 和 HISTORY 字段。還可以用命令 db2sampl -xml 創(chuàng)建自己的示例數(shù)據(jù)庫。
要試一下 XQuery Builder,可以打開 DB2 Workbench,并開始一個(gè)新項(xiàng)目:選擇 File → New → Data Development Project,或者單擊 New Project 圖標(biāo),然后選擇 Data Development Project。
接著,將該項(xiàng)目命名為 XQueryProject,并保留其他默認(rèn)設(shè)置。如果已經(jīng)連接到 SAMPLE 數(shù)據(jù)庫,那么在 Use an Existing Connection 下選擇它。如果還沒有連接到 SAMPLE 數(shù)據(jù)庫,那么采取以下步驟:
選擇 Create a New Connection。 在 Connection Parameters 下, 選擇 DB2 UDB v9.1。 指定 SAMPLE 作為數(shù)據(jù)庫名,保留其他默認(rèn)設(shè)置。 輸入登錄名和密碼(如果不特別指定的話,就是系統(tǒng)登錄名/密碼),然后單擊 Test Connection。 如果一切正常,則單擊 Next 繼續(xù)。在 New Project 向?qū)У淖詈笠徊糠郑A?Routine Parameters 的默認(rèn)設(shè)置,并單擊 Finish。
Workbench 創(chuàng)建好新項(xiàng)目之后,應(yīng)該可以在左上區(qū)的 Data Project Explorer 中看到這個(gè)項(xiàng)目。在 Database Explorer 中,在新建的項(xiàng)目下面可以看到 SAMPLE 數(shù)據(jù)庫。如果還沒有連接到該數(shù)據(jù)庫,那么單擊右鍵,選擇 Connect 或 Reconnect,并輸入憑證。
展開這兩個(gè)窗口中的條目。注意,在 Data Project Explorer 中的新項(xiàng)目下,有下面一些空的文件夾:
XML Queries SQL Scripts Stored Procedures XML Schema Documents User-Defined Functions。Developer Workbench 的部分威力依賴于它所提供的一組向?qū)В渲写蠖鄶?shù)向?qū)Э梢栽谶@些文件夾上通過上下文菜單打開。在這里可以添加 XSD 文件到項(xiàng)目中,以便于 XML 操縱。還可以構(gòu)建新的存儲過程、腳本,甚至包括自己的函數(shù)。但是在這里我們將把注意力放在第一個(gè)文件夾上:XML Queries。
創(chuàng)建一個(gè) XML 查詢
您可以通過打開 New XML Query 向?qū)韯?chuàng)建第一個(gè) XML 查詢。首先,在 Data Project Explorer 面板中的 XML Queries 文件夾上單擊右鍵,然后選擇 New XML Query。 將這個(gè) XML 查詢命名為 SimpleXQuery。
當(dāng)看到 Add representative XML documents 選項(xiàng)時(shí),單擊 Add。這里有兩個(gè)選項(xiàng),一是讓 Workbench 根據(jù)示例數(shù)據(jù)發(fā)現(xiàn)并創(chuàng)建一個(gè) XML 模式,另外一種選項(xiàng)是使用一個(gè)已有的模式:
Local workspace:如果已經(jīng)為要使用的數(shù)據(jù)集生成了一個(gè)模式,或者已經(jīng)將一個(gè)已有的 XSD 或 DTD 文檔保存到工作區(qū),那么選擇該選項(xiàng)并找到該模式。 Database: 如果要根據(jù)已有的 XML 數(shù)據(jù)創(chuàng)建一個(gè)新模式,那么選擇 Database 選項(xiàng)。對于這個(gè)例子,選擇 Database。 對于 XML 列或模式,導(dǎo)航到 CUSTOMER.INFO(如果不確定如何找到它,可以在線參考圖 A)。
在該向?qū)Ы酉聛淼钠聊恢校梢詫⑽臋n與特定的 XML 文檔關(guān)聯(lián)起來,您將在該 XML 文檔上構(gòu)建查詢。在 SAMPLE 數(shù)據(jù)庫中,每一行可以包含一個(gè)具有不同模式的 XML 文檔。在這里,可以在行之間導(dǎo)航,以選擇要使用的模式。對于這個(gè)例子,選擇 Document 2 (見圖 1)。
圖 1. XML 文檔行
在該向?qū)У淖詈笠粋€(gè)屏幕中,該向?qū)б竽鷮⑽臋n與 XML 列相關(guān)聯(lián)。如果您一直使用一個(gè)已有的 XML 模式,那么需要在這里關(guān)聯(lián)它。但是這個(gè)例子是基于已有數(shù)據(jù)的模式的,因此默認(rèn)情況下模式文檔已經(jīng)是關(guān)聯(lián)的。
現(xiàn)在您已經(jīng)創(chuàng)建了一個(gè)新的 XQuery View,并將其命名為 SimpleXQuery.xqm。我們花一點(diǎn)時(shí)間來探索一下這個(gè)視圖。您將看到,示例數(shù)據(jù)使用指定列的第一行的 XML 模式列出。您還將看到大量的語法,這些語法可以直接被拖放到設(shè)計(jì)工作區(qū),包括 Constructors、Expressions、Functions 和 Variables,它們都是基于目前萬維網(wǎng)聯(lián)盟(W3C)正在評審的 XQuery 規(guī)范的。
構(gòu)建一個(gè)可視化 XQuery
有了新的 XQuery 網(wǎng)格,您將創(chuàng)建一個(gè)簡單的包含一些條件的查詢。
展開 Constructors 類別,將一個(gè)新的 Element 拖放到網(wǎng)格上。對于拖放到網(wǎng)格上的每個(gè)項(xiàng)目,都可以在它右邊看到一個(gè) Step Into 圖標(biāo)。單擊 new_element 的這個(gè)圖標(biāo)。
將該元素的 Name 改為 toronto(見圖 2)。不用關(guān)心 Attributes。 拖放 Element Value 下的 name 節(jié)點(diǎn)。注意,name 節(jié)點(diǎn)現(xiàn)在也有一個(gè) Step Into 圖標(biāo)。單擊該圖標(biāo)。
圖 2. XML 元素
在 Visual Builder 中,每當(dāng)單擊 Step Into,就會打開相應(yīng)項(xiàng)目所特有的一個(gè)子頁面。對于 XML 節(jié)點(diǎn),它打開 For、Let、Where、Order by、Return diagram 或 FLWOR。這個(gè)圖基本上相當(dāng)于 SQL 中的 SELECT-FROM-WHERE 子句,它允許您定義查詢的選擇標(biāo)準(zhǔn)。
Workbench 自動為 FLWOR 語句所需的綁定變量賦值,不過可以改變它的值。在這個(gè)例子中,它被命名為 name0。默認(rèn)情況下,這個(gè)例子中的 Sequence 和 Return 值都是 name 節(jié)點(diǎn)。您只需定義條件。為此,展開左側(cè)的 Functions 類別,從下拉菜單中選擇 String Functions,如果該項(xiàng)還沒有被選中的話。您有很多內(nèi)建的函數(shù)可以選擇,因此在 WHERE 子句時(shí)有很多選擇余地。這個(gè)例子的目標(biāo)是選擇來自 Toronto 的所有客戶。最直接的方法是將 city 節(jié)點(diǎn)拖放到 Operand 1 下,選擇 = 作為 Operator,鍵入 Toronto 作為 Operand 2。還可以使用 match() 函數(shù)來定義一個(gè)模式,或者混合任意數(shù)量的字符串函數(shù)來創(chuàng)建更明確的標(biāo)準(zhǔn)。為簡單起見,拖出 contains() 函數(shù)并將它放在 Operand 1 下(見圖 3)。
圖 3. 包含 contains() 函數(shù)的 FLWOR
由于 contains() 函數(shù)返回 True 或 False,因此不需要再指定一個(gè)操作數(shù)。單擊該函數(shù)對應(yīng)的 Step Into,定義該函數(shù)的參數(shù)。contains() 函數(shù)帶兩個(gè)參數(shù):string 和 substring。將 city 節(jié)點(diǎn)拖到 string 參數(shù)上。在 substring 旁邊輸入 onto。這將選出包含字母 onto(全部為小寫)的所有城市。這個(gè)步驟類似于 SQL 中的 LIKE '%onto%'。
圖 4. 定義 contains() 函數(shù)
在該窗口的右上角,可以看到一個(gè) Step Out 圖標(biāo)。單擊該圖標(biāo),或者從下拉菜單中選擇 OK,進(jìn)入到上一級。在 For Logic 定義中,增加一個(gè)字段。將 phone 元素拖放到 Return 網(wǎng)格上的 name 下。然后再次單擊 Step Out。
再次單擊 Step Out,返回到 root 級節(jié)點(diǎn)。在這里可以繼續(xù)添加節(jié)點(diǎn)。現(xiàn)在,運(yùn)行一下查詢,看看結(jié)果。在右上角的圖標(biāo)上單擊右鍵,從下拉菜單中選擇 Run...,或者從主菜單中選擇 Run → Run...。
這里還有一次機(jī)會將 XML 列與一個(gè)定義文檔相關(guān)聯(lián),但是由于它已經(jīng)被正確地關(guān)聯(lián)了,因此只需單擊 Finish。在 Data Output 視圖中,應(yīng)該可以看到 ...。 單擊省略號查看整個(gè)結(jié)果集。
您可以查看兩種格式的結(jié)果:XML Tree (見圖 5) 或 Source,后者是一種無格式文本轉(zhuǎn)儲。在這個(gè)簡單的例子中,所有結(jié)果都被收集在一個(gè)根節(jié)點(diǎn)下,包括任何重復(fù)的客戶。但是,通過較小的調(diào)整,就可以改變節(jié)點(diǎn)層次,增加附加字段,刪除重復(fù)的行,或者增加聚合函數(shù)。
圖 5. 示例 XQuery 的結(jié)果
還可以對一個(gè)外部文件執(zhí)行 Save As... 命令。實(shí)際上,如果單擊 Save As 并保存到 demo.xml,可以在 Web 瀏覽器中打開這個(gè)文件,并看到包含查詢結(jié)果的一個(gè)基本的(但是不完全是格式良好的)XML 文檔。
最后一個(gè)特性
現(xiàn)在輪到了我認(rèn)為是 Visual Builder 最好的一個(gè)特性。回到網(wǎng)格上,選擇左上角的 Source 標(biāo)簽頁。您將看到自動生成的描述查詢的 XQuery 代碼。該代碼的主體可以直接在數(shù)據(jù)庫查詢或存儲過程中使用,這對于動態(tài)構(gòu)建 XML 查詢是一種快速有效的方法。我們的例子生成了如清單 1 所示的源代碼。
邊練邊學(xué)
這個(gè)例子只是開始探索 Visual XQuery Builder 的潛能。除了幫助您創(chuàng)建復(fù)雜的嵌入式 XML 查詢外,它還可以生成源代碼,通過查看源代碼,或者在其他地方使用該源代碼,有助于學(xué)習(xí) XQuery 的語法。
