您的位置:首页 > 其它

DB2 9 哄骗启迪(733 测验)认证指南,第 3 部门: XML 数据把持(7)

2011-03-06 23:50 525 查看
经由进程哄骗轨范存储和检索 XML









SQL/XML 函数

标量函数 XMLQUERY() 和 XMLEXISTS()

XMLQUERY()
前去经由进程较劲争论一个 XQuery 表达式掉掉的一个 XML 值,梗概哄骗指定的输出参数作为 XQuery 变量。

这确实很简朴。那么,它的幻想意义是什么呢?
XMLQUERY()
有两部门:

一个 XQuery 表达式
一个
PASSING
子句,在该子句中可以将数据传递给 XQuery 表达式

该函数的一个罕有的用处是提取一个 XML 文档的一部门。一个表中的一个 XML 列(假设不为 null 的话)搜罗一个无缺的 XML 文档。在一个
SELECT
列表中,假设选择 XML 列的列名,则掉掉整个 XML 文档。假设只想要整个文档的一部门,则可以哄骗
XMLQUERY()
。搪塞 XQuery 表达式,可以哄骗一个简朴的 XPath 表达式,例如
'$d/path1/path2/path3'
,约莫哄骗一个无缺的 FLWOR 表达式。
$d
援用
PASSING
子句中的一个变量。 该子句批准将数据(列、表达式、文字)传递到 XQuery 表达式中。为了提取一个 XML 文档的一部门,将 XML 列名搜罗在
PASSING
子句中,并给定一个称号,例如
"d"
。然后,XQuery 表达式就用
$d
援用那个列。

XMLEXISTS()
SELECT
语句的
WHERE
子句中哄骗的一个谓词。它的语法近似于
XMLQUERY()
:它有一个 XQuery 表达式和一个
PASSING
子句。 和
XMLQUERY()
一样,XQuery 参数可以是一个简朴的 XPath,约莫是一个无缺的 FLWOR 表达式。假设 XQuery 表达式前去至多一个项,则
XMLEXISTS()
前去
TRUE


XMLEXISTS()
凡是用于测试一个 XML 文档(在 XML 列中)能否搜罗某些幽默的器械。偶然辰是一个特定的 XML 节点,一个属性,一个 XML 节点的特定的值,约莫一个属性的特定的值。 可以测试多个条件。更无效的做法是用 XPath
and
or
将多个 XML 条件组合到一个
XMLEXISTS()
中,而不是屡次调用
XMLEXISTS()
并哄骗 SQL
AND
OR


很多 XML 查询可以用 XQuery 或
XMLQUERY()
来处置。两者之间有些不合:

XQuery 在后果序列中分行前去每个项。而
XMLQUERY()
是一个标量函数,而且是
SELECT
语句的一部门;它在每次被调用时只前去一个值(也等于说,搪塞传递给它的每个 XML 文档前去一个值)。假设一个 XML 文档中有多个项,那么
XMLQUERY()
必须可以或许在一行中前去这些项。因此,它前去一个序列,个中搜罗那个文档中的完备绝对项。

在 XQuery 中不克不及绑定参数约莫哄骗主变量。 然则可以在
XMLQUERY()
XMLEXISTS()
中用
PASSING
子句绑定参数或哄骗主变量。

在 XQuery 中,XPath 表达式(例如 /path1/path2)在一步内同时实哄骗用谓词(
[]
标记)和投影(组织输出的元素列表)的脚色。在
SELECT
语句中,将谓词哄骗到的脚色由
XMLEXISTS()
负担负责;将谓词哄骗到一行中的节点以及投影的脚色则由
XMLQUERY()
负担负责。凡是,在一个 SQL/XML 查询中,相反的 XPath 谓词要指定两次,一次在
XMLEXISTS()
中,一次在
XMLQUERY()
中。

为了将谓词哄骗到关系列,XQuery 哄骗 XPath 函数
db2-fn:sqlquery()
。一个老例的含
XMLQUERY()
SELECT
哄骗老例的
WHERE
子句,该子句将关系谓词与
XMLEXISTS()
同化在一同。

