Skip to content

DB2 与 XML

现代应用程序通常处理无法整齐地放入传统行和列中的半结构化数据。Db2 是一种强大的多模型数据库,通过其 pureXML 功能和强大的 JSON 能力,提供了对存储和查询此类数据的原生支持。以原生方式存储这些数据,而不是作为纯文本存储在 CLOB 中,可以使数据库高效地解析、索引和查询数据。

本教程重点介绍 XML 数据类型,它允许您将格式良好的 XML 文档直接存储在表列中。

要存储 XML 数据,您只需在表创建期间定义一个具有 XML 数据类型的列即可。

示例:

-- 首先,确保您已连接到数据库
-- db2 connect to mydatabase
-- 创建一个表来存储客户信息,包括其配置文件的 XML 文档
CREATE TABLE customers (
id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
registered_date DATE NOT NULL DEFAULT CURRENT_DATE,
profile XML
);

您可以使用标准的 INSERT 语句插入 XML 数据,将 XML 文档作为字符串传递。Db2 将解析它以确保其格式正确。

示例:插入新的客户配置文件。

INSERT INTO customers (profile) VALUES(
XMLPARSE(DOCUMENT
'<profile>
<name>John Doe</name>
<email>john.doe@example.com</email>
<preferences>
<newsletter>true</newsletter>
<type>premium</type>
</preferences>
</profile>'
)
);

虽然您可以使用标准 UPDATE 语句更新整个 XML 文档,但更高效的做法是只修改发生变化的部分。这可以通过 XQuery Update 表达式来完成。

示例:更新客户的电子邮件地址。

UPDATE customers
SET profile = XMLQUERY(
'transform
copy $new_profile := $doc
modify do replace value of $new_profile/profile/email with "john.d@new-example.com"
return $new_profile'
PASSING profile AS "doc"
)
WHERE id = 1;

XML 数据类型的真正强大之处在于能够使用 SQL/XML 函数查询其内容。这些函数弥合了 SQL 关系世界与 XML 层次结构世界之间的鸿沟。

在 WHERE 子句中使用 XMLEXISTS 以根据 XML 文档的内容查找行。

-- 查找所有已订阅新闻邮件的客户
SELECT id, registered_date
FROM customers
WHERE XMLEXISTS('$p/profile/preferences[newsletter="true"]' PASSING profile AS "p");

使用 XMLQUERY 从 XML 列中提取片段或值。

-- 获取 ID 为 1 的客户的电子邮件地址
SELECT XMLCAST(XMLQUERY('$p/profile/email/text()' PASSING profile AS "p") AS VARCHAR(100))
FROM customers
WHERE id = 1;

使用 XMLTABLE 将 XML 文档中的值投射到关系结果集中,使其看起来像一个普通的表。这对于报告非常有用。

-- 列出所有客户的姓名和偏好类型
SELECT C.id, T.*
FROM customers C,
XMLTABLE('$p/profile' PASSING C.profile AS "p"
COLUMNS
customer_name VARCHAR(100) PATH 'name',
preference_type VARCHAR(20) PATH 'preferences/type'
) AS T;

虽然 XML 功能强大且在企业系统中广泛使用,但许多新应用程序,尤其是 Web 和移动应用程序,更青睐 JSON(JavaScript 对象表示法),因为它更简单、更轻量。Db2 对存储和查询 JSON 数据提供了出色的支持。数据以其二进制表示(BSON)存储以提高效率。

您可以使用 SQL/JSON 函数,如 JSON_VALUE、JSON_QUERY 和 JSON_TABLE,它们类似于其 XML 对应项,来处理存储在 VARCHAR、BLOB 或 CLOB 列中的 JSON 数据。如果您正在开始一个新项目,请考虑 JSON 是否更适合您的半结构化数据需求。

有关更多信息,请在 Db2 知识中心搜索“Db2 中的 JSON 功能”。