程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 基礎: SQL/XML 發布函數簡介

DB2 基礎: SQL/XML 發布函數簡介

編輯:DB2教程

XML 表示 eXtensible Markup Language,是一種可擴展標記語言,發布、存儲和共享結構化文檔的通用數據格式。XML 可用於在計算機間交換數據。標記後的文本可以按照 XML 節點類型分類,如 “document”、“element”、“attribute” 和 “text” 等。“Namespaces” 與節點名聯系在一起,如元素和屬性。

SQL/XML 是 SQL 語言標准(ANSI/ISO)的擴展,包含將關系數據轉化成 XML 的 XML 發布函數。IBM DB2 Universal Database for Linux®、UNIX® 和 Windows® (DB2 UDB) 包含內置的 SQL/XML 發布函數,很容易把 DB2 UDB 數據發布到 XML 文檔中。這些函數允許在大型字符對象(CLOB 類型,DB2 UDB 的一種內置數據類型)中創建帶標記的 XML 文檔。可以使用 SELECT 語句裝配需要的 XML 節點,然後通過把輸出定向到文件而捕捉帶標記的 XML 節點。也可使用 INSERT 語句將生成的文本插入表中。

SQL/XML 發布函數

DB2 UDB Version 8.2 支持七種 SQL/XML 發布函數:

XMLSERIALIZE

XMLELEMENT

XMLFOREST

XMLATTRIBUTES

XMLCONCAT

XMLAGG

XMLNAMESPACES

下面分別介紹這些發布函數。雖然用這些函數可以構造的 XML 元素和屬性類型基本上沒有限制,本文中的例子以 XML 表格元素和屬性為主。這些例子需要連接到 SAMPLE 數據庫,如果沒有在系統上創建 SAMPLE 數據庫,您可以在命令行提示符輸入 db2sampl 命令來創建它。

XMLSERIALIZE

XMLSERIALIZE 函數將 XML 值轉化成存儲為 CHAR、VARCHAR 或 CLOB 值的字符串。XMLSERIALIZE 是一個類型轉換函數,返回 CHAR、VARCHAR 或 CLOB 類型的值。參數必須是 XML 數據類型的表達式。注意,XML 數據類型是 XML 的內部表示,只能用作接收這種數據類型的函數(如 XMLSERIALIZE)的輸入。XML 是一種中間數據類型,不能存儲到數據庫中。

本文中所有的例子都使用 XMLSERIALIZE 函數。其他函數返回的 XML 值都傳遞給 XMLSERIALIZE 函數。

XMLELEMENT

XMLELEMENT 函數構造一個命名的 XML 元素節點。XMLELEMENT 是一個標量函數,返回類型為 XML 的值。參數包括一個元素名、可選的名稱空間聲明、可選的屬性,以及零個或多個組成元素內容的表達式。XMLELEMENT 函數可以嵌套。

清單 1 中的例子在嵌套上下文中使用 XMLELEMENT 函數從 SAMPLE 數據庫的 EMPLOYEE 和 DEPARTMENT 表中存儲的數據生成 XML 表格數據。反復調用該函數生成嵌套在表行(<tr>)元素中的表格單元(<td>)元素。清單 1 還顯示了該查詢的輸出結果。因為輸出字符串很長,該例中每個字符串都占兩行。表 1 顯示了插入 XML 表格元素後的轉換結果。

清單 1. 使用 XMLELEMENT 函數從關系數據生成 XML 表格元素

connect to sample 
... 
select XMLserialize( 
 content XMLelement( 
  name "tr", 
   XMLelement(name "td", e.empno), 
   XMLelement(name "td", e.firstnme), 
   XMLelement(name "td", e.lastname), 
   XMLelement(name "td", e.phoneno), 
   XMLelement(name "td", d.deptno), 
   XMLelement(name "td", substr(d.deptname, 1, 24)) 
 ) 
 as clob(120) 
) as "result" 
from employee e, department d 
where e.workdept = d.deptno and year(hiredate) < 1970; 
<tr><td>000010</td><td>CHRISTINE</td><td>HAAS</td><td>3978</td> 
 <td>A00</td><td>SPIFFY COMPUTER SERVICE </td></tr>    
<tr><td>000050</td><td>JOHN</td><td>GEYER</td><td>6789</td> 
 <td>E01</td><td>SUPPORT SERVICES    </td></tr>      
<tr><td>000110</td><td>VINCENZO</td><td>LUCCHESSI</td><td>3490</td> 
 <td>A00</td><td>SPIFFY COMPUTER SERVICE </td></tr>  
