Few examples to extract xml data in a SQL query.
#1. Extract Master Child xml using xmltable
XMLTABLE
select
header_row.department_id
,header_row.department_name
,child_row.employee_id
,child_row.first_name
,child_row.last_name
from
XMLTABLE
(
XMLNAMESPACES
(
default
'
http://johnytips.blogspot.com.au/ns/department
'
)
,'
/department
'
PASSING
xmltype
(
'
<department xmlns="http://johnytips.blogspot.com.au/ns/department" id="1">
<department_name>Research</department_name>
<employees>
<employee id="1">
<first_name>ANOOP</first_name>
<last_name>JOHNY</last_name>
</employee>
<employee id="2">
<first_name>ANISH</first_name>
<last_name>JOHNY</last_name>
</employee>
</employees>
</department>
')
COLUMNS
department_id
VARCHAR2
(30)
PATH
'
@id
'
,
department_name
VARCHAR2
(10)
PATH
'
department_name
'
,
child_rows
XMLTYPE
PATH
'
employees
'
) header_row
,
XMLTABLE
(
XMLNAMESPACES
(
default
'http://johnytips.blogspot.com.au/ns/department'
)
,'
/employees/employee'
PASSING
header_row.child_rows
COLUMNS
employee_id
NUMBER
PATH
'@id'
,
first_name
VARCHAR2
(30)
PATH
'first_name'
,
last_name
VARCHAR2
(30)
PATH
'last_name'
) child_row;
#2. EXTRACTVALUE
with
t
as
(
select
xmltype
(
'<employee>
<employee_id>1</employee_id>
<first_name>ANOOP</first_name>
<last_name>JOHNY</last_name>
</employee>'
) str
from
dual)
select
extractvalue
(str,
'/employee/employee_id'
) EMPLOYEE_ID
,
extractvalue
(str,
'/employee/first_name'
) FIRST_NAME
,
extractvalue
(str,
'/employee/last_name'
) LAST_NAME
from
t;
#3.
EXTRACT
with
t
as
(
select
xmltype
(
'<employee>
<employee_id>1</employee_id>
<first_name>ANOOP</first_name>
<last_name>JOHNY</last_name>
</employee>'
) str
from
dual)
select
extract
(str,
'/employee/employee_id/text()'
) EMPLOYEE_ID
,
extract
(str,
'/employee/first_name/text()'
) FIRST_NAME
,
extract
(str,
'/employee/last_name/text()'
) LAST_NAME
from
t;
#4. To extract with the xml tag
with
t
as
(
select
xmltype
(
'<employee>
<employee_id>1</employee_id>
<first_name>ANOOP</first_name>
<last_name>JOHNY</last_name>
</employee>'
) str
from
dual)
select
extract
(str,
'/employee/employee_id'
) EMPLOYEE_ID
,
extract
(str,
'/employee/first_name'
) FIRST_NAME
,
extract
(str,
'/employee/last_name'
) LAST_NAME
from
t;
#5. Prior to Oracle Database 10g Release 2 using xmlsequence
XMLSEQUENCE
select
extractvalue
(
column_value
,
'/employee/first_name'
) "FIRST_NAME"
,
extractvalue
(
column_value
,
'/employee/last_name'
) "LAST_NAME"
from
table
(
xmlsequence
(
xmltype
(
'<employees>
<employee>
<employee_id>1</employee_id>
<first_name>ANOOP</first_name>
<last_name>JOHNY</last_name>
</employee>
<employee>
<employee_id>2</employee_id>
<first_name>ANISH</first_name>
<last_name>JOHNY</last_name>
</employee>
</employees>'
).extract(
'/employees/employee'
)));
Feel free to point out if anything is missing/wrong in this blog