You are on page 1of 8

<customerinfo Cid="1003">

<name>Robert Shoemaker</name>
<addr country="Canada">
<street>845 Kean Street</street>
<city>Aurora</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N8X 7F8</pcode-zip>
</addr>
<phone type="work">905-555-7258</phone>
<phone type="home">416-555-2937</phone>
<phone type="cell">905-555-8743</phone>
</customerinfo>
<customerinfo Cid="1004">
<name>Matt Foreman</name>
<addr country="Canada">
<street>1596 Baseline</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M3Z 5H9</pcode-zip>
</addr>
<phone type="work">905-555-4789</phone>
<phone type="home">416-555-3376</phone>
<assistant>
<name>Gopher Runner</name>
<phone type="home">416-555-3426</phone>
</assistant>
</customerinfo>
*******************************************************
SELECT XMLQUERY('/customerinfo/name' PASSING QTR_CLIENT_RPT_TX)
FROM DV01.QTR_RPT_TBL_QRT
WHERE CMP_C = '1003';
Incorrect element name in an XPath returns an empty sequence
/customer/name
Robert Shoemaker
returns text nodes of name elements
/customerinfo/name/text()
/customerinfo/data(name)
/customerinfo/string(name)
Robert Shoemaker
Matt Foreman
returns document fragments
/customerinfo/addr
<addr country="Canada">
<street>845 Kean Street</street>
<city>Aurora</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N8X 7F8</pcode-zip>
</addr>
<addr country="Canada">
<street>1596 Baseline</street>
<city>Toronto</city>

