We are attempting to provide a solution for a querying a complex XML as provided in our example earlier, and come up with an approach that explains the ease of using Oracle XML functions.
We start with creating a table with single XMLTYPE field as shown below
create table prod_xml_Tab (demo_field xmltype) |
Grab the XML that we are going to use from the question page, and insert it into this table. As on the lines of our earlier posts, we will follow an incremental approach to come with the complete solution, as many readers have commented that it is easy to follow rather than coming up with one big XML. So, our report needs to contain the following columns
Brand Vs Model Vs HardDisk Vs Processor Vs RAM Vs Price Vs Display Type Vs Weight Vs MonitorSize |
Let us start of by getting Brand and Model. These are attributes of a repeating “Notebook” tag.
select extractvalue(value(a),'Notebook/@Brand') As Brand, extractvalue(value(a),'Notebook/@Model') As Model from prod_xml_tab b, table(xmlsequence(extract(demo_field,'Product/Notebook'))) a => All Notebook tags are pulled into a table here. |
The SQL above creates a XMLTABLE of “NoteBook” tags and reads the Brand and Model attributes using extractvalue on the column of the XMLTABLE. The output of this SQL is shown below (note that we have got two columns for our report now) Brand Model -------------- HP Pavilion dv6-3132TX Notebook HP HP Pavilion dv6-3032TX Notebook HP Pavilion dv6-3079TX Notebook Toshiba Satellite A660/07R 3D Notebook Toshiba Satellite A660/15J Notebook |
Note that this example requires only one XMLTABLE to be created as we have all other report columns as tags under the “Notebook” tag. This means, fetching the values of other report columns is going to be a cakewalk for us..
select extractvalue(value(a),'Notebook/@Brand') As Brand, extractvalue(value(a),'Notebook/@Model') As Model, extractvalue(value(a),'Notebook/Harddisk') As Harddisk, extractvalue(value(a),'Notebook/Processor') As Processor, extractvalue(value(a),'Notebook/RAM') As RAM, extractvalue(value(a),'Notebook/Price') As Price, extractvalue(value(a),'Notebook/Display/@Type') As DisplayType, extractvalue(value(a),'Notebook/Display/@MonitorSize') As MonitorSize, extractvalue(value(a),'Notebook/Weight') As Weight from prod_xml_tab b, table(xmlsequence(extract(demo_field,'Product/Notebook'))) a |
We read all other related information directly from the XMLTABLE created earlier. “Type” and “MonitorSize” are defined as attributes for “Display” and they are read accordingly..(on the same lines for Brand and Model). The output of this SQL matches the final report we were after. The report is provided below |
Brand | Model | Hard Disk | Processor | RAM | Price | DisplayType | MonitorSize | Weight |
HP | Pavilion dv6-3132TX Notebook | 640 GB | Intel Core i7 | 4 GB | 1189 | LED | 15.6 | 4.14 |
HP | HP Pavilion dv6-3032TX Notebook | 640 GB | Intel Core i7 | 6 GB | 1104 | LED | 15.6 | 4.1 |
HP | Pavilion dv6-3079TX Notebook | 500 GB | Intel Core i7 | 4 GB | 1099 | LED | 15.6 | 4.14 |
Toshiba | Satellite A660/07R 3D Notebook | 640 GB | Intel Core i7 | 4 GB | 1444 | LED | 15.6 | 4.88 |
Toshiba | Satellite A660/15J Notebook | 640 GB | Intel Core i5 | 6 GB | 1399 | LED | 15.6 | 3.9 |
No comments:
Post a Comment