<tr><td>000120</td><td>SEAN</td><td>O'CONNELL</td><td>2167</td> 
 <td>A00</td><td>SPIFFY COMPUTER SERVICE </td></tr>    
<tr><td>000200</td><td>DAVID</td><td>BROWN</td><td>4501</td> 
 <td>D11</td><td>MANUFACTURING SYSTEMS  </td></tr>      
<tr><td>000220</td><td>JENNIFER</td><td>LUTZ</td><td>0672</td> 
 <td>D11</td><td>MANUFACTURING SYSTEMS  </td></tr>     
<tr><td>000230</td><td>JAMES</td><td>JEFFERSON</td><td>2094</td> 
 <td>D21</td><td>ADMINISTRATION SYSTEMS </td></tr>    
<tr><td>000250</td><td>DANIEL</td><td>SMITH</td><td>0961</td> 
 <td>D21</td><td>ADMINISTRATION SYSTEMS </td></tr>     
<tr><td>000280</td><td>ETHEL</td><td>SCHNEIDER</td><td>8997</td> 
 <td>E11</td><td>OperaTIONS       </td></tr>    
<tr><td>000310</td><td>MAUDE</td><td>SETRIGHT</td><td>3332</td> 
 <td>E11</td><td>OperaTIONS       </td></tr>    
<tr><td>000320</td><td>RAMLAL</td><td>MEHTA</td><td>9990</td> 
 <td>E21</td><td>SOFTWARE SUPPORT    </td></tr>     
<tr><td>000340</td><td>JASON</td><td>GOUNOT</td><td>5698</td> 
 <td>E21</td><td>SOFTWARE SUPPORT    </td></tr>     
connect reset


表 1. 對 XMLELEMENT 函數的輸出序列化後的結果,可用於 XML 文檔

EMPNO FIRST_NAME LAST_NAME PHONENO DEPTNO DEPARTMENT 000010 CHRISTINE HAAS 3978 A00 SPIFFY COMPUTER SERVICE 000050 JOHN GEYER 6789 E01 SUPPORT SERVICES 000110 VINCENZO LUCCHESSI 3490 A00 SPIFFY COMPUTER SERVICE 000120 SEAN O'CONNELL 2167 A00 SPIFFY COMPUTER SERVICE 000200 DAVID BROWN 4501 D11 MANUFACTURING SYSTEMS 000220 JENNIFER LUTZ 0672 D11 MANUFACTURING SYSTEMS 000230 JAMES JEFFERSON 2094 D21 ADMINISTRATION SYSTEMS 000250 DANIEL SMITH 0961 D21 ADMINISTRATION SYSTEMS 000280 ETHEL SCHNEIDER 8997 E11 OperaTIONS 000310 MAUDE SETRIGHT 3332 E11 OperaTIONS 000320 RAMLAL MEHTA 9990 E21 SOFTWARE SUPPORT 000340 JASON GOUNOT 5698 E21 SOFTWARE SUPPORT

XMLFOREST

XMLFOREST 函數構造一個 XML 元素節點序列(森林)。XMLFOREST 是一個標量函數,返回值和參數一樣都是內部 XML 數據類型。

清單 2 中的例子在 XMLELEMENT 函數中嵌套使用 XMLFOREST 函數生成 XML 表格數據。只需調用 XMLFOREST 函數一次,就能生成嵌套在表行(<tr>)元素中的表格單元(<td>)元素。清單 2 還顯示了該查詢返回的第一條記錄,同樣分在兩行中。表 2 顯示了插入 XML 表格元素後的轉換結果。

清單 2. 使用 XMLFOREST 函數從關系數據生成 XML 表格元素

connect to sample 
... 
select XMLserialize( 
 content XMLelement( 
  name "tr", 
   XMLforest( 
    e.empno as "td", 
    e.firstnme as "td", 
    e.lastname as "td", 
    e.phoneno as "td", 
    d.deptno as "td", 
    d.deptname as "td" 
   ) 
 ) 
 as clob(144) 
) as "result" 
from employee e, department d 
where e.workdept = d.deptno and year(hiredate) < 1970; 
<tr><td>000010</td><td>CHRISTINE</td><td>HAAS</td><td>3978</td> 
 <td>A00</td><td>SPIFFY COMPUTER SERVICE DIV.</td></tr>    
... 
connect reset


表 2. 對 XMLFOREST 函數的輸出序列化後可用於 XML 文檔

