Reputation: 49
I have XML in the following format
<Receive
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Date>20171106</Date>
<ReceiptDetails>
<ReceiptDetail>
<Quantity>3</Quantity>
</ReceiptDetail>
<ReceiptDetail>
<Quantity>2</Quantity>
</ReceiptDetail>
<ReceiptDetail>
<Quantity>1</Quantity>
</ReceiptDetail>
<ReceiptDetail>
<Quantity>4</Quantity>
</ReceiptDetail>
</ReceiptDetails>
</Receive>
Now I want a query Oracle SQL query which returns me the sum of the Quantities Node.
I wrote a query which is concatenating the values.
SELECT
XMLTYPE(t.REQ_MSG).EXTRACT('//Receive/ReceiptDetails/ReceiptDetail/Quantity/text()').getStringVal()
FROM
TABLE_NAME t;
This Gives me 3214 which is the Concatenated value but I want 10 which is the Sum.
Upvotes: 2
Views: 1187
Reputation: 107652
Consider parsing XML node into a column using XMLTABLE
and then aggregate in outer query.
SELECT SUM(e.Quantity) AS SumQuantity
FROM XMLTABLE('/Receive/ReceiptDetails/ReceiptDetail'
PASSING XMLTYPE('<Receive xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Date>20171106</Date>
<ReceiptDetails>
<ReceiptDetail>
<Quantity>3</Quantity>
</ReceiptDetail>
<ReceiptDetail>
<Quantity>2</Quantity>
</ReceiptDetail>
<ReceiptDetail>
<Quantity>1</Quantity>
</ReceiptDetail>
<ReceiptDetail>
<Quantity>4</Quantity>
</ReceiptDetail>
</ReceiptDetails>
</Receive>')
COLUMNS
Quantity NUMBER PATH 'Quantity') as e
And for the XML column in a table
SELECT SUM(e.Quantity) AS SumQuantity
FROM MY_TABLE,
XMLTABLE('/Receive/ReceiptDetails/ReceiptDetail'
PASSING XMLTYPE(MY_TABLE.MY_XML_COLUMN)
COLUMNS
Quantity NUMBER PATH 'Quantity') as e
Upvotes: 2