本文展示了通過 RPG 來使用 IBM DB2 for i 7.1 提供的 SQL/XML 函數(shù)的幾個(gè)示例。文中展示了如何將 SQL 語句嵌入 RPG 程序,從而執(zhí)行涉及 XML 數(shù)據(jù)的關(guān)系查詢并生成 XML 結(jié)果。本文中演示了 SQL/XML 發(fā)布函數(shù)和近期發(fā)布的 XMLTABLE 函數(shù)。
對(duì)于任何企業(yè)來說,應(yīng)用程序的現(xiàn)代化和 web 支持都是極為重要的目標(biāo),但這同時(shí)也帶來了一些挑戰(zhàn)。通常,這些企業(yè)希望把 it 資源的重心放在改進(jìn)過去使用成功的基礎(chǔ)架構(gòu),而不是編寫全新的應(yīng)用程序。在 ibm i 平臺(tái)上,現(xiàn)代化通常意味著把rpg編寫的應(yīng)用程序改成基于web的應(yīng)用。由于目前存在大量通過 web 傳輸數(shù)據(jù)的 xml 標(biāo)準(zhǔn),因此在 rpg 中提供 xml 功能至關(guān)重要。rpg 程序員必須認(rèn)識(shí)到,db2 for i 引入的原生 xml 數(shù)據(jù)類型,為支持嵌入式 sql(包括 rpg)各種編程語言提供了一整套全新的選擇來同時(shí)處理 xml 和傳統(tǒng)數(shù)據(jù)。
在關(guān)系查詢中使用來自 XML 文檔的數(shù)據(jù)
假設(shè)我有一個(gè)應(yīng)用程序,用它在關(guān)系數(shù)據(jù)庫(kù)表中跟蹤客戶訂單。為了完成這項(xiàng)任務(wù),我需要使用 SQL 在模式 (RPG_ORDERS) 中創(chuàng)建以下 ORDERS 表,并在其中插入一些記錄:
清單 1. SQL 創(chuàng)建和插入語句
CREATE TABLE rpg_orders.orders( order_id BIGINT GENERATED ALWAYS AS IDENTITY( START WITH 1000 INCREMENT BY 1 NO MINVALUE NO MAXVALUE NO CYCLE NO ORDER CACHE 20 ), Cust_email VARCHAR(50), Order_ts TIMESTAMP , Product VARCHAR(50) CCSID 37, Price DOUBLE PRECISION , PRIMARY KEY(order_id) ) ; INSERT INTO rpg_orders.orders (cust_email, order_ts, product, price) VALUES ('ntl@us..com', '2012-04-15 13:00:00', 'Camera', 999.50 ), ('ntl@us..com', '2012-04-16 12:00:00', 'lens', 500.25), ('ntl@us.ibm.com', '2012-04-01 11:00:00', 'Book', 15.00), ('george@nowhere.com', '2012-04-15 13:05:00', 'Book', 20) ;
對(duì)于請(qǐng)求為擁有匹配的電子郵件地址并在指定時(shí)間段內(nèi)完成的訂單生成一個(gè)報(bào)告的程序,這個(gè)基于 Web 的應(yīng)用程序?qū)⑻峁┮粋€(gè) XML 文檔。
清單 2 給出了一個(gè)示例請(qǐng)求文檔。
清單 2. 信息請(qǐng)求文檔示例
<?xml version="1.0" encoding="UTF-8" ?> <OrderInfoRequest> <CustEmail>ntl@us.ibm.com</CustEmail> <MinTs> 2012-04-14T:00:00:00 </MinTs> <MaxTs> 2012-04-30T23:59:59 </MaxTs> </OrderInfoRequest>
我的第一個(gè) RPG 程序從文件中檢索一個(gè) XML 信息請(qǐng)求,并用它在假脫機(jī)文件中生成了一個(gè)報(bào)告。可以假設(shè)我們正在從標(biāo)準(zhǔn)輸出或套接字中讀取此數(shù)據(jù) —— 但為保持示例的簡(jiǎn)潔,流文件便足以闡述相關(guān)概念。