EMPNO FIRST_NAME LAST_NAME PHONENO DEPTNO DEPARTMENT 000010 CHRISTINE HAAS 3978 A00 SPIFFY COMPUTER SERVICE DIV. 000050 JOHN GEYER 6789 E01 SUPPORT SERVICES 000110 VINCENZO LUCCHESSI 3490 A00 SPIFFY COMPUTER SERVICE DIV. 000120 SEAN O'CONNELL 2167 A00 SPIFFY COMPUTER SERVICE DIV. 000200 DAVID BROWN 4501 D11 MANUFACTURING SYSTEMS 000220 JENNIFER LUTZ 0672 D11 MANUFACTURING SYSTEMS 000230 JAMES JEFFERSON 2094 D21 ADMINISTRATION SYSTEMS 000250 DANIEL SMITH 0961 D21 ADMINISTRATION SYSTEMS 000280 ETHEL SCHNEIDER 8997 E11 OperaTIONS 000310 MAUDE SETRIGHT 3332 E11 OperaTIONS 000320 RAMLAL MEHTA 9990 E21 SOFTWARE SUPPORT 000340 JASON GOUNOT 5698 E21 SOFTWARE SUPPORT

XMLATTRIBUTES

XMLATTRIBUTES 函數為 XML 元素節點構造一個或多個 XML 屬性節點。XMLATTRIBUTES 是一個標量函數,返回 XML 類型的值。

清單 3 中的例子結合使用 XMLATTRIBUTES 和 XMLELEMENT 函數生成 XML 表格數據。這裡,生成的三個表格單元(<td>)元素得到了列對齊屬性('align="center"')。清單 3 含顯示了該查詢返回的第一條記錄,同樣顯示在兩行中。表 3 顯示了轉換後的結果插入 XML 表格元素後的情況。

清單 3. 為 XML 元素節點構造 XML 屬性節點

connect to sample 
... 
select XMLserialize( 
 content XMLelement( 
  name "tr", 
   xmlelement(name "td", XMLattributes('center' as "align"), e.empno), 
   XMLelement(name "td", e.firstnme), 
   XMLelement(name "td", e.lastname), 
   xmlelement(name "td", XMLattributes('center' as "align"), e.phoneno), 
   xmlelement(name "td", XMLattributes('center' as "align"), d.deptno), 
   XMLelement(name "td", substr(d.deptname, 1, 24)) 
 ) 
 as clob(180) 
) as "result" 
from employee e, department d 
where e.workdept = d.deptno and year(hiredate) < 1970; 
<tr><td align="center">000010</td><td>CHRISTINE</td><td>HAAS</td> 
 <td align="center">3978</td><td align="center">A00</td> 
 <td>SPIFFY COMPUTER SERVICE </td></tr>            
... 
connect reset

該例中,XMLELEMENT 函數調用 XMLATTRIBUTES 函數為輸出的三列定義列對齊屬性。表 3 顯示了序列化的結果。

表 3. XMLELEMENT 函數結果序列化後的片段

EMPNO FIRST_NAME LAST_NAME PHONENO DEPTNO DEPARTMENT 000010 CHRISTINE HAAS 3978 A00 SPIFFY COMPUTER SERVICE 000050 JOHN GEYER 6789 E01 SUPPORT SERVICES 000110 VINCENZO LUCCHESSI 3490 A00 SPIFFY COMPUTER SERVICE 000120 SEAN O'CONNELL 2167 A00 SPIFFY COMPUTER SERVICE 000200 DAVID BROWN 4501 D11 MANUFACTURING SYSTEMS 000220 JENNIFER LUTZ 0672 D11 MANUFACTURING SYSTEMS

XMLCONCAT

XMLCONCAT 函數連接兩個或多個 XML 值(XML 數據類型的表達式)。XMLCONCAT 是一個標量函數,返回值和參數一樣都是內部 XML 數據類型。

清單 4 中的例子使用 XMLCONCAT 和 XMLELEMENT 函數生成 XML 表格數據。這裡將生成的兩個表格單元(<td>)元素連接在一起。清單 4 還顯示了該查詢返回的第一條記錄。表 4 顯示了插入 XML 表格元素後的轉換結果。

清單 4. XMLCONCAT 函數可用於連接 XML 值,比如兩個 XML 元素節點

connect to sample 
... 
select XMLserialize( 
 content XMLelement( 
  name "tr", XMLconcat( 
   XMLelement(name "td", firstnme), 
   XMLelement(name "td", lastname) 
  ) 
 ) 
 as clob(48) 
) as "result" 
from employee 
order by lastname; 
<tr><td>BRUCE</td><td>ADAMSON</td></tr>     
... 
connect reset

該例中,XMLELEMENT 函數調用 XMLCONCAT 連接一對嵌套的 XML 元素節點。表 4 顯示了序列化後的結果。

表 4. XMLELEMENT 函數結果序列化後的片段

FIRST_NAME LAST_NAME BRUCE ADAMSON DAVID BROWN JOHN GEYER JASON GOUNOT CHRISTINE HAAS EILEEN HENDERSON JAMES JEFFERSON SYBIL JOHNSON WILLIAM JONES SALLY KWAN WING LEE VINCENZO LUCCHESSI

XMLAGG

XMLAGG 函數在生成的 XML 值中將 XML 值聚合為一系列的項。XMLAGG 是一種聚合(列)函數。

清單 5 中的例子使用 XMLAGG 和 XMLELEMENT 函數生成 XML 表格數據。這裡對每個表行(<tr>)元素實例,聚合三個生成的表格單元(<td>)元素。清單 5 還顯示了該查詢的結果。表 5 顯示了插入 XML 表格元素後轉換的結果。

清單 5. XMLAGG 函數可用於聚合 XML 值,這裡是三個 XML 元素節點

connect to sample 
... 
select XMLserialize( 
 content XMLelement( 
  name "tr", XMLattributes(workdept as "id"), 
   XMLagg( 
    XMLelement(name "td", lastname) order by lastname 
   ) 
 ) 
 as clob(72) 
) as "result" 
from employee 
group by workdept having count(*) = 3; 
<tr id="A00"><td>HAAS</td><td>LUCCHESSI</td><td>O'CONNELL</td></tr>   
<tr id="C01"><td>KWAN</td><td>NICHOLLS</td><td>QUINTANA</td></tr>    
connect reset

該例中,XMLELEMENT 函數調用 XMLAGG 聚合嵌套的 XML 元素節點。表 5 顯示了序列化後的結果。

表 5. 序列化後的 XMLELEMENT 函數輸出

DEPTNO 1 2 3 A00 HAAS LUCCHESSI O'CONNELL C01 KWAN NICHOLLS QUINTANA

XMLNAMESPACES

XMLNAMESPACES 函數從參數中構造 XML 名稱空間聲明。聲明在 XMLELEMENT 和 XMLFOREST 函數生成的元素的作用范圍內。XMLNAMESPACES 是一個標量函數,返回 XML 類型的值。

XML 名稱空間可用於限定元素或屬性名,將其與特定的統一資源標識符(URI)聯系在一起。它是在 XML 文檔中用作元素類型和屬性名的名稱的集合。XML 名稱空間保證元素和屬性在給定文檔范圍之外有統一的名稱,用於避免應用程序在處理類似的標記和屬性時出現誤解。

清單 6 中的例子結合使用 XMLNAMESPACES 和 XMLELEMENT 函數。這裡,嵌套在表格單元(<td>)和表行(<tr>)元素中的 “emp” XML 元素節點,有一個設為空字符串的默認名稱空間,相當於沒有默認名稱空間。清單 6 還顯示了該查詢返回的前兩條記錄。表 6 顯示了插入 XML 表格元素後的轉換結果。

清單 6. XMLNAMESPACES 函數可用於構造 XML 名稱空間聲明

connect to sample 
... 
select XMLserialize( 
 content XMLelement( 
  name "tr", 
   XMLelement( 
    name "td", 
     XMLelement( 
      name "emp", 
       XMLnamespaces( 
        no default 
       ), lastname 
     ) 
   ) 
 ) 
 as clob(48) 
) as "result" 
from employee 
order by lastname; 
<tr><td><emp XMLns="">ADAMSON</emp></td></tr>  
<tr><td><emp XMLns="">BROWN</emp></td></tr>   
... 
connect reset

該例中,XMLELEMENT 函數調用 XMLNAMESPACES 構造了一個設為空字符串的默認名稱空間。表 6 顯示了序列化後的結果。

表 6. XMLELEMENT 函數結果序列化後的片段

EMP_NAME <emp XMLns="">ADAMSON</emp> <emp XMLns="">BROWN</emp>

結束語

DB2 UDB 內置 SQL/XML 發布函數可用於從關系數據生成帶標記的 XML 文檔。本文介紹了各種 SQL/XML 發布函數(類型轉換、標量和聚合函數),並提供了可運行的實際例子。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved