Upload
others
View
13
Download
1
Embed Size (px)
Citation preview
2 © 2012 IBM Corporation
Information Management
Agenda
■ Introduction■ XML Host Variables in COBOL■ SQL/XML Functions■ Insert and Retrieval XML Data■ Update and Delete XML Data■ Trigger to Extract Relational Data from XML Data■ Analyzing Access Plan with or without XML Indexes■ DESCRIBE Statement Referring to an XML Column■ FETCH WITH CONTINUE and FETCH CURRENT
CONTINUE on XML Data■ XML Sub-document Update
3 © 2012 IBM Corporation
Information Management
Introduction
Minimum Requirement:– DB2 9 for z/OS– Enterprise COBOL for z/OS V3R4
Recommend Requirement:– DB2 10 for z/OS
• New features (Sub-document update, XQuery, Binary XML, XML support in SQL PL and UDF, etc)
• Enhancement on performance and storage– Enterprise COBOL for z/OS V4R1
DB2 Precompiler or DB2 Coprocessor Purpose of COBOL samples:
– Problems from users– Illustrate DB2 for z/OS pureXML features in COBOL
Where are the COBOL Samples?http://www.ibm.com/developerworks/wikis/display/db2xml/DB2+for+zOS+pureXML
4 © 2012 IBM Corporation
Information Management
DDL for COBOL Samples
CREATE TABLE PURCHASE_ORDER ( PODOCID INTEGER, PODOC XML );
CREATE INDEX POINDEX1 ON PURCHASE_ORDER (PODOC) GENERATE KEY USING XMLPATTERN '/purchaseOrder/items/item/productName' AS SQL VARCHAR(30)
5 © 2012 IBM Corporation
Information Management
XML Storage
PURCHASE_ORDER
B+tree
DocID index
XML Table
B+tree
NodeID index
B+tree
XML index (POINDEX1)
DOCID MIN_NODEID XMLDATA
PODOCID PODOCDocID
6 © 2012 IBM Corporation
Information Management
An Example of PURCHASE ORDER DOCUMENT<purchaseOrder orderDate="2010-08-18"> <shipTo country="US"> <name>Alice Smith</name> <street>123 Maple Street</street> <city>San Jose</city><state>California</state><zip>95123</zip> </shipTo> <billTo country="US"> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>San Jose</city><state>California</state><zip>95123</zip> </billTo> <comment>Hurry, my lawn is going wild!</comment> <items> <item partNum="872-AA"> <productName>Lawnmower</productName> <quantity>1</quantity><USPrice>149.99</USPrice> <comment>Confirm this is gas powered</comment> <shipDate>2010-08-20</shipDate> </item> </items> </purchaseOrder>
7 © 2012 IBM Corporation
Information Management
XML Host Variables01 XMLCLOB USAGE IS SQL TYPE IS XML AS CLOB(10K).01 XMLBLOB USAGE IS SQL TYPE IS XML AS BLOB(10K).01 XMLDBCLOB USAGE IS SQL TYPE IS XML AS DBCLOB(10K).
Modified Source by DB2 Precompiler:
01 XMLCLOB. 02 XMLCLOB-LENGTH PIC 9(9) COMP-5. 02 XMLCLOB-DATA. 49 FILLER PIC X(10240).
01 XMLBLOB. 02 XMLBLOB-LENGTH PIC 9(9) COMP-5. 02 XMLBLOB-DATA. 49 FILLER PIC X(10240).
01 XMLDBCLOB. 02 XMLDBCLOB-LENGTH PIC 9(9) COMP-5. 02 XMLDBCLOB-DATA. 49 FILLER PIC G(10240) USAGE DISPLAY-1.
9 © 2012 IBM Corporation
Information Management
More XML Host Variables01 BLOB-XML-FILE USAGE IS SQL TYPE IS XML AS BLOB-FILE.01 CLOB-XML-FILE USAGE IS SQL TYPE IS XML AS CLOB-FILE.01 DBCLOB-XML-FILE USAGE IS SQL TYPE IS XML AS DBCLOB-FILE.
01 BLOB-XML-FILE. 49 BLOB-XML-FILE-NAME-LENGTH PIC S9(9) COMP-5 SYNC. 49 BLOB-XML-FILE-DATA-LENGTH PIC S9(9) COMP-5. 49 BLOB-XML-FILE-FILE-OPTION PIC S9(9) COMP-5. 49 BLOB-XML-FILE-NAME PIC X(255).
01 CLOB-XML-FILE. 49 CLOB-XML-FILE-NAME-LENGTH PIC S9(9) COMP-5 SYNC. 49 CLOB-XML-FILE-DATA-LENGTH PIC S9(9) COMP-5. 49 CLOB-XML-FILE-FILE-OPTION PIC S9(9) COMP-5. 49 CLOB-XML-FILE-NAME PIC X(255).
01 DBCLOB-XML-FILE. 49 DBCLOB-XML-FILE-NAME-LENGTH PIC S9(9) COMP-5 SYNC. 49 DBCLOB-XML-FILE-DATA-LENGTH PIC S9(9) COMP-5. 49 DBCLOB-XML-FILE-FILE-OPTION PIC S9(9) COMP-5. 49 DBCLOB-XML-FILE-NAME PIC X(255).
10 © 2012 IBM Corporation
Information Management
SQL/XML Functions XMLEXISTS
SELECT COUNT(DISTINCT PODOCID) INTO :HV-COUNT FROM PURCHASE_ORDER WHERE XMLEXISTS ('//item[@partNum = "872-AA"]' PASSING PODOC)
XMLQUERYSELECT XMLQUERY( '//item[@partNum = "872-AA"]' PASSING PODOC)INTO :HV-XML-CLOB FROM PURCHASE_ORDER WHERE PODOCID = 1
XMLTABLESELECT X.ORDERDATE, X.SHIPDATE INTO :HV-DATE1, :HV-DATE2FROM PURCHASE_ORDER,
XMLTABLE('/purchaseOrder[.//item/@partNum="872-AA"]' PASSING PODOC COLUMNS ORDERDATE DATE PATH '@orderDate' , SHIPDATE DATE PATH 'items/item[@partNum = "872-AA"]/shipDate' ) AS X WHERE PODOCID = 1
XMLCASTSELECT XMLCAST(XMLQUERY( '/purchaseOrder/@orderDate' PASSING PODOC)
AS DATE) INTO :HV-DATE FROM PURCHASE_ORDER WHERE PODOCID = 1
11 © 2012 IBM Corporation
Information Management
Insert XML Data
•Insert from literalINSERT INTO PURCHASE_ORDER (PODOCID, PODOC) VALUES (1, '<purchaseOrder orderDate="2010-08-18">…</purchaseOrder>')INSERT INTO PURCHASE_ORDER (PODOCID, PODOC) VALUES (2, XMLPARSE(DOCUMENT '......' PRESERVE WHITESPACE))•Insert from Host Variable01 HV-CLOB1 SQL TYPE IS XML AS CLOB(3K).01 HV-CLOB-LOCATOR01 SQL TYPE IS CLOB-LOCATOR.INSERT INTO PURCHASE_ORDER (PODOCID, PODOC) VALUES(3, :HV-CLOB1) INSERT INTO PURCHASE_ORDER (PODOCID, PODOC) VALUES(4, :HV-CLOB-LOCATOR01)
12 © 2012 IBM Corporation
Information Management
Insert XML Data (Cont.)•Insert from File Reference Host Variable01 HV-XML-CLOB-FILE SQL TYPE IS XML AS CLOB-FILE.MOVE 23 TO HV-XML-CLOB-FILE-NAME-LENGTH. MOVE "SYSADM.XMLSAMP.CLOBFILE" TO HV-XML-CLOB-FILE-NAME.MOVE SQL-FILE-READ TO HV-XML-CLOB-FILE-FILE-OPTION. EXEC SQL INSERT INTO PURCHASE_ORDER (PODOCID, PODOC) VALUES(5, :HV-XML-CLOB-FILE) END-EXEC. •FILE OPTIONS
•SQL-FILE-READ : 2 •SQL-FILE-CREATE : 8 •SQL-FILE-OVERWRITE : 16 •SQL-FILE-APPEND : 32
13 © 2012 IBM Corporation
Information Management
• Simple select:SELECT PODOCFROM PURCHASE_ORDERWHERE PODOCID = 1
• Select with condition:SELECT PODOCFROM PURCHASE_ORDERWHERE XMLEXISTS('//item[@partNum = "872-AA"]' PASSING PODOC)
• Extract from a document:SELECT XMLQUERY(‘/purchaseOrder/@orderDate’ PASSING PODOC)FROM PURCHASE_ORDER WHERE XMLEXISTS('//item[@partNum = "872-AA"]' PASSING PODOC)
Retrieving XML Data
14 © 2012 IBM Corporation
Information Management
Retrieving XML Data to File Reference Host Variable
01 HV-XML-CLOB-FILE SQL TYPE IS XML AS CLOB-FILE.
MOVE 17 TO HV-XML-CLOB-FILE-NAME-LENGTH. MOVE "/tmp/xmldoc01.txt" TO HV-XML-CLOB-FILE-NAME.MOVE SQL-FILE-OVERWRITE TO HV-XML-CLOB-FILE-FILE-OPTION.
EXEC SQL SELECT PODOC INTO :HV-XML-CLOB-FILE FROM PURCHASE_ORDER WHERE PODOCID = 1 END-EXEC.
15 © 2012 IBM Corporation
Information Management
•Updating an XML Column
01 HV-CLOB1 SQL TYPE IS XML AS CLOB(2048).EXEC SQL UPDATE PURCHASE_ORDER SET PODOC = :HV-CLOB1 WHERE PODOCID = 1 END-EXEC.
•Delete Rows Based on XML Data
EXEC SQL DELETE FROM PURCHASE_ORDER WHERE XMLEXISTS ('//item[@partNum = "872-AA"]' PASSING PODOC) END-EXEC.
Update and Delete on XML Data
16 © 2012 IBM Corporation
Information Management
CREATE TRIGGER INS_CUST AFTER INSERT ON CUSTOMER_INFO REFERENCING NEW AS NEWROW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC UPDATE CUSTOMER_INFO SET (CUST_NAME, CUST_ADDR, CUST_CITY, CUST_ZIP) = (SELECT X.NAME, X.ADDR, X.CITY, X.ZIP FROM CUSTOMER_INFO AS C , XMLTABLE('customer' PASSING C.CUST_INFO COLUMNS NAME VARCHAR(30) PATH 'name', CITY VARCHAR(30) PATH 'city', ZIP VARCHAR(12) PATH 'zip' , ADDR VARCHAR(100) PATH 'street' ) AS X WHERE C.CUST_ID = NEWROW.CUST_ID ) WHERE CUST_ID = NEWROW.CUST_ID ; END
Trigger to Extract Relational Data from XML Data
17 © 2012 IBM Corporation
Information Management
CREATE TABLE CUSTOMER_INFO ( CUST_ID INTEGER, CUST_NAME VARCHAR(30), CUST_ADDR VARCHAR(100), CUST_CITY VARCHAR(30), CUST_ZIP VARCHAR(12), CUST_INFO XML )
INSERT INTO CUSTOMER_INFO (CUST_ID, CUST_INFO) VALUES (1, '<customer country="US"><name>Alice Smith</name>...</customer>') SELECT CUST_NAME FROM CUSTOMER_INFO WHERE CUST_ID = 1
+--------------------------------+ | CUST_NAME | +--------------------------------+ 1_| Alice Smith | +--------------------------------+
Trigger to Extract Relational Data from XML Data (Cont.)
18 © 2012 IBM Corporation
Information Management
Create XML Indexes
CREATE INDEX POINDEX1 ON PURCHASE_ORDER (PODOC) GENERATE KEY USING XMLPATTERN '/purchaseOrder/items/item/productName' AS SQL VARCHAR(30)
CREATE INDEX POINDEX2 ON PURCHASE_ORDER (PODOC) GENERATE KEY USING XMLPATTERN '/purchaseOrder/items/item/USPrice' AS SQL DECFLOAT
19 © 2012 IBM Corporation
Information Management
Explain Queries with XML IndexesEXPLAIN ALL SET QUERYNO = 1 FOR SELECT PODOCID FROM PURCHASE_ORDER WHERE XMLEXISTS('/purchaseOrder/items/item[productName ="Lawnmower"]' PASSING PODOC)
EXPLAIN ALL SET QUERYNO = 2 FOR SELECT PODOCID FROM PURCHASE_ORDER WHERE XMLEXISTS('/purchaseOrder/items/item[USPrice > 100]' PASSING PODOC)
EXPLAIN ALL SET QUERYNO = 3 FOR SELECT PODOCID FROM PURCHASE_ORDER WHERE XMLEXISTS('/purchaseOrder/items/item[productName ="Lawnmower" and 'USPrice >100]' PASSING PODOC)
EXPLAIN ALL SET QUERYNO = 4 FOR SELECT PODOCID FROM PURCHASE_ORDER WHERE XMLEXISTS('/purchaseOrder/items/item[productName ="Lawnmower" or 'USPrice >100]' PASSING PODOC)
20 © 2012 IBM Corporation
Information Management
Explain Results with XML Indexes+-----------------------------------------+| QUERYNO | ACCESSTYPE | ACCESSNAME |+-----------------------------------------+| 0001 | DX | POINDEX1 || 0002 | DX | POINDEX2 || 0003 | M | || 0003 | DX | POINDEX1 || 0003 | DX | POINDEX2 || 0003 | DI | || 0004 | M | || 0004 | DX | POINDEX1 || 0004 | DX | POINDEX2 || 0004 | DU | |+-----------------------------------------+
21 © 2012 IBM Corporation
Information Management
Explain Results without XML Indexes
DROP INDEX POINDEX1DROP INDEX POINDEX2
+-----------------------------------------+| QUERYNO | ACCESSTYPE | ACCESSNAME |+-----------------------------------------+| 0001 | R | || 0002 | R | || 0003 | R | || 0004 | R | |+-----------------------------------------+
22 © 2012 IBM Corporation
Information Management
DESCRIBE Statement Referring to an XML Column 01 HV-STMT. 49 HV-STMT-LEN PIC S9(4) COMP. 49 HV-STMT-DATA PIC X(240). MOVE 75 TO HV-STMT-LEN.MOVE 'SELECT PODOC, XML2CLOB(PODOC) FROM ADMF001.PURCHASE_ORDER WHERE PODOCID = 1' TO HV-STMT-DATA. PREPARE STMT1 FROM :HV-STMT DESCRIBE STMT1 INTO :SQLDA
After the Execution of DESCRIBE statement:SQLTYPE(1) = 0989 (XML data type in DB2)SQLTYPE(2) = 0409 (CLOB data type in DB2)
23 © 2012 IBM Corporation
Information Management
FETCH XML Data Based on the DESCRIBE SQLDA SET SQLDATA(1) TO ADDRESS OF HV-XML-CLOB. SET SQLIND(1) TO ADDRESS OF HV-XML-CLOB-IND. SET SQLDATA(2) TO ADDRESS OF HV-CLOB. SET SQLIND(2) TO ADDRESS OF HV-CLOB-IND. FETCH C1 USING DESCRIPTOR :SQLDA -804 AN ERROR WAS FOUND IN THE APPLICATION PROGRAM INPUT PARAMETERS FOR THE SQL STATEMENT, REASON 16RC16 : Unrecognized output data type. MOVE 409 TO SQLTYPE(1). MOVE 0 TO SQLLEN(1) . MOVE 1048576 TO SQLLONGLEN(3). FETCH C1 USING DESCRIPTOR :SQLDA
24 © 2012 IBM Corporation
Information Management
FETCH WITH/CURRENT CONTINUE on XML Data
01 HV-INTEGER PIC S9(4) COMP.01 HV-XML-CLOB SQL TYPE IS XML AS CLOB(100).DECLARE C1 CURSOR FOR SELECT PODOCID, PODOC FROM PURCHASE_ORDER WHERE PODOCID = 1 FETCH C1 INTO :HV-INTEGER, :HV-XML-CLOB==> SQLCODE = -433, ERROR: VALUE <XML-Value> IS TOO LONG
FETCH WITH CONTINUE C1 INTO :HV-INTEGER, :HV-XML-CLOB==> HV-XML-CLOB-LENGTH = 641
FETCH CURRENT CONTINUE C1 INTO :HV-INTEGER, :HV-XML-CLOB ==> HV-XML-CLOB-LENGTH = 541 HV-XML-CLOB-LENGTH = 441 HV-XML-CLOB-LENGTH = 341 ......
25 © 2012 IBM Corporation
Information Management
XML Sub-document Update (DB2 10) EXEC SQL UPDATE PURCHASE_ORDER SET PODOC = XMLMODIFY( 'insert nodes $item as last into /purchaseOrder/items', XMLPARSE(DOCUMENT '<item partNum="747-BB">- ' <productName>Ruby Ring</productName>- ' <quantity>1</quantity><USPrice>75.50</USPrice>- ' <shipDate>2012-08-21</shipDate> - '</item>') as "item") WHERE PODOCID = 1001 END-EXEC
26 © 2012 IBM Corporation
Information Management
XML Sub-document Update (Cont.) No easy way to update parts of a document in DB2 9Only simple update: insert, replace, delete from XQuery
update facilityXMLMODIFY can only be used in RHS of UPDATE SET.Only changed rows in XML table are updated
27 © 2012 IBM Corporation
Information Management
Conclusion
■ Introduction■ XML Host Variables and SQL/XML Functions■ Insert, Retrieval, Update and Delete XML Data■ Trigger to Extract Relational Data from XML Data■ Analyzing Access Plan with or without XML Indexes■ DESCRIBE Statement Referring to an XML Column■ FETCH WITH CONTINUE and FETCH CURRENT
CONTINUE on XML Data■ XML Sub-document Update