只要
XMLQUERY()
可以在同一个
SELECT
列表中同化哄骗关系列和 XML 数据。

请参阅文章 "Query DB2 XML data with SQL"(developerWorks,2006 年 3 月),个中供应了
XMLQUERY()
XMLEXISTS()
的具体的例子。









回页首

标量函数 XMLELEMENT()、XMLATTRIBUTES()和 XMLNAMESPACES()

XMLELEMENT()
经由进程在某样器械 附近加上一个 XML 标记(例如
<xxx>
</xxx>
),成立一个 XML 元素。某样器械 可以是任何 SQL 表达式(只需不是组织化标准典范),搜罗别的 XML 元素。 可选地,也可以搜罗称号空间和属性。必要时,例如被搜罗在
CHAR()
函数中,SQL 表达式将被自动转换成字符形式。

XMLATTRIBUTES()
在一个 XML 元素中成立一个或多个属性 (例如
<xxx a1="zzz">
)。该函数只能在
XMLELEMENT()
函数中哄骗。

XMLNAMESPACES()
为一个 XML 元素成立称号空间。该函数只能在
XMLELEMENT()
XMLFOREST()
XMLTABLE()
之类的别的函数中哄骗。

例子 1: XMLELEMENT(),简朴

清单 4. 例子 1 的 SQL 代码

SELECT XMLELEMENT( NAME "ColName", colname),
XMLELEMENT( NAME "Type", typename)
FROM
syscat.columns
WHERE
tabschema = 'SYSCAT'
AND    tabname   = 'TABLES'
ORDER BY
colno
;


清单 5. 例子 1 示例输出

<ColName>TABSCHEMA
</ColName>        <Type>
VARCHAR</Type>
<ColName>TABNAME
</ColName>          <Type>
VARCHAR</Type>
<ColName>OWNER
</ColName>            <Type>
VARCHAR</Type>
<ColName>TYPE
</ColName>             <Type>
CHARACTER</Type>
<ColName>STATUS
</ColName>           <Type>
CHARACTER</Type>
<ColName>BASE_TABSCHEMA
</ColName>   <Type>
VARCHAR</Type>
<ColName>BASE_TABNAME
</ColName>     <Type>
VARCHAR</Type>
<ColName>ROWTYPESCHEMA
</ColName>    <Type>
VARCHAR</Type>
<ColName>ROWTYPENAME
</ColName>      <Type>
VARCHAR</Type>
<ColName>CREATE_TIME
</ColName>      <Type>
TIMESTAMP</Type>
<ColName>INVALIDATE_TIME
</ColName>  <Type>
TIMESTAMP</Type>
<ColName>STATS_TIME
</ColName>       <Type>
TIMESTAMP</Type>
<ColName>COLCOUNT
</ColName>         <Type>
SMALLINT</Type>
<ColName>表ID
</ColName>          <Type>
SMALLINT</Type>
<ColName>TBSPACEID
</ColName>        <Type>
SMALLINT</Type>


例子 2: XMLELEMENT(),两个属性

清单 6. 例子 2 的 SQL 代码

SELECT XMLELEMENT
(
NAME "TableName",
XMLATTRIBUTES
(
tableid  AS "TableId",
colcount AS "NumCols"
),
RTRIM(tabschema) || '.' || tabname
)
FROM
syscat.tables
WHERE
type = 'T'
ORDER BY
tableid
;


清单 7. 例子 2 示例输出

<TableName 表Id="2" NumCols="67">SYSIBM.SYSTABLES</TableName>
<TableName 表Id="2" NumCols="44">DB2QP.TRACK_QUERY_INFO</TableName>
<TableName 表Id="2" NumCols="3">TOOLS.REL_CAT_MEMBER</TableName>
<TableName 表Id="3" NumCols="41">SYSIBM.SYSCOLUMNS</TableName>
<TableName 表Id="3" NumCols="13">DB2QP.MANAGE_QUERY_INFO</TableName>
<TableName 表Id="3" NumCols="9">TOOLS.REL_TYPE</TableName>
<TableName 表Id="4" NumCols="57">SYSIBM.SYSINDEXES</TableName>
<TableName 表Id="4" NumCols="6">DB2QP.RESULT_INFO</TableName>
<TableName 表Id="4" NumCols="5">SYSTOOLS.POLICY</TableName>
<TableName 表Id="4" NumCols="8">TOOLS.REL_CAT</TableName>
<TableName 表Id="5" NumCols="9">SYSIBM.SYSCOLPROPERTIES</TableName>
<TableName 表Id="5" NumCols="23">DB2QP.QP_SYSTEM</TableName>
<TableName 表Id="5" NumCols="27">SYSTOOLS.HMON_ATM_INFO</TableName>
<TableName 表Id="5" NumCols="5">TOOLS.REL_LINK</TableName>
<TableName 表Id="6" NumCols="5">SYSIBM.SYSINDEXCOLUSE</TableName>


例子 3: XMLELEMENT(),哄骗默许称号空间

清单 8. 例子 3 SQL 代码

SELECT  XMLELEMENT
(
NAME "ColName",
XMLNAMESPACES
(
DEFAULT 'www.ibm.com'
),
colname
)
FROM
syscat.columns
WHERE
tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
colno
;


清单 9. 例子 3 示例输出

<ColName xmlns="www.ibm.com">TABSCHEMA</ColName>
<ColName xmlns="www.ibm.com">TABNAME</ColName>
<ColName xmlns="www.ibm.com">OWNER</ColName>
<ColName xmlns="www.ibm.com">TYPE</ColName>
<ColName xmlns="www.ibm.com">STATUS</ColName>
<ColName xmlns="www.ibm.com">BASE_TABSCHEMA</ColName>
<ColName xmlns="www.ibm.com">BASE_TABNAME</ColName>
<ColName xmlns="www.ibm.com">ROWTYPESCHEMA</ColName>
<ColName xmlns="www.ibm.com">ROWTYPENAME</ColName>
<ColName xmlns="www.ibm.com">CREATE_TIME</ColName>
<ColName xmlns="www.ibm.com">INVALIDATE_TIME</ColName>
<ColName xmlns="www.ibm.com">STATS_TIME</ColName>
<ColName xmlns="www.ibm.com">COLCOUNT</ColName>
<ColName xmlns="www.ibm.com">TABLEID</ColName>
<ColName xmlns="www.ibm.com">TBSPACEID</ColName>


例子 4: XMLELEMENT(),含称号空间

清单 10. 例子 4 SQL 代码

SELECT  XMLELEMENT
(
NAME "db2:ColName",
XMLNAMESPACES
(
'www.ibm.com/db2' AS "db2"
),
colname
)
FROM
syscat.columns
WHERE
tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
colno
FETCH FIRST 15 ROWS ONLY
;


清单 11. 例子 4 示例输出

<db2:ColName xmlns:db2="www.ibm.com/db2">TABSCHEMA</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TABNAME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">OWNER</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TYPE</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">STATUS</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">BASE_TABSCHEMA</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">BASE_TABNAME</db2:ColName>
<db2
:ColName
xmlns:db2="www.ibm.com/db2">ROWTYPESCHEMA</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">ROWTYPENAME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">CREATE_TIME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">INVALIDATE_TIME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">STATS_TIME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">COLCOUNT</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TABLEID</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TBSPACEID</db2:ColName>


例子 5: XMLELEMENT() 用于 NULL 的选项

清单 12. 例子 5 SQL 代码

SELECT  XMLELEMENT(NAME "Table", tabname),
XMLELEMENT(NAME "TbSpc1",
tbspace
OPTION EMPTY ON NULL
),
XMLELEMENT(NAME "TbSpc2",
tbspace
OPTION NULL ON NULL
)
FROM
syscat.tables
WHERE
tbspace IS NULL
FETCH FIRST 15 ROWS ONLY
;


清单 13. 例子 5 示例输出

