XMLTYPE has built-in functions to allow us to manipulate the data values being placed into the column defined as SYS.XMLTYPE. Data may be inserted into the table using the sys.xmltype.createxml procedure like this:
SQL> CREATE TABLE testxml (id NUMBER(3), dt SYS.XMLTYPE);
Table created.
SQL>
SQL>
SQL> INSERT INTO testxml VALUES(111,
2 sys.xmltype.createxml(
3 '<?xml version="1.0"?>
4 <customer>
5 <name>Joe Smith</name>
6 <title>Mathematician</title>
7 </customer>'))
8 /
1 row created.
SQL>
SQL> SET LONG 2000
SQL>
SQL> SELECT *
2 FROM testxml
3 /
ID DT
------------------------------
111 <?xml version="1.0"?><customer><name>Joe Smith</name><title>Mathematician</title></customer>
SQL>
SQL> drop table testxml;
Table dropped.
SQL>
Use sys.xmltype.createxml to add XML data to table
SQL> CREATE TABLE testxml (id NUMBER(3), dt SYS.XMLTYPE);
Table created.
SQL>
SQL>
SQL> INSERT INTO testxml VALUES(111,
2 sys.xmltype.createxml(
3 '<?xml version="1.0"?>
4 <customer>
5 <name>Joe Smith</name>
6 <title>Mathematician</title>
7 </customer>'))
8 /
1 row created.
SQL>
SQL> SET LONG 2000
SQL>
SQL> SELECT *
2 FROM testxml
3 /
ID DT
----------------------------------------------------------------------------------------
111 <?xml version="1.0"?><customer><name>Joe Smith</name><title>Mathematician</title></customer>
SQL>
SQL> SELECT t.dt.getclobval()
2 FROM testxml t
3 WHERE ROWNUM < 2
4 /
T.DT.GETCLOBVAL()
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<customer>
<name>Joe Smith</name>
<title>Mathematician</title>
</customer>
SQL>
SQL> drop table testxml;
Table dropped.
SQL>
SQL>
Retrieve value from SYS.XMLTYPE column
SQL> CREATE TABLE testxml (id NUMBER(3), dt SYS.XMLTYPE);
Table created.
SQL>
SQL>
SQL> INSERT INTO testxml VALUES(111,
2 sys.xmltype.createxml(
3 '<?xml version="1.0"?>
4 <customer>
5 <name>Joe Smith</name>
6 <title>Mathematician</title>
7 </customer>'))
8 /
1 row created.
SQL>
SQL> SET LONG 2000
SQL>
SQL> SELECT *
2 FROM testxml
3 /
ID DT
------------------------------------------------------------------------------------------------------------
111 <?xml version="1.0"?><customer><name>Joe Smith</name><title>Mathematician</title></customer>
SQL>
SQL>
SQL> SELECT *
2 FROM testxml t
3 WHERE t.dt.getclobval() LIKE '%Joe%'
4 /
ID DT
------------------------------------------------------------------------------------------------------
111 <?xml version="1.0"?><customer><name>Joe Smith</name><title>Mathematician</title></customer>
SQL>
SQL> drop table testxml;
Table dropped.
SQL>
SQL>
Individual fields from the XMLTYPE'd column may be found using the EXTRACTVALUE function like this:
SQL>
SQL>
SQL> --EXTRACTVALUE is an Oracle function that uses an XPath expression,
SQL>
SQL> CREATE TABLE testxml (id NUMBER(3), dt SYS.XMLTYPE);
Table created.
SQL>
SQL>
SQL> INSERT INTO testxml VALUES(111,
2 sys.xmltype.createxml(
3 '<?xml version="1.0"?>
4 <customer>
5 <name>Joe Smith</name>
6 <title>Mathematician</title>
7 </customer>'))
8 /
1 row created.
SQL>
SQL> SET LONG 2000
SQL>
SQL> SELECT *
2 FROM testxml
3 /
ID DT
----------------------------------------------------------------------------------------------------
111 <?xml version="1.0"?><customer><name>Joe Smith</name><title>Mathematician</title></customer>
SQL>
SQL> select EXTRACTVALUE(t.dt,'//customer/name') from testxml t;
EXTRACTVALUE(T.DT,'//CUSTOMER/NAME')
-----------------------------------------------------------------------------------------
Joe Smith
SQL>
SQL>
SQL> drop table testxml;
Table dropped.
SQL>
SQL>
Creation of tables using XMLType data type and set the xml schema
SQL>
SQL> CREATE TABLE xml_or (
2 id NUMBER PRIMARY KEY,
3 doc XMLTYPE)
4 XMLTYPE doc STORE AS OBJECT RELATIONAL
5 XMLSCHEMA "http://127.0.0.1/xdoc.xsd"
6 ELEMENT "doc"
7 /
Insert xml document to a XMLType column with xmltype function
SQL> CREATE TABLE myTable(
2 id NUMBER PRIMARY KEY,
3 emps XMLType NOT NULL
4 );
Table created.
SQL>
SQL> INSERT INTO myTable VALUES (1, xmltype('<?xml version="1.0" standalone="no"
?>
2 <emps>
3 <emp>
4 <home_address>address 1</home_address>
5 </emp>
6 </emps>')
7 );
1 row created.
SQL>
SQL>
SQL> select extract(emps, '/emps/emp/home_address/text()' )
2 from myTable
3 /
EXTRACT(EMPS,'/EMPS/EMP/HOME_ADDRESS/TEXT()')
------------------------------------------------------
address 1
1 row selected.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.
SQL>
SQL>
SQL>
PL/SQL ability to access text within an XML document in the database
SQL> CREATE TABLE myTable
2 (id NUMBER PRIMARY KEY
3 ,doc XMLType NOT NULL)
4 XMLTYPE doc STORE AS CLOB
5 /
Table created.
SQL>
SQL>
SQL>
SQL> DECLARE
2 v_doc XMLType;
3 v_text varchar2(100);
4 BEGIN
5 select doc into v_doc from myTable
6 where id = 2;
7
8 v_text := v_doc.extract('/message/body/text()' ).getstringval;
9
10 dbms_output.put_line(v_text);
11 END;
12 /
SQL>
SQL> drop table myTable;
Table dropped.
SQL>
Query xmltype column
SQL> create table myTable(
2 id number(9),
3 myValue xmltype
4 );
Table created.
SQL> begin
2 dbms_xmlschema.registerSchema ('http://d.com/myType.xsd',xdbURIType('/xsd/myType.xsd').getClob(),True,True,False,True);
3 end;
4 /
SQL>
SQL> insert into myTable values (67, XMLTYPE('<myType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://d.com/myType.xsd">
2 <value1>1</value1>
3 <value2>2</value2>
4 </myType>'))
5 /
1 row created.
SQL>
SQL> select * from myTable;
emp
Number
------
MYVALUE
------------------------------------------------------
67
<myType xmlns:xsi="http://www.w3.org/2001/XMLSchema-in
stance" xsi:noNamespaceSch
1 row selected.
SQL>
SQL> drop table myTable;
Table dropped.
Store an XMLType type data in clob
SQL> CREATE TABLE myTable
2 (myID NUMBER PRIMARY KEY,
3 myValue XMLTYPE )
4 XMLTYPE myValue STORE AS CLOB
5 /
Table created.
SQL>
SQL> drop table myTable;
Table dropped.
SQL>
SQL>
Use value function with single xmltype table
SQL> create table myTable of xmltype;
Table created.
SQL>
SQL> insert into myTable values(XMLTYPE('
2 <customer>
3 <name>Chris</name>
4 <telephone>123 555-1234</telephone>
5 </customer>'))
6 /
1 row created.
SQL>
SQL> select * from myTable;
SYS_NC_ROWINFO$
------------------------------------------------------
<customer>
<name>Chris</name>
<telephone>123 555-1234</telephone>
</
1 row selected.
SQL>
SQL> update myTable c
2 set value(c) = updateXML(value(c), '/customer/name/text()','new value')
3 /
1 row updated.
SQL>
SQL>
SQL> select extractvalue(value(c),'/customer/telephone')
2 from myTable c
3 where existsnode(value(c),'/customer/name = "Chris"') = 1
4 /
no rows selected
SQL>
SQL> drop table myTable;
Table dropped.
SQL>
Use xmltype to convert xml string to xmltype data
SQL>
SQL>
SQL> CREATE TABLE myTable(
2 id NUMBER PRIMARY KEY,
3 emps XMLType NOT NULL
4 );
Table created.
SQL>
SQL> INSERT INTO myTable VALUES (1, xmltype('<?xml version="1.0" standalone="no"
?>
2 <emps>
3 <emp>
4 <home_address>address 1</home_address>
5 </emp>
6 </emps>')
7 );
1 row created.
SQL>
SQL>
SQL> select extract(emps, '/emps/emp/home_address/text()' )
2 from myTable
3 /
EXTRACT(EMPS,'/EMPS/EMP/HOME_ADDRESS/TEXT()')
------------------------------------------------------
address 1
1 row selected.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.
SQL>
SQL>