XMLQUERY、XMLEXISTS、XMLTABLE)與 XQuery,Java 中通過 JDBC 統一調用。db2jcc.jar、db2jcc_javax.jar、db2jcc_license_cu.jar(位於 DB2_HOME/java/)。CREATE TABLE CLIENTS (
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR(50),
STATUS VARCHAR(10), -- 'Gold', 'Silver'
CONTACTINFO XML -- 原生 XML 列
);
XML 文檔範例(存入 CONTACTINFO):
<Client>
<Address>
<Street>123 Main St</Street>
<City>San Jose</City>
<State>CA</State>
<Zip>95125</Zip>
</Address>
<Phone type="work">408-555-1234</Phone>
<Phone type="home">408-555-5678</Phone>
<Email>john.doe@example.com</Email>
<Email>j.doe@backup.com</Email>
</Client>
public void insertXml(Connection con, File xmlFile) throws Exception {
String sql = "INSERT INTO CLIENTS (ID, NAME, STATUS, CONTACTINFO) VALUES (?, ?, ?, ?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, 1001);
ps.setString(2, "John Doe");
ps.setString(3, "Gold");
try (FileInputStream fis = new FileInputStream(xmlFile)) {
ps.setBinaryStream(4, fis, (int) xmlFile.length());
ps.executeUpdate();
}
ps.close();
}
關鍵點: 用 setBinaryStream 傳輸 XML,DB2 自動解析存儲。支持 XMLVALIDATE 針對已註冊 Schema 驗證。
需求:查詢 Status='Gold' 且 Zip='95125' 的客戶姓名與第一個 Email。
SELECT NAME,
XMLQUERY('$c/Client/Email[1]' PASSING CONTACTINFO AS "c") AS FIRST_EMAIL
FROM CLIENTS
WHERE STATUS = 'Gold'
AND XMLEXISTS('$c/Client/Address/Zip[. = $z]'
PASSING CONTACTINFO AS "c",
CAST('95125' AS VARCHAR(5)) AS "z");
XMLQUERY:提取 XML 片段,返回 XML 類型。XPath $c/Client/Email[1] 取第一個 Email 元素。XMLEXISTS:布爾謂詞,僅返回滿足條件的行。PASSING 綁定 XML 上下文變量 $c 與參數 $z。CAST:確保參數類型匹配。ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
String name = rs.getString("NAME");
// XMLQUERY 返回 XML 類型,可用 getBinaryStream/getString 獲取序列化文本
String emailXml = rs.getString("FIRST_EMAIL"); // 含 <Email> 標籤
// 若只需文本值:XPath 改為 $c/Client/Email[1]/text()
}
| 特性 | 說明 |
|---|---|
| XML 索引 | CREATE INDEX IX_ZIP ON CLIENTS(CONTACTINFO) GENERATE KEYS USING XMLPATTERN '/Client/Address/Zip' AS SQL VARCHAR(10) |
| XMLTABLE | 將 XML 彈性轉為關係行集,便於 JOIN、BI 工具直接消費 |
| 更新/刪除 | 用 XMLMODIFY (XQuery Update Facility) 精確修改片段,或整列替換 |
| 存儲過程 | IBM developerWorks 提供 XMLUPDATE 範例過程,僅傳增量 XML 片段即可更新 |
| 事務/並發 | XML 列遵循標準 ACID,行級鎖粒度同關係列 |
SELECT CONTACTINFO 拉取整個大文檔,用 XMLQUERY/XMLTABLE 只取所需片段。/Client/Address/Zip、/Client/Email)必須建索引。db2jcc4.jar) 完整支持 XML 類型流式讀寫。DB2 9 pureXML 讓 XML 成為一等公民:原生存儲、索引加速、標準語言查詢、JDBC 無縫集成。Java 開發者無需學習新 API,只需掌握 XMLQUERY/XMLEXISTS/XMLTABLE 三大 SQL/XML 函數與 XPath/XQuery 基礎,即可在關係與 XML 混合場景中高效開發。配合 Developer Workbench,開發調試效率再上台階。