首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

软件资讯设计 工具 系统 开发 安全 办公 陶吧 IT教育 Vista频道 | 下载中心酷我音乐盒 腾讯QQ
天极网 > 开发频道>DB2 基础: SQL/XML发布函数简介

DB2 基础: SQL/XML发布函数简介

2008-05-15 07:00作者:我心飞扬的zz博客出处:天极网责任编辑:McLaren

  现在我们可以使用 SQL/XML 发布函数从关系数据生成带标记的 XML 文档。IBM® DB2® Universal Database™ (DB2 UDB) 包含内置的 SQL/XML 发布函数,很容易将存储在 DB2 数据库中的数据发布为 XML 文档。本文介绍 SQL/XML 发布函数,并通过实际的例子说明如何使用这些函数。

  XML 表示 eXtensibleMarkupLanguage,是一种可扩展标记语言,发布、存储和共享结构化文档的通用数据格式。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 表格数据。反复调用该函数生成嵌套在表行()元素中的表格单元()元素。清单 1 还显示了该查询的输出结果。因为输出字符串很长,该例中每个字符串都占两行。表 1 显示了插入 XML 表格元素后的转换结果。

  清单 1. 使用 XMLELEMENT 函数从关系数据生成 XML 表格元素

  connect to sample...selectxmlserialize(

  contentxmlelement(

  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;

  000010CHRISTINEHAAS3978

  A00SPIFFY COMPUTER SERVICE

  000050JOHNGEYER6789

  E01SUPPORT SERVICES

  000110VINCENZOLUCCHESSI3490

  A00SPIFFY COMPUTER SERVICE

  000120SEANO'CONNELL2167

  A00SPIFFY COMPUTER SERVICE

  000200DAVIDBROWN4501

  D11MANUFACTURING SYSTEMS

  000220JENNIFERLUTZ0672

  D11MANUFACTURING SYSTEMS

  000230JAMESJEFFERSON2094

  D21ADMINISTRATION SYSTEMS

  000250DANIELSMITH0961

  D21ADMINISTRATION SYSTEMS

  000280ETHELSCHNEIDER8997

  E11OPERATIONS

  000310MAUDESETRIGHT3332

  E11OPERATIONS

  000320RAMLALMEHTA9990

  E21SOFTWARE SUPPORT

  000340JASONGOUNOT5698

  E21SOFTWARE SUPPORT

  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 函数一次,就能生成嵌套在表行()元素中的表格单元()元素。清单 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;

  000010CHRISTINEHAAS3978

  A00SPIFFY COMPUTER SERVICE DIV....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 表格数据。这里,生成的三个表格单元()元素得到了列对齐属性('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;

  000010CHRISTINEHAAS

  3978A00

  SPIFFY COMPUTER SERVICE ...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 表格数据。这里将生成的两个表格单元()元素连接在一起。清单 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;

  BRUCEADAMSON...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 表格数据。这里对每个表行()元素实例,聚合三个生成的表格单元()元素。清单 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;

  HAASLUCCHESSIO'CONNELL

  KWANNICHOLLSQUINTANA

  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 函数。这里,嵌套在表格单元()和表行()元素中的 “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;

  ADAMSON

  BROWN...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页。 1
进入 最权威的Windows 7论坛 查看网友讨论

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

软件下载

热门
推荐

网友关注

软件
资料
游戏

装机推荐

文章排行

本周
本月
最新更新
天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络