<Table>CHECK_CONSTRAINTS</Table>        <TbSpc1/>
    -
<Table>COLUMNS</Table>                  <TbSpc1/>
    -
<Table>COLUMNS_S</Table>                <TbSpc1/>
    -
<Table>REFERENTIAL_CONSTRAINTS</Table>  <TbSpc1/>
    -
<Table>REF_CONSTRAINTS</Table>          <TbSpc1/>
    -
<Table>TABLE_CONSTRAINTS</Table>        <TbSpc1/>
    -
<Table>TABLES</Table>                   <TbSpc1/>
    -
<Table>TABLES_S</Table>                 <TbSpc1/>
    -
<Table>USER_DEFINED_TYPES</Table>       <TbSpc1/>
    -
<Table>UDT_S</Table>                    <TbSpc1/>
    -
<Table>VIEWS</Table>                    <TbSpc1/>
    -
<Table>PARAMETERS</Table>               <TbSpc1/>
    -
<Table>PARAMETERS_S</Table>             <TbSpc1/>
    -
<Table>ROUTINES</Table>                 <TbSpc1/>
    -
<Table>ROUTINES_S</Table>               <TbSpc1/>
    -










回页首

标量函数 XMLFOREST()

XMLFOREST()
函数成立由一个或多个连在一同的 XML 元素构成的序列。
XMLELEMENT()
XMLFOREST()
之间的不合点是:

XMLELEMENT()
只成立一个元素。而
XMLFOREST()
可以成立任意个毗邻在一同的元素。
搪塞
XMLELEMENT()
,XML 元素的称号是必须的,然则在
XMLFOREST()
中,搪塞简朴的 SQL 表达式可以哄骗默许值。稍后的例子会演示这一点。
XMLELEMENT()
可以成立属性;
XMLFOREST()
则不可。

XMLFOREST()
像是
XMLCONCAT()
XMLELEMENT()
的组合(用心不合的是
XMLFOREST()
不克不及指定属性)。该函数非常便于用来指定一系列的 XML 元素。

例子 6: XMLFOREST()(无称号空间)

在这个例子中,留意
colno
typename
都为一个 XML 元素指定了称号,而
colname
则没有。假设草率元素称号,则哄骗的称号与列名相反,不过是全数大写的。

清单 14. 例子 6 的 SQL 代码

SELECT  XMLFOREST(
colno    AS "ColNum",
colname,
typename AS "DataType"
)
FROM
syscat.columns
WHERE
tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
colno
FETCH FIRST 15 ROWS ONLY
;


清单 15. 例子 6 示例输出

<ColNum>0</ColNum><COLNAME>TABSCHEMA</COLNAME><DataType>VARCHAR</DataType>
<ColNum>1</ColNum><COLNAME>TABNAME</COLNAME><DataType>VARCHAR</DataType>
<ColNum>2</ColNum><COLNAME>OWNER</COLNAME><DataType>VARCHAR</DataType>
<ColNum>3</ColNum><COLNAME>TYPE</COLNAME><DataType>CHARACTER</DataType>
<ColNum>4</ColNum><COLNAME>STATUS</COLNAME><DataType>CHARACTER</DataType>
<ColNum>5</ColNum><COLNAME>BASE_TABSCHEMA</COLNAME><DataType>VARCHAR</DataType>
<ColNum>6</ColNum><COLNAME>BASE_TABNAME</COLNAME><DataType>VARCHAR</DataType>
<ColNum>7</ColNum><COLNAME>ROWTYPESCHEMA</COLNAME><DataType>VARCHAR</DataType>
<ColNum>8</ColNum><COLNAME>ROWTYPENAME</COLNAME><DataType>VARCHAR</DataType>
<ColNum>9</ColNum><COLNAME>CREATE_TIME</COLNAME><DataType>TIMESTAMP</DataType>
<ColNum>10</ColNum><COLNAME>INVALIDATE_TIME</COLNAME><DataType>TIMESTAMP</DataType>
<ColNum>11</ColNum><COLNAME>STATS_TIME</COLNAME><DataType>TIMESTAMP</DataType>
<ColNum>12</ColNum><COLNAME>COLCOUNT</COLNAME><DataType>SMALLINT</DataType>
<ColNum>13</ColNum><COLNAME>TABLEID</COLNAME><DataType>SMALLINT</DataType>
<ColNum>14</ColNum><COLNAME>TBSPACEID</COLNAME><DataType>SMALLINT</DataType>


例子 7: XMLFOREST() (有默许称号空间)

清单 16. 例子 7 的 SQL 代码

SELECT  XMLFOREST(
XMLNAMESPACES(
DEFAULT 'www.ibm.com'
),
colno    AS "ColNum",
colname
)
FROM
syscat.columns
WHERE
tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
colno
FETCH FIRST 15 ROWS ONLY
;


清单 17. 例子 7 示例输出

例子 8: XMLFOREST(),带 EMPTY ON NULL 选项

清单 18. 例子 8 的 SQL 代码

SELECT  XMLFOREST(
tabname AS "Table",
tbspace AS "TbSpc"
OPTION EMPTY ON NULL
)
FROM
syscat.tables
WHERE
tbspace IS NULL
FETCH FIRST 15 ROWS ONLY
;


清单 19. 例子 8 示例输出

<Table>CHECK_CONSTRAINTS</Table><TbSpc/>
<Table>COLUMNS</Table><TbSpc/>
<Table>COLUMNS_S</Table><TbSpc/>
<Table>REFERENTIAL_CONSTRAINTS</Table><TbSpc/>
<Table>REF_CONSTRAINTS</Table><TbSpc/>
<Table>TABLE_CONSTRAINTS</Table><TbSpc/>
<Table>TABLES</Table><TbSpc/>
<Table>TABLES_S</Table><TbSpc/>
<Table>USER_DEFINED_TYPES</Table><TbSpc/>
<Table>UDT_S</Table><TbSpc/>
<Table>VIEWS</Table><TbSpc/>
<Table>PARAMETERS</Table><TbSpc/>
<Table>PARAMETERS_S</Table><TbSpc/>
<Table>ROUTINES</Table><TbSpc/>
<Table>ROUTINES_S</Table><TbSpc/>


例子 9: XMLFOREST(),带 NULL ON NULL 选项

清单 20. 例子 9 SQL 代码

SELECT  XMLFOREST(
tabname AS "Table",
tbspace AS "TbSpc"
OPTION NULL ON NULL
)
FROM
syscat.tables
WHERE
tbspace IS NULL
FETCH FIRST 15 ROWS ONLY
;


清单 21. 例子 9 示例输出

<Table>CHECK_CONSTRAINTS</Table>
<Table>COLUMNS</Table>
<Table>COLUMNS_S</Table>
<Table>REFERENTIAL_CONSTRAINTS</Table>
<Table>REF_CONSTRAINTS</Table>
<Table>TABLE_CONSTRAINTS</Table>
<Table>TABLES</Table>
<Table>TABLES_S</Table>
<Table>USER_DEFINED_TYPES</Table>
<Table>UDT_S</Table>
<Table>VIEWS</Table>
<Table>PARAMETERS</Table>
<Table>PARAMETERS_S</Table>
<Table>ROUTINES</Table>
<Table>ROUTINES_S</Table>










回页首

标量函数 XMLCONCAT()

XMLCONCAT()
将两个或更多 XML 元素毗邻在一同。 这甚至搜罗
XMLCOMMENT()
XMLTEXT()
XMLPI()
等函数的输出。至多在两种形态下
XMLCONCAT()
非常无效:

作为
XMLAGG()
函数的输出,
XMLAGG()
函数只接受一个参数。
组织同化节点(例如
John <mi>Q</mi> Smith


例子 10: XMLCONCAT(),含多个 XMLELEMENT()

清单 22. 例子 10 的 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Name", indname),
XMLELEMENT(NAME "NumCols", colcount),
XMLELEMENT(NAME "Uniq", uniquerule)
)
FROM
syscat.indexes
FETCH FIRST 15 ROWS ONLY
;


清单 23. 例子 10 示例输出

<Name>INDTABLES01</Name><NumCols>2</NumCols><Uniq>U</Uniq>
<Name>INDTABLES02</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDTABLES03</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDTABLES04</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDTABLES05</Name><NumCols>4</NumCols><Uniq>U</Uniq>
<Name>INDTABLES06</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDTABLES07</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDTABLES08</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDCOLUMNS01</Name><NumCols>3</NumCols><Uniq>U</Uniq>
<Name>INDCOLUMNS02</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDCOLUMNS03</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDINDEXES01</Name><NumCols>2</NumCols><Uniq>U</Uniq>
<Name>INDINDEXES02</Name><NumCols>3</NumCols><Uniq>U</Uniq>
<Name>INDINDEXES03</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDINDEXES04</Name><NumCols>3</NumCols><Uniq>D</Uniq>


例子 11: 哄骗 XMLCONCAT() 成立一个同化节点

清单 24. 例子 11 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Index", indname),
XMLTEXT(' has '),
XMLELEMENT(NAME "NumCols", colcount)
)
FROM
syscat.indexes
FETCH FIRST 15 ROWS ONLY
;


清单 25. 例子 11 示例输出

<Index>INDTABLES01</Index> has <NumCols>2</NumCols>
<Index>INDTABLES02</Index> has <NumCols>1</NumCols>
<Index>INDTABLES03</Index> has <NumCols>1</NumCols>
<Index>INDTABLES04</Index> has <NumCols>1</NumCols>
<Index>INDTABLES05</Index> has <NumCols>4</NumCols>
<Index>INDTABLES06</Index> has <NumCols>2</NumCols>
<Index>INDTABLES07</Index> has <NumCols>2</NumCols>
<Index>INDTABLES08</Index> has <NumCols>1</NumCols>
<Index>INDCOLUMNS01</Index> has <NumCols>3</NumCols>
<Index>INDCOLUMNS02</Index> has <NumCols>2</NumCols>
<Index>INDCOLUMNS03</Index> has <NumCols>1</NumCols>
<Index>INDINDEXES01</Index> has <NumCols>2</NumCols>
<Index>INDINDEXES02</Index> has <NumCols>3</NumCols>
<Index>INDINDEXES03</Index> has <NumCols>2</NumCols>
<Index>INDINDEXES04</Index> has <NumCols>3</NumCols>










回页首

标量函数 XMLAGG()

SUM()
MIN()
MAX()
一样,
XMLAGG()
是一个聚合函数。它接受一个 XML 表达式作为参数,搪塞每组记实,它将值都毗邻在一同。有一个可选的
ORDER BY
子句。当构建巨大的触及一对多关系的 XML 文档时,
XMLAGG()
非常无效。在上面的例子中,
SYSCAT.INDEXES
的每一行都与
SYSCAT.INDEXCOLUSE
中的多个行组合在一同。 在将关系数据转换成 XML 时,浩瀚嵌套的一对多关系可以用
XMLAGG()
来处置。

例子 12: XMLAGG()

清单 26. 例子 12 的 SQL 代码

WITH
t1 AS
(
SELECT indschema,
indname,
colseq,
XMLELEMENT(
NAME "ColName",
XMLATTRIBUTES(colseq AS "Seq"),
colname
) AS xml_col
FROM
syscat.indexcoluse
),
t2 (indschema, indname, list_cols) AS
(
SELECT indschema,
indname,
XMLAGG(xml_col ORDER BY colseq)
FROM
t1
GROUP BY
indschema,
indname
)
SELECT  XMLELEMENT(
NAME "Index",
XMLATTRIBUTES(i.indname AS "Name"),
t2.list_cols
)
FROM
syscat.indexes  I,
t2              T2
WHERE
i.colcount BETWEEN 2 AND 4
AND     t2.indschema = i.indschema
AND     t2.indname   = i.indname
FETCH FIRST 15 ROWS ONLY
;


清单 27. 例子 12 示例输出

Row #1:
<Index Name="ATM_UNIQ">
<ColName Seq="1">SCHEMA</ColName>
<ColName Seq="2">NAME</ColName><
</Index>
Row #2:
<Index Name="HI_OBJ_UNIQ">
<ColName Seq="1">HI_ID</ColName>
<ColName Seq="2">OBJ_NAME1</ColName>
<ColName Seq="3">OBJ_NAME2</ColName>
<ColName Seq="4">OBJ_NAME3</ColName>
</Index>
Row #3:
<Index Name="IMDTA00">
<ColName Seq="1">TOWNER00</ColName>
<ColName Seq="2">TASKNAME00</ColName>
</Index>
Row #4:
<Index Name="IMDTA03">
<ColName Seq="1">TASKID00</ColName>
<ColName Seq="2">SUFFIX00</ColName>
<ColName Seq="3">MODIFIED00</ColName>
</Index>
Row #5:
<Index Name="IMDTA04">
<ColName Seq="1">TASKID00</ColName>
<ColName Seq="2">SUFFIX00</ColName>
</Index>


关于例子 12 的留意事情

这个例子可以用几种不合的方式来编写。群众表表达式用于分隔代码,使之更明了。另一种方式是嵌套很多层的函数,同时/约莫哄骗子查询,这两种方式编写的代码都难于阅读。

为了看上去斗劲明了,示例输出在格式上作了补救(添加了缩进和换行)。

这个例子只演示了一个一对多关系,但幻想上可以处置很多一对多关系。

第一个 CTE(群众表表达式)
T1
获取用于子表(INDEXCOLUSE)的具体数据。

第二个 CTE 是
T2
,搪塞每个索引,它将来自 INDEXCOLUSE 的数据聚理会一行。经由进程在
XMLAGG()
中嵌套
XMLELEMENT()
,可以在一条
SELECT
语句中一同完成
T1
T2
的事情。多么易于治理,然则嵌套两层以上的函数很随意草率使代码难于阅读,难于陈列成亲的括号。

末端的
SELECT
INDEXES
与聚合的来自 INDEXCOLUSE 的数据相毗邻,并用一个 XML 元素将它包装起来。









回页首

标量函数 XMLDOCUMENT()

XMLDOCUMENT()
将一个 XML 节点转换成一个 XML 文档。XML 节点必须是格式优秀的,这意味着它必须有一个根元素。含 XML 标准典范的列的表老是搜罗格式优秀的 XML 文档。
XMLQUERY()
函数前去 XML 节点(而不是文档)。必要
XMLDOCUMENT()
函数的主要场景是将
XMLQUERY()
的后果拔出到一个含 XML 列的表中。例子 13 演示了这一点。

例子 13: XMLDOCUMENT()

清单 28. 例子 13 的 SQL 代码

CREATE TABLE demo.table1
(
key          INT,
xml_col      XML
)
;


清单 29. 例子 13 示例输出

DB20000I  The SQL command completed successfully.


清单 30. 例子 13 SQL 代码

INSERT INTO demo.table1 VALUES(1,
'<person><first>Joe</first><last>Smith</last></person>');


清单 31. 例子 13 示例输出

DB20000I  The SQL command completed successfully.


清单 32. 例子 13 SQL 代码

SELECT  XMLQUERY(
'$d/person/first'
PASSING xml_col AS "d"
)
FROM
demo.table1
WHERE
key = 1
;


清单 33. 例子 13 示例输出

<first>Joe</first>


清单 34. 例子 13 的 SQL 代码

INSERT INTO demo.table1
SELECT  2,
XMLQUERY(
'$d/person/first'
PASSING xml_col AS "d"
)
FROM
demo.table1
WHERE
key = 1
;


清单 35. 例子 13 示例输出

DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL20345N The XML value is not a well-formed document with a single root
element.  SQLSTATE=2200L


清单 36. 例子 13 SQL 代码