<prov-state>Ontario</prov-state>
<pcode-zip>M3Z 5H9</pcode-zip>
</addr>
return attribute values
/customerinfo/addr/data(@country)
Canada
Canada
Returning multiple text nodes from each document
/customerinfo/phone/text()
905-555-7258
416-555-2937
905-555-8743
905-555-4789
416-555-3376
*******************************************************
WILDCARDS AND DOUBLE SLASHES
wildcard to select all child elements of assistant
/customerinfo/assistant/*
<name>Gopher Runner</name>
<phone type="home">416-555-3426</phone>
wildcard to match any child element of customerinfo
/customerinfo/*/*
<street>845 Kean Street</street>
<city>Aurora</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N8X 7F8</pcode-zip>
<street>1596 Baseline</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M3Z 5H9</pcode-zip>
<name>Gopher Runner</name>
<phone type="home">416-555-3426</phone>
return any attribute on the third level of the document
/customerinfo/*/data(@*)
Canada
work
home
cell
Canada
work
home
Selecting name elements at any level under customerinfo
/customerinfo//name
<name>Robert Shoemaker</name>
<name>Matt Foreman</name>
<name>Gopher Runner</name>
*******************************************************

XPATH PREDICATES
Numeric predicate in an XPath expression
/customerinfo[@Cid=1004]/name/text()
Matt Foreman
*******************************************************
String predicate in an XPath expression
/customerinfo/addr[city="Toronto"]/street
<street>1596 Baseline</street>
XPath with two predicates
/customerinfo[name="Matt Foreman"]/addr[city="Toronto"]/street
<street>1596 Baseline</street>
*******************************************************
Incorrect use of // in a predicate
/customerinfo/phone[//@type="cell"]
<phone type="work">905-555-7258</phone>
<phone type="home">416-555-2937</phone>
<phone type="cell">905-555-8743</phone>
Correct use of // in a predicate
/customerinfo/phone[.//@type="cell"]
<phone type="cell">905-555-8743</phone>
Boolean expression, not a filtering predicate
/customerinfo/name="Matt Foreman"
true
*******************************************************
EXISTENTIAL SEMANTICS
At least one phone element must match, not all of them
/customerinfo[phone="416-555-2937"]/name
<name>Robert Shoemaker</name>
Return the name if a country attribute exists
/customerinfo[addr/@country]/name
<name>Robert Shoemaker</name>
<name>Matt Foreman</name>
Predicate is true if at least one of the values matches
/customerinfo[addr/city = ("Toronto","Aurora")]/name
<name>Robert Shoemaker</name>
<name>Matt Foreman</name>
/customerinfo[addr/city != "Toronto"]/name
??

*******************************************************
LOGICAL EXPRESSIONS WITH AND, OR, NOT()
/customerinfo[addr/city = "Toronto" or addr/city ="Aurora"]/name
<name>Robert Shoemaker</name>
<name>Matt Foreman</name>
Two predicates matched by different phone elements!
/customerinfo[phone = "416-555-2937" and phone/@type = "work"]/name
<name>Robert Shoemaker</name>
A structural predicate and a value predicate
/customerinfo[assistant or phone/@type="cell"] ]/name
<name>Robert Shoemaker</name>
<name>Matt Foreman</name>
*******************************************************
CURRENT CONTEXT AND THE PARENT STEP
different ways
(a) /customerinfo[addr/city = "Aurora"]/name
(b) /customerinfo/addr[city = "Aurora"]/../name
(c) /customerinfo/addr/city[. = "Aurora"]/../../name
(d) /customerinfo/name[../addr/city = "Aurora"]
<name>Robert Shoemaker</name>
*******************************************************
POSITIONAL PREDICATES
/customerinfo/phone[3]
<phone type="cell">905-555-8743</phone>
/customerinfo/phone[last()]

UNION AND CONSTRUCTION OF SEQUENCES


/customerinfo/addr/(street|city)
*******************************************************
FUNCTIONS
/customerinfo/count(phone)
3
2
/customerinfo/upper-case(name)
ROBERT SHOEMAKER
MATT FOREMAN
/customerinfo/concat(name,"
Robert Shoemaker - Aurora
Matt Foreman - Toronto

", addr/city)

*******************************************************
Inserting a document with two entity references
INSERT INTO shelf
VALUES (4,
'<bookstore>
<book>
<title>Helen&apos;s story about foxes &amp; rabbits</title>
</book>
</bookstore>')
SELECT XMLCAST(XMLQUERY('$BOOKINFO/bookstore/book/title')
AS VARCHAR(35)) as title
FROM shelf;
TITLE
-----------------------------------Helen's story about foxes & rabbits
SELECT bookinfo FROM shelf WHERE id = 4;
<bookstore><book><title>Helen's story about foxes &amp;
rabbits</title></book></bookstore>
*******************************************************

SELECT id, XMLQUERY('$INFO/customerinfo/phone/text()')


FROM customer;
1003 905-555-7258416-555-2937905-555-8743
1004 905-555-4789416-555-3376
Generating Rows and Columns from XML Data
SELECT T.*
FROM customer,
XMLTABLE('$INFO/customerinfo'
COLUMNS
custID INTEGER PATH '@Cid',
custname VARCHAR(20) PATH 'name',
street VARCHAR(20) PATH 'addr/street',
city VARCHAR(16) PATH 'addr/city') AS T;
CUSTID CUSTNAME STREET CITY
------ -------------------- -------------------- -----------1003 Robert Shoemaker 845 Kean Street Aurora
1004 Matt Foreman 1596 Baseline Toronto
SELECT T.*
FROM customer,
XMLTABLE('$i/customerinfo' PASSING info AS "i"
COLUMNS
c_name VARCHAR(20) PATH 'name',
a_name VARCHAR(20) PATH 'assistant/name') AS T;
C_NAME A_NAME
-------------------- -------------------Robert Shoemaker NULL
Matt Foreman Gopher Runner

a_name VARCHAR(20) default 'none'


PATH 'assistant/name'
Return multiple phone columns
SELECT T.*
FROM customer,
XMLTABLE('$INFO/customerinfo'
COLUMNS
custname VARCHAR(20) PATH 'name',
phone1 VARCHAR(12) PATH 'phone[1]',
phone2 VARCHAR(12) PATH 'phone[2]',
phone3 VARCHAR(12) PATH 'phone[3]') as T;
CUSTNAME PHONE1 PHONE2 PHONE3
-------------------- ------------ ------------ -----------Robert Shoemaker 905-555-7258 416-555-2937 905-555-8743
Matt Foreman 905-555-4789 416-555-3376 NULL
SELECT T.*
FROM customer,
XMLTABLE('$INFO/customerinfo/phone'
COLUMNS
seqno FOR ORDINALITY,
custname VARCHAR(20) PATH '../name',
phone VARCHAR(15) PATH '.',
type VARCHAR(10) PATH '@type') AS T;
SEQNO CUSTNAME PHONE TYPE
----- -------------------- --------------- ---------1 Robert Shoemaker 905-555-7258 work
2 Robert Shoemaker 416-555-2937 home
3 Robert Shoemaker 905-555-8743 cell
1 Matt Foreman 905-555-4789 work
2 Matt Foreman 416-555-3376 home
*****************************************************
XMLEXIST
SELECT T.*
FROM customer,
XMLTABLE('$INFO/customerinfo'
COLUMNS
custname VARCHAR(20) PATH 'name',
phone VARCHAR(12) PATH 'phone[@type="home"]') AS T
WHERE custname = 'Robert Shoemaker';
Robert Shoemaker 416-555-2937
USING PARAMETER MARKERS OR HOSTVARIABLES
SELECT info
FROM customer
WHERE XMLEXISTS('$INFO/customerinfo[addr/city = $c]')
passing cast(? as VARCHAR(25)) AS "c");
SELECT info
FROM customer
WHERE XMLEXISTS('$INFO/customerinfo[addr/city = $c]')
passing cast(:hvar as VARCHAR(25)) AS "c");

*********************************************************
Constructing Documents with XML Aggregation in SQL/XML Queries
SELECT XMLQUERY('<quickinfo>{$CONTACTINFO}</quickinfo>')
FROM (
SELECT XMLAGG(
XMLQUERY('<contact name="{$INFO/customerinfo/name}">
{for $p in $INFO/customerinfo/phone
where $p/@type != "home"
return <telephone>{$p/text()}</telephone>
}
</contact>') ) as contactinfo
FROM customer
WHERE XMLEXISTS('$INFO/customerinfo[addr/@country = "Canada"]'))
**************************************************************
ARITHMETIC EXPRESSIONS
SELECT T.id, T.itemvalue
FROM purchaseorder,
XMLTABLE('$PORDER/PurchaseOrder/item'
COLUMNS
id VARCHAR(15) PATH 'partid',
value DECIMAL(9,2) PATH 'quantity * price') as T
WHERE XMLEXISTS('$PORDER/PurchaseOrder[@PoNum= 5000]');
SELECT AVG(T.itemprice)
FROM purchaseorder,
XMLTABLE('$PORDER/PurchaseOrder/item'
COLUMNS
itemprice DECIMAL(9,2) PATH 'price') AS T
WHERE
XMLEXISTS('$PORDER/PurchaseOrder[starts-with(@Status,"Ship")]');
*******************************************************************
OUR PRoject
<CdRomData CmpCode="HDUG" BatchNmbr="12345" DataYr="2014" DataQtr="2" REPORTCD="
560">
<RECORD ID="RA"
<DATA>
<![CDATA[XML-RECORD]]>
</DATA>
</RECORD>
</CdRomData>
for EE records
-------------<CdRomData CmpCode="HDUG" BatchNmbr="12345" DataYr="2014" DataQtr="2" REPORTCD="
560">
<RECORD ID="RA" CORP="HDUG" FILENO=12345 SEQNO=111>
<DATA>
<![CDATA[XML-RECORD]]>
</DATA>
</RECORD>

</CdRomData>
SELECT XML.MAGMEDIA_DATA
FROM QTR_RPT_TBL_QRT QRT,
XMLTABLE ("/CdRomData/RECORD[@ID = 'RA' or @ID ='RE' or @ID = 'RW' or @ID =
'RO' or @ID = 'RT' or @ID = 'RU' or @ID = 'RF']"
PASSING QTR_CLIENT_RPT_TX
COLUMNS MAGMEDIA_DATA VARCHAR(513)
PATH "DATA/text()",
SEQ_NODE FOR ORDINALITY
)XML
WHERE CMP_C
= :WS-CMP-C
AND BATCH_RUN_YR_C = :WS-BATCH-RUN-YR-C
AND BATCH_RUN_QTR_C = :WS-BATCH-RUN-QTR-C
AND BATCH_NB
= :WS-BATCH-NB
AND DATA_YR_C
= :WS-DATA-YR-C
AND DATA_QTR_C
= :WS-DATA-QTR-C
AND RPT_CD_NB
= :WS-RPT-CD-NB
AND SEQ_NB
< 999990
ORDER BY SEQ_NB
,CMP_C
,SEQ_NODE;

You might also like