Leviter XML DB

Download as pdf or txt
Download as pdf or txt
You are on page 1of 60

A Hitchhhikers Guide Integrating Oracle

XML DB
with 11gR2 and SQL Developer 3.2.2
Coleman Leviter, OCP
Arrow Electronics
IT Software Systems Engineer
cleviter@ieee.org

NYOUG

Good Housekeeping
Cell phones AUDIBLE
Conversation INSIDE
Enjoy the presentation

NYOUG

Wanted
Speakers

NYOUG

CV
-

NYOUG

WMS Group Fifteen years


VAX Rewrite (.for ) to UNIX (.c, .pc)
VAX Forms to Oracle Forms
TIFF file migration to Oracle
XML Development
WMS Development and Support
IOUG Select Contributor
ODTUG Journal
IOUG Quick Tips
NYOUG WEB SIG Chair, Steering Committee
Oracle Open World
IOUG Conference Committee
IOUG Board of Directors

XML Xpath Terminology


XPath is a language for finding information in an XML document. XPath is
used to navigate through elements and attributes in an XML document. The
primary purpose of XPath is to address parts of an XML document.

Shred or extract parts of an XML Document


The XML representation of schema components uses a vocabulary identified
by the namespace name http://www.w3.org/2001/XMLSchema. For brevity,
the text and examples in this specification use the prefix xs: to stand for this
namespace; in practice, any prefix can be used.
//author - All <author> elements in the document.
author/* - All elements that are the children of <author> elements.
author[1] The first <author> element in the current context node.
author[first-name][3] - The third <author> element that has a <first-name>
child.
my:book - The <book> element from the my namespace.
NYOUG

XML Xpath (shredding) Terminology


EXTRACT(XMLTYPE_instance,XPath_string) or
EXTRACT(XMLTYPE_instance,XPath_string, namespace_string)
EXTRACT (XML) - It applies a VARCHAR2 XPath string and returns an
XMLType instance containing an XML fragment. You can specify an absolute
XPath_string with an initial slash or a relative XPath_string by omitting the
initial slash. If you omit the initial slash, the context of the relative path
defaults to the root node. The optional namespace_string must resolve to a
VARCHAR2 value that specifies a default mapping or namespace mapping
for prefixes, which Oracle Database uses when evaluating the XPath
expression(s).

getClobVal() - Returns a CLOB containing an XML document based on the


contents of the XMLType.

XMLTYPE (CLOB) constructor; convert properly formed CLOB to


XMLTYPE, raises an exception
Oracle9i has a dedicated XML datatype called XMLTYPE. It is made up of a
CLOB to store the original XML data and a number of member functions to
make the data available to SQL.
NYOUG

XPATH Terminology
VALUE takes as its argument a correlation variable (table alias)
associated with a row of an object table and returns object
instances stored in the object table. The type of the object
instances is the same type as the object table.

Table functions are functions that produce a collection of rows


(either a nested table or a varray) that can be queried like a
physical database table or assigned to a PL/SQL collection
variable. You can use a table function like the name of a
database table, in the FROM clause of a query, or like a column
name in the SELECT list of a query.

NYOUG

XPATH Terminology
XMLSEQUENCE - XMLSEQUENCE(XMLTYPE_instance)
XMLSEQUENCE operator is used to split multi-value results from
XMLTYPE queries into multiple rows.

The first form takes as input an XMLType instance and returns a


varray of the top-level nodes in the XMLType. This form is effectively
superseded by the SQL/XML standard function XMLTable, which
provides for more readable SQL code. Prior to Oracle Database 10g
Release 2, XMLSequence was used with SQL function TABLE to do
some of what can now be done better with the XMLTable function.

Because XMLSequence returns a collection of XMLType, you can use


this function in a TABLE clause to unnest the collection values into
multiple rows, which can in turn be further processed in the SQL
query.
NYOUG

Xpath Expression Syntax


XML Document (fully qualified)
<?xml version="1.0" encoding="UTF-8"?> <! XML Declaration-->
<root>
<parent>
<child>robot</child>
<child>ball</child>
</parent>
<parent>
<child>airplane</child>
<child>ipod</child>
</parent>
</root>
Expression
Refers to
parent/child[1]
The first <child> of each <parent>.
(parent/child)[1]
The first <child> from the entire set of children of <parent> elements.
parent[1]/child[2]
The second <child> of the first <parent>.
parent/*
All elements that are the children of <parent> elements.

NYOUG

Namespaces Definition
Why Namespaces http://www.w3.org/TR/REC-xml-names/
Such documents, containing multiple markup vocabularies, pose problems of
recognition and collision. Software modules need to be able to recognize the
elements and attributes which they are designed to process, even in the face
of "collisions" occurring when markup intended for some other software
package uses the same element name or attribute name.
These considerations require that document constructs should have names
constructed so as to avoid clashes between names from different markup
vocabularies. This specification describes a mechanism, XML namespaces,
which accomplishes this by assigning expanded names to elements and
attributes.

So, in simple terms, its a technique to distinguish two elements with the
same names from each other.
The technique allows one to import (or define) another fully qualified XML
document into an existing one without causing an element name collision.
NYOUG

10

XML Namespace Terms


XML Namespaces - The xmlns Attribute
When using prefixes in XML, a so-called namespace for the prefix
must be defined.

The namespace is defined by the xmlns attribute in the start tag of an


element.
The namespace declaration has the following syntax.
xmlns:prefix="URI".

A Uniform Resource Identifier (URI) is a string of characters which


identifies an Internet Resource.
The most common URI is the Uniform Resource Locator (URL) which
identifies an Internet domain address.

NYOUG

11

SQL XML Query (SQLX) Terminology

Create an SQL XML query


Defined by ISO/IEC 9075-14:2003 1
XMLAGG() is an aggregate function. It takes a collection of XML

NYOUG

fragments and returns an aggregated XML document.


XMLELEMENT() takes an element name for identifier, an optional
collection of attributes (XMLATTRIBUTES) for the element, and
arguments that make up the content of the element
XMLFOREST() converts each of its argument parameters to
XML, and then returns an XML fragment that is the concatenation
of these converted arguments.
ISO/IEC 9075-14:2003 defines ways in which Database
Language SQL can be used in conjunction with XML. It defines
ways of importing and storing XML data in an SQL database,
manipulating it within the database and publishing both XML and
conventional SQL-data in XML form

12

SQLX Examples Table Contents

(1_1)

SQL> select * from myobject;


THINGS
-----------BALL
KEY
TABLE
FRISBEE
BBQ
SWITCH

QUANTITY PARENT
--------------- -----------2
1
3
1
1
1
4
2
1
2
6
2

6 rows selected.
NYOUG

13

SQLX - XMLELEMENT Example

(1_2)

XMLELEMENT() takes an element name for identifier, an optional collection


of attributes for the element, and arguments that make up the content of the
element
1 SELECT XMLELEMENT("thing", XMLATTRIBUTES( obj.quantity AS
"QTY"), obj.things )
2 AS "Object_list"
3* FROM myobject obj
SQL> /
Object_list
-------------------------------------------------------------------------------------------------------<thing QTY="2">BALL</thing>
<thing QTY="3">KEY</thing>
<thing QTY="1">TABLE</thing>
<thing QTY="4">FRISBEE</thing>
<thing QTY="1">BBQ</thing>
<thing QTY="6">SWITCH</thing>
6 rows selected.
NYOUG

14

SQLX - XMLFOREST Example

(1_3)

XMLFOREST() converts each of its argument parameters to XML, and then


returns an XML fragment that is the concatenation of these converted
arguments.
SQL> SELECT XMLFOREST(obj.quantity, obj.things) "Object_list"
2 FROM myobject obj;
Object_list
--------------------------------------------<QUANTITY>2</QUANTITY><THINGS>BALL</THINGS>
<QUANTITY>3</QUANTITY><THINGS>KEY</THINGS>
<QUANTITY>1</QUANTITY><THINGS>TABLE</THINGS>
<QUANTITY>4</QUANTITY><THINGS>FRISBEE</THINGS>
<QUANTITY>1</QUANTITY><THINGS>BBQ</THINGS>
<QUANTITY>6</QUANTITY><THINGS>SWITCH</THINGS>
6 rows selected.
NYOUG

15

Prettyprint or Indenting

Formatting Convention for Output


XML Parent Child Relationship
Changes from 10g, 11gR1, 11gR2
SELECT XMLSERIALIZE ( DOCUMENT -line one
(<XML_Document>)
AS CLOB indent ) [<alias>] from dual; -line three
NYOUG

16

SQLX - XMLAGG Example

(1_4_3) (Pretty Print)

XMLAGG() is an aggregate function. It takes a collection of XML


fragments and returns an aggregated XML document.
1 SELECT XMLELEMENT("OBJECT",
XMLAGG(XMLELEMENT("Things",
2 obj.things ||' '||obj.quantity ) ORDER BY obj.things)) AS "Object_list"
3 FROM myobject obj
SQL> /
Object_list
------------------------------------------------------------------------<OBJECT><Things>BALL 2</Things><Things>BBQ 1</Things>
<Things>FRISBEE 4</Things><Things>KEY
3</Things><Things>SWITCH 6</Things><Things>TABLE
1</Things></OBJECT>

NYOUG

17

XML Document TOAD OUT

NYOUG

18

XML SQL Developer OUT

NYOUG

19

SQLX Example XMLAGG, XMLATTRIBUTES, Namespace


DECLARE
lcl_obj1

CLOB; lcl_obj2

(1_5)

CLOB; lcl_full_xml CLOB;

BEGIN
SELECT XMLTYPE.getclobval(XMLELEMENT("obj1:object",
xmlagg(xmlelement("obj1:thing",obj.things) )) )
INTO lcl_obj1 FROM myobject obj WHERE obj.parent = '1';
SELECT XMLTYPE.getclobval(XMLELEMENT("obj2:object",
XMLATTRIBUTES ('http://www.w3.org/2001/XMLSchema/obj_2' AS "xmlns:obj2"), /* obj2 */
XMLAGG(xmlelement("obj2:thing",obj.things) ) ) )
INTO lcl_obj2 FROM myobject obj WHERE obj.parent = '2';
SELECT ( '<?xml version="1.0" encoding="UTF-8"?>' ||
'<ns1:object_group
xmlns:ns1="http://www.w3.org/2001/XMLSchema/sample_namespace_1"
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">'||
lcl_obj1|| lcl_obj2|| '</ns1:object_group>' )
dbms_output.put_line(lcl_full_xml);
END;