INSERT INTO demo.table1
SELECT  2,
XMLDOCUMENT(
XMLQUERY(
'$d/person/first'
PASSING xml_col AS "d"
)
)
FROM
demo.table1
WHERE
key = 1
;


清单 37. 例子 13 示例输出

DB20000I  The SQL command completed successfully.


清单 38. 例子 13 SQL 代码

SELECT * FROM demo.table1;


清单 39. 例子 13 示例输出

KEY  XML_COL
---- -------------------------------
1  <person><first>Joe</first><last>Smith</last></person>
2  <first>Joe</first>










回页首

标量函数 XMLTEXT()

XMLTEXT()
成立一个文本节点。上面的例子 11 演示了如何哄骗该函数。它的主要用处是帮忙成立同化标准典范的节点。









回页首

标量函数 XMLCOMMENT()

XMLCOMMENT()
成立一个注释节点。注释餍足以下两个约束的字符串:

不克不及搜罗两根陆续的短横线(
--

不克不及用一根短横线(
-
)扫尾

例子 14: XMLCOMMENT()(合法)

清单 40. 例子 14 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Dummy1", 1200),
XMLCOMMENT('Some comment'),
XMLELEMENT(NAME "Dummy2", 'hello')
)
FROM
sysibm.sysdummy1
;


清单 41. 例子 14 示例输出

<Dummy1>1200</Dummy1>
<!--Some comment-->
<Dummy2>hello</Dummy2>


例子 15: XMLCOMMENT(),含不批准的陆续短横线(不合法)

清单 42. 例子 15 的 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Dummy1", 1200),
XMLCOMMENT('Bad -- comments'),
XMLELEMENT(NAME "Dummy2", 'hello')
)
FROM
sysibm.sysdummy1
;


清单 43. 例子 15 示例输出

SQL20331N The XML comment value "Bad -- comments" is not valid.
SQLSTATE=2200S


例子 16: XMLCOMMENT(),含不批准的尾端短横线(不合法)

清单 44. 例子 16 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Dummy1", 1200),
XMLCOMMENT('Bad comments -'),
XMLELEMENT(NAME "Dummy2", 'hello')
)
FROM
sysibm.sysdummy1
;


清单 45. 例子 16 示例输出

SQL20331N The XML comment value "Bad comments -" is not valid.  SQLSTATE=2200S










回页首

标量函数 XMLPI()

XMLPI()
成立一个 XML 处置指令。它的哄骗有两个限定:

PI 称号中任那儿所都不克不及搜罗
xml
,大写、小写以及大小写同化的形式都不可
字符串中的任那儿所都不克不及搜罗
?>


例子 17: XMLPI() (合法)

清单 46. 例子 17 的 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Dummy1", 1200),
XMLPI(NAME "ValidName", 'some string'),
XMLELEMENT(NAME "Dummy2", 'hello')
)
FROM
sysibm.sysdummy1
;


清单 47. 例子 17 示例输出

<Dummy1>1200</Dummy1>
<?ValidName some string?>
<Dummy2>hello</Dummy2>


例子 18: XMLPI(),含无效称号(不合法)

清单 48. 例子 18 的 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Dummy1", 1200),
XMLPI(NAME "xmL", 'some string'),
XMLELEMENT(NAME "Dummy2", 'hello')
)
FROM
sysibm.sysdummy1
;


清单 49. 例子 18 示例输出

SQL20275N  The XML name "xmL" is not valid. Reason code = "5".  SQLSTATE=42634


例子 19: XMLPI(),含无效字符串(不合法)

清单 50. 例子 19 的 SQL 代码

SELECT  XMLCONCAT(
XMLELEMENT(NAME "Dummy1", 1200),
XMLPI(NAME "Valid", 'bad ?> string'),
XMLELEMENT(NAME "Dummy2", 'hello')
)
FROM
sysibm.sysdummy1
;


清单 51. 例子 19 示例输出

SQL20332N The XML processing instruction value "bad ?> string" is not valid.
SQLSTATE=2200T


版权声明:
原创作品,批准转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追查司法责任。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