XML 发布
使用 Version 11,您能够将 SQL 语句结果发布为相应的 XML 格式。这可以通过 GenXML 库提供的函数完成。
函数
通常,共有两种类型函数:一类返回 LVARCHAR,另一类返回 CLOB。所有函数都可以处理 NULL 值和特殊字符。如果结果大于 LVARCHAR (32739),则使用 clob 版本的命令 ——
genxmlclob,而不能使用
genxml。
下面展示了所提供的函数:
genxml / genxmlclob
genxmlelem / genxmlelemclob
genxmlschema / genxmlschemaclob
genxmlquery / genxmlqueryclob
genxmlqueryhdr / genxmlqueryhdrclob
extract / extractxmlclob
extractvalue / extraxtxmlvalueclob
existsnode
idsxmlparse
genxml
genxml 将 SQL 结果行作为 XML 元素返回。您可以返回完整的行,也可以只返回单个列。在执行 order-by 之前准备结果集。如果需要按照正确的顺序执行,那么在对结果应用函数之前,必须使用导出表查询按照正确的顺序获得结果集。
一般语法为:
genxml (root_element, rows)
|
其中, root_element 表示所选择的表的名称或表列,而 rows 表示希望为 XML 元素赋予的名字。
假设按照以下方式定义表类:
清单 19. 表类定义
<
CREATE TABLE classes
(
classid integer,
class integer,
subject char(20)
);
insert into classes values (1, 125, "Chemistry");
insert into classes values (1, 250, "Physics");
insert into classes values (1, 375, "Mathematics");
insert into classes values (1, 500, "Biology");
Assume a table cds defined like this
create table cds
(
cdid integer,
artist char(30),
title char(30)
);
insert into cds values (1, "Madonna", "Like a Prayer");
insert into cds values (1, "The Beatles", "Let It Be");
insert into cds values (1, "Queen", "We Will Rock You");
insert into cds values (1, "Genesis", "Invisible Touch"); |
要从表中选择整个行,使用以下代码:
清单 20. 选择整行
select genxml (cds, "cds") from cds;
genxml <cds cdid="1" artist="Madonna " title="Like a Prayer "/>
<cds cdid="1" artist="The Beatles " title="Let It Be "/>
<cds cdid="1" artist="Queen " title="We Will Rock You "/>
<cds cdid="1" artist="Genesis " title="Invisible Touch "/>
|
如果只选择 artist 列,使用以下语句:
清单 21. 选择 artist 列
select genxml (row(artist), "artist") from cds;
genxml <artist artist="Madonna "/>
<artist artist="The Beatles "/>
<artist artist="Queen "/>
<artist artist="Genesis "/>
|
genxmlelem
与 genxml 相反,genxmlelem 的每个列值作为单独的元素返回,这与 genxml 的输出有所不同。
清单 22. genxmlelem 示例
SELECT genxmlelem (cds, "cds") FROM cds;
genxmlelem <cds>
<row>
<cdid>1</cdid>
<artist>Madonna </artist>
<title>Like a Prayer </title>
</row>
<row>
<cdid>1</cdid>
<artist>The Beatles </artist>
<title>Let It Be </title>
</row>
<row>
<cdid>1</cdid>
<artist>Queen </artist>
<title>We Will Rock You </title>
</row>
<row>
<cdid>1</cdid>
<artist>Genesis </artist>
<title>Invisible Touch </title>
</row>
</cds>
|
genxmlschema
genxmlschema 与 genxml 相同,惟一的例外是它还返回 xml 模式。
清单 23. genxmlschema 示例
SELECT genxmlschema (row(artist), "artist") FROM cds WHERE artist = 'Queen';
genxmlschema <?xml version="1.0" encoding="en_US.819" ? >
xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://schemas.ibm.com/informix/2006/sqltypes"
xmlns="http://schemas.ibm.com/informix/2006/sqltypes"
ElementFormDefault="qualified">
<xs:element name="artist">
<xs:complexType>
<xs:sequence>
<xs:element name="artist" type="xs:char(30)"/ >
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<artist>
<row>
<artist>Queen </artist>
</row>
</artist>
|
genxmlquery
该函数将 SQL 查询作为参数并以 XML 格式返回结果。
一般语法为:
其中 row 表示给定 XML 结果的名称,而 query 表示将要执行的 SQL 查询。
清单 24. genxmlquery 示例
execute function genxmlquery (' Titles from Queen ',
"SELECT * from cds WHERE artist = 'Queen'");
(expression) <Titles from Queen>
<row>
<cdid>1</cdid>
<artist>Queen </artist>
<title>We Will Rock You </title>
</row>
</Titles from Queen>
|
使用该函数,您还可以确保以想要的方式对数据进行收集。
清单 25. 另一个 genxmlquery 示例
execute function genxmlquery ('cds', "SELECT * from cds order by artist");
(expression) <cds>
<row>
<cdid>1</cdid>
<artist>Genesis </artist>
<title>Invisible Touch </title>
</row>
<row>
<cdid>1</cdid>
<artist>Madonna </artist>
<title>Like a Prayer </title>
</row>
<row>
<cdid>1</cdid>
<artist>Queen </artist>
<title>We Will Rock You </title>
</row>
<row>
<cdid>1</cdid>
<artist>The Beatles </artist>
<title>Let It Be </title>
</row>
</cds>
|
genxmlqueryhdr
与 genxmlquery 基本相同,但是它包含了 XML 标题。
对于下一组函数,需要创建一个额外的 VP idsxmlvp。要创建该 vp,需要以用户 Informix 的身份执行以下命令:
之后,将在 online.log 中看到如下信息:
13:54:43 Dynamically added 1 idsxmlvp VP
|
如果该 vp 不存在,将看到下面的错误消息:
(-9799): ERROR: Routine execution VP switch failed
|
Extract
Extract 针对 XML 列、文档或字符串计算 XPATH 表达式。
Extractvalue
与 extract 相反,Extractvalue 将返回 XML 节点的值。
Existnode()
Extractvalue 可判断 XPath 是否至少产生一个 XML 元素。
Idsxmlparse
Extractvalue 在输入格式良好的情况下返回 XML 文档或片段。