NYOUG

INTO lcl_full_xml

/* obj1 */

FROM dual;
20

XML Namespace Example table contents or in-line

(1_6_1)

Table: my_xml_table;

Column: xmlcol
XMLTYPE
Column: ref_id
NUMBER
<?xml version="1.0" encoding="UTF-8"?>
<ns1:object_group xmlns:ns1="http://www.w3.org/2001/XMLSchema/sample_namespace_1"
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">

<obj1:object>
<obj1:thing>ball</obj1:thing>
<obj1:thing>key</obj1:thing>
<obj1:thing>table</obj1:thing>
</obj1:object>
<obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
<obj2:thing>frisbee</obj2:thing>
<obj2:thing>bbq</obj2:thing>
<obj2:thing>switch</obj2:thing>

</obj2:object>
</ns1:object_group>

NYOUG

21

XML XPath Cursor - obtain each row

(1_7)

DECLARE
-- Cursor for parsing objects_group XML
CURSOR obj_cur
IS
SELECT EXTRACT (VALUE
(entire_things),'//*','xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getstringval() AS lcl_thing
FROM my_xml_table mxt,
TABLE(xmlsequence(extract(mxt.xmlcol,
'//obj1:thing','xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"'))) entire_things
WHERE mxt.ref_id = 1;
BEGIN
FOR obj_row IN obj_cur
LOOP
dbms_output.put_line('each element thing '|| obj_row.lcl_thing );
END LOOP;
END anonymous_block ;
each element thing <obj1:thing xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">ball</obj1:thing>
each element thing <obj1:thing xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">key</obj1:thing>
each element thing <obj1:thing xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">table</obj1:thing>
PL/SQL procedure successfully completed.

NYOUG

22

XPath all data merged

(1_8)

DECLARE
-- Cursor for parsing objects_group XML
CURSOR obj_cur
IS
SELECT EXTRACT (VALUE (entire_things),'//*/text()').getstringval () AS
lcl_thing
FROM my_xml_table mxt,
table(xmlsequence(extract(mxt.xmlcol, '*'))) entire_things
WHERE mxt.ref_id = 1;
BEGIN
FOR obj_row IN obj_cur LOOP
dbms_output.put_line('each element thing '|| obj_row.lcl_thing );
END LOOP;
END anonymous_block ;
SQL> /
each element thing ballkeytablefrisbeebbqswitch
PL/SQL procedure successfully completed.

NYOUG

23

XML Shredding (XPATH) Example

(1_9)

XML Document
<objects>
<thing>ball</thing>
<thing>key</thing>
<thing>table</thing>
</objects>

--------------------------------------------------------------------- SQLX (XML Query Xpath)


Select value(tab).extract('/*').getStringVal() "This Column"
from table ( XMLSequence(extract (
XMLType('<objects><thing>ball</thing><thing>key</thing><thing>table</thing></objects>'),'/obje
cts/*') ) ) tab;
--------------------------------------------------------------------- Results
This Column
--------------------<thing>ball</thing>

<thing>key</thing>
<thing>table</thing>

NYOUG

24

XPath Shredding Deux

(1_10)

XML Document
<objects>
<thing>ball</thing>

<thing>key</thing> extract this data item


<thing>table</thing>
</objects>
========================================
SQLX (XML Query)

select value(tab).extract('/objects/thing[2]/text()').getStringVal() "This Column"


from table ( XMLSequence(extract (
XMLType('<objects><thing>ball</thing><thing>key</thing><thing>table</thing></objects>'),'*')
) tab;

========================================
Results
This Column
---------------------------------------------------------------------key

NYOUG

25

XML Xpath Shredding Namespace Failure 1

(1_11)

SQL> select
value(tab).extract('//obj2:thing/text()','xmlns:obj1="http://www.w3.org/2001/XMLSchem
a/obj_1"').getStringVal() "This_Column",
value(tab).extract('//obj1:thing/text()','xmlns:obj1="http://www.w3.org/2001/XMLSchem
a/obj_1"').getStringVal() "That_Column"

3 from table ( XMLSequence(extract


4 (XMLType('<?xml version="1.0" encoding="UTF-8"?><ns1:object_group
xmlns:ns1="http://www.w3.org/2001/XMLSchema/sample_namespace_1"
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">
5 <obj1:object><obj1:thing>ball</obj1:thing><obj1:thing>key</obj1:thing>
6 <obj1:thing>table</obj1:thing></obj1:object>
7 <obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
8 <obj2:thing>frisbee</obj2:thing>
9 <obj2:thing>bbq</obj2:thing>
10 <obj2:thing>switch</obj2:thing>
11 </obj2:object>
12 </ns1:object_group>'),'*') ) ) tab;
NYOUG

26

XML Xpath Shredding Namespace Failure 2


select

(1_11)

value(tab).extract('//obj2:thing/text()',

'xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getStringVal()
"This_Column",

*
ERROR at line 1:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing

LPX-00601: Invalid token in: '//obj2:thing/text() ob2 <>


ob1
ORA-06512: at "SYS.XMLTYPE", line 119
NYOUG

27

XML XPath Shredding 1 data combined

(1_12)

1 select
value(tab).extract('//obj1:thing/text()','xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getStringVal()
"This_Column",
value(tab).extract('//obj1:thing/text()','xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getStringVal()
"That_Column"
3 from table ( XMLSequence(extract
4 (XMLType('<?xml version="1.0" encoding="UTF-8"?><ns1:object_group
xmlns:ns1="http://www.w3.org/2001/XMLSchema/sample_namespace_1"
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">
5 <obj1:object><obj1:thing>ball</obj1:thing><obj1:thing>key</obj1:thing>
6 <obj1:thing>table</obj1:thing></obj1:object>
7 <obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
8 <obj2:thing>frisbee</obj2:thing>
9 <obj2:thing>bbq</obj2:thing>
10 <obj2:thing>switch</obj2:thing>
11 </obj2:object>
12* </ns1:object_group>'),'*')

NYOUG

) ) tab

28

XML XPath Shredding 2 data combined

(1_12)

SQL> col this_column format a20;


SQL> col that_column format a20;
SQL> /
This_Column

That_Column

-------------------- -------------------ballkeytable

NYOUG

ballkeytable

29

XML Example 1

(1_13)

select value(tab).extract('//obj1:thing/text()',
'xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getStringVal()
"This_Column",
value(tab).extract('//obj2:thing/text()',
'xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2"').getStringVal()
"That_Column"
4

from

table ( XMLSequence(extract

(XMLType('<?xml version="1.0" encoding="UTF-8"?><ns1:object_group


xmlns:ns1="http://www.w3.org/2001/XMLSchema/sample_namespace_1"
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">
<obj1:object><obj1:thing>ball</obj1:thing><obj1:thing>key</obj1:thing>
7

<obj1:thing>table</obj1:thing></obj1:object>
<obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">

<obj2:thing>frisbee</obj2:thing>

10

<obj2:thing>bbq</obj2:thing>

11

<obj2:thing>switch</obj2:thing>

12

</obj2:object>

13* </ns1:object_group>'),'*')

NYOUG

) tab

30

XML Example 2

(1_13)

SQL> /
This_Column

That_Column

-----------------

--------------------

ballkeytable

frisbeebbqswitch

NYOUG

31

XML Xpath 1 all data together

(1_14_2)

SQL> select
value(tab).extract('//*/text()','xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getStringV
al() "This_Column",
value(tab).extract('//obj2:thing/text()','xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2"').g
etStringVal() "That_Column"
3 from table ( XMLSequence(extract

4 (XMLType('<?xml version="1.0" encoding="UTF-8"?>


5 <ns1:object_group xmlns:ns1="http://www.w3.org/2001/XMLSchema/sample_namespace_1"
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">
<obj1:object><obj1:thing>ball</obj1:thing><obj1:thing>key</obj1:thing>
7 <obj1:thing>table</obj1:thing></obj1:object>
8 <obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
9 <obj2:thing>frisbee</obj2:thing>
10 <obj2:thing>bbq</obj2:thing>
11 <obj2:thing>switch</obj2:thing>
12 </obj2:object>

13 </ns1:object_group>'),'/*')

NYOUG

) ) tab;

32

XML Xpath 2 all data together


This_Column

(1_14_2)

That_Column

---------------------------------------- ---------------------------------------ballkeytablefrisbeebbqswitch frisbeebbqswitch

NYOUG

33

Xpath 1 extract data

(1_15)

SQL> select
value(tab).extract('//obj1:thing[2]/text()','xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getSt
ringVal()"This_Column",
value(tab).extract('//obj2:thing/text()','xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2"').getStrin
gVal() "That_Column"
3 from table ( XMLSequence(extract
4 (XMLType('<?xml version="1.0" encoding="UTF-8"?>

5 <ns1:object_group xmlns:ns1="http://www.w3.org/2001/XMLSchema/sample_namespace_1"
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">
6 <obj1:object><obj1:thing>ball</obj1:thing><obj1:thing>key</obj1:thing>
7 <obj1:thing>table</obj1:thing></obj1:object>
8 <obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
9 <obj2:thing>frisbee</obj2:thing>
10 <obj2:thing>bbq</obj2:thing>
11 <obj2:thing>switch</obj2:thing>
12 </obj2:object>
13 </ns1:object_group>'),'/*')

NYOUG

) ) tab;
34

Xpath 2 extract data

(1_15)

SQL> col this_column format a40;


SQL> col that_column format a40;
This_Column

That_Column

---------------------------------------- ---------------------------------------key

NYOUG

frisbeebbqswitch

35

Xpath Parsing Error 1

(1_16_3)

SELECT extract(value(t), '//text()').getStringVal() AS


obj_examp
FROM my_xml_table mxt,
TABLE(xmlsequence(extract(mxt.xmlcol, '*'))) t
WHERE mxt.ref_id = 1

OBJ_EXAMP
---------------------------------------ballkeytablefrisbeebbqswitch

NYOUG

36

Xpath Parsing Error 2

(1_16_3)

SELECT extract(value(t), '//obj1:thing/text()').getStringVal() AS


obj_examp
FROM my_xml_table,
table(xmlsequence(extract(xmlcol, '*'))) t
WHERE ref_id = 1
SELECT extract(value(t), '//obj1:thing/text()').getStringVal() AS
obj_examp
*
ERROR at line 1:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00601: Invalid token in: '//obj1:thing/text() namespace
definition undefined
NYOUG

37

XML XPATH no unique elements

(1_17)

SELECT extract(value(t),'//obj1:thing/text()',
'xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').getStringV
al() AS obj_example
FROM my_xml_table,
table(xmlsequence(extract(xmlcol, '*'))) t
WHERE ref_id = 1

OBJ_EXAMPLE
---------------------ballkeytable

NYOUG

38

XML XPATH 1 parse each element, using table

(1_18)

DECLARE

-- Cursor for parsing objects_group XML


CURSOR obj_cur
IS

SELECT EXTRACT (VALUE (entire_things),'//obj1:thing/text()',


'xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').
getstringval() AS lcl_thing
FROM my_xml_table,

TABLE(xmlsequence(extract(xmlcol, '//obj1:thing', -- data


xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"')))
entire_things
WHERE ref_id = 1;
NYOUG

39

XML XPATH 2 parse each element, using table

(1_18)

BEGIN

FOR obj_row IN obj_cur LOOP


dbms_output.put_line
('each element thing '|| obj_row.lcl_thing );

END LOOP;
END anonymous_block ;
each element thing ball

each element thing key


each element thing table

NYOUG

40

UPDATEXML 1st

(1_19_2)

SQL> describe my_xml_table;


Name
Null?
Type
------------------------REF_ID
NUMBER
XMLCOL
XMLTYPE
select xmlcol from my_xml_table where ref_id = 1;
XMLCOL
-------------------------------------------------------------------------------<?xml version="1.0" encoding="UTF-8"?>
<ns1:object_group xmlns:ns1=http://www.w3.org/2001/XMLSchema/sample_namespace_1
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">
<obj1:object>
<obj1:thing>ball</obj1:thing>
<obj1:thing>key</obj1:thing>
<obj1:thing>table</obj1:thing>
</obj1:object>
<obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
<obj2:thing>frisbee</obj2:thing>
<obj2:thing>bbq</obj2:thing>
<obj2:thing>switch</obj2:thing>
</obj2:object>
</ns1:object_group>

NYOUG

41

UPDATEXML 1 2nd

(1_19_2)

SQL> UPDATE my_xml_table mxt


SET mxt.xmlcol = UPDATEXML(mxt.xmlcol,
'//obj2:thing[1]/text()','FRISBEE',
'xmlns:obj2=
"http://www.w3.org/2001/XMLSchema/obj_2"')
WHERE mxt.ref_id = 1;
1 row updated.

-- CHANGE TO CAPS

NYOUG

42

UPDATEXML 2 2nd

(1_19_2)

select xmlcol from my_xml_table where ref_id = 1;


XMLCOL
-------------------------------------------------------------------------------<?xml version="1.0" encoding="UTF-8"?>
<ns1:object_group xmlns:ns1=http://www.w3.org/2001/XMLSchema/sample_namespace_1
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">
<obj1:object>
<obj1:thing>ball</obj1:thing>
<obj1:thing>key</obj1:thing>
<obj1:thing>table</obj1:thing>
</obj1:object>
<obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
<obj2:thing>FRISBEE</obj2:thing>
<obj2:thing>bbq</obj2:thing>
<obj2:thing>switch</obj2:thing>
</obj2:object>
</ns1:object_group>
===========================================

NYOUG

43

XML XPATH 1 parse each element, w/o table

(1_20)

-- Anonymous Block
DECLARE

-- Cursor for parsing object_group XML


CURSOR obj_cur
IS SELECT EXTRACT (VALUE (entire_things),
'//obj1:thing/text()',
'xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"').
getstringval() AS lcl_thing
FROM TABLE ( XMLSequence(
extract (XMLType('<?xml version="1.0" encoding="UTF-8"?>
<ns1:object_group xmlns:ns1=
http://www.w3.org/2001/XMLSchema/sample_namespace_1
xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1">

NYOUG

44

XML XPATH 2 parse each element, w/o table

(1_20)

<obj1:object>
<obj1:thing>ball</obj1:thing>
<obj1:thing>key</obj1:thing>
<obj1:thing>table</obj1:thing>
</obj1:object>
<obj2:object xmlns:obj2="http://www.w3.org/2001/XMLSchema/obj_2">
<obj2:thing>frisbee</obj2:thing>
<obj2:thing>bbq</obj2:thing>
<obj2:thing>switch</obj2:thing>
</obj2:object>
</ns1:object_group>'),
'//obj1:thing','xmlns:obj1="http://www.w3.org/2001/XMLSchema/obj_1"' )
entire_things;

NYOUG

) )

45

XML XPATH 3 parse each element, w/o table

(1_20)

BEGIN

FOR obj_row IN obj_cur LOOP


dbms_output.put_line('each element thing '||
obj_row.lcl_thing );
END LOOP;
END anonymous_block;
SQL> /
each element thing ball
each element thing key
each element thing table
PL/SQL procedure successfully completed.
NYOUG

46

Oracle Text - XML Data Queries

(1_21)

Definitions
contains operator is used when index is of type
context

returns a relevance score for every row selected


select ref_id,score (1) , xmlcol
from my_xml_table
where contains (xmlcol, 'table',1) > 0

Demo
NYOUG

47

DBMS_XML.CONVERT

(1_22_3)

DBMS_XMLGEN.CONVERT converts XML data into the


escaped or unescapes
XML equivalent

Example: the escaped form of the character > (without the


characters) is &gt;
(without the characters).

Oracles suggested workaround was to:


1) append a space (CHR(32) to the end of the XPath string,
then
2) DBMS_XMLGEN.CONVERT the string, finally
3) TRIM the string. The workaround resolved the issue.
NYOUG

48

DBMS_XMLDOM

(1_23)

Parse using XPath define expression


A whole heap of Metadata
<?xml version="1.0" encoding="WINDOWS-1252"?>
<StandardHeader>
<DateTime>12/08/2010 16:03:46</DateTime>
<PacketNumber>1</PacketNumber>
<AnyMorePackets>Y</AnyMorePackets>
<TotalPackets>4</TotalPackets>
<house>
<room>
<room_name name="kitchen"/>
<room_item item="sink"/>
</room>
|
|
|
<room>
<room_name name="kitchen"/>
<room_item item="table"/>
</room>
<house>
</StandardHeader>

NYOUG

49

DBMS_XMLDOM

(1_24) (contd)

Change XML and reduce metadata


<?xml version="1.0" encoding="WINDOWS-1252"?>
<StandardHeader>
<DateTime>12/08/2010 16:03:46</DateTime>
<PacketNumber>1</PacketNumber>
<AnyMorePackets>Y</AnyMorePackets>
<TotalPackets>4</TotalPackets>
<house>
<room room_name="kitchen" room_item="sink"/>
<room room_name="kitchen" room_item="table"/>
<room room_name="kitchen" room_item="counter"/>
<room room_name="kitchen" room_item="microwave"/>
<room room_name="kitchen" room_item="oven"/>
<room room_name="kitchen" room_item="range"/>
<room room_name="kitchen" room_item="refrigerator"/>
<room room_name="living_room" room_item="pictures"/>
<room room_name="living_room" room_item="chair"/>
<room room_name="living_room" room_item="pictures"/>
<room room_name="living_room" room_item="HDTV"/>
<room room_name="living_room" room_item="couch"/>
<room room_name="living_room" room_item="chandelier"/>
<room room_name="den" room_item="surround_sound"/>
<room room_name="den" room_item="fireplace"/>
<room room_name="den" room_item="table"/>
<room room_name="den" room_item="chair"/>
<room room_name="den" room_item="lamp"/>
<room room_name="den" room_item="tagre"/>
<room room_name="den" room_item="HDTV"/>
</house>
</StandardHeader>

NYOUG

50

XML Packet Creation


CLOB < 32 K
XML Document > 32K
XML Header
CLOB

XML Header
CLOB

XML Header
pl/sql

CLOB

XML Header
CLOB

XML Header
CLOB

NYOUG

51

XML Document Construction


CLOB < 32 K
XML Document > 32K

XML Header
CLOB

XML Header
CLOB

XML Header

pl/sql

CLOB

XML Header
CLOB

XML Header
CLOB

NYOUG

52

XML Packet Creation


XML Packet < 32 K
XML Document > 32K
XML Packet 1

XML Packet 2
pl/sql
Limit
Data
Per
Packet

XML Packet 3

XML Packet 4

XML Packet n

NYOUG

53

XML Document Construction


XML Packet < 32 K

`
XML Packet 1

XML Document > 32K

XML Packet 2

XML Packet 3

pl/sql

XML Packet 4

XML Packet 5

NYOUG

54

XQUERY

(example)

SELECT xmlquery('xs:integer("12") 'returning content ) aa from dual


SELECT xmlquery('
for $i in ora:view("my_relat_table") return $i'
returning content) from dual
SELECT XMLQUERY(' (: run statement SQL Developer :)
<result>{
for $i in ora:view("my_relat_table") return $i
}</result>'
returning content) aa from dual
SELECT XMLQUERY(' (: run statement SQL Developer :)
<result>{
for $i in ora:view("my_relat_table")
where $i/ROW/NAME eq "kitchen"
return $i

}</result>'
returning content) aa from dual

NYOUG

55

Bonus
This presentation
LibreOffice The Document Foundation
Vers 4.0.0.3
Website: http://www.libreoffice.org/#0

Sql Developer 3.2.2 Cloud Connections

NYOUG

56

References 1
Design Tools: XMLSPY 30 day free trial
http://www.altova.com/
Oracle XML DB Docs: full implementation plus extensions of XML
http://www.oracle.com/technetwork/database/features/xmldb/index.html

Oracles SQL 11g Doc


http://www.oracle.com/pls/db111/homepage
Oracle Database 11g XML & SQL Oracle Press

Wikipedia.com (xpath, xml, xmlelement, etc.)


Overview XML Constructs
http://www.oradev.com/xml_functions.jsp
NYOUG

57

References 2
W3.org
W3schools.com

Oracle Database 10g XML & SQL: Design, Build, & Manage XML
Applications in Java, C, C++, & PL/SQL (Osborne ORACLE Press
Series) (Paperback) by Mark Scardina (Author), Ben Chang
(Author), Jinyu Wang (Author)
http://docs.oracle.com/javase/tutorial/reallybigindex.html
iso.org
Sql Developer 3.2.2 - 12c Database Support

http://www.oracle.com/technetwork/developer-tools/sqldeveloper/sqldev-newfeatures32-1731840.html
NYOUG

58

Please Note
Speaker: Coleman Leviter
Topic: A HitchhikersGuide Integrating Oracle XML DB with
11gR2 and SQL Developer 3.2.2

Contact:
cleviter@ieee.org

Please enter NYOUG in the subject line

NYOUG

59

Questions

NYOUG

60

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy