Bewährt und vielfach im Einsatz: Oracle XML DB

Werbung
<Insert Picture Here>
Bewährt und vielfach im Einsatz: Oracle XML DB
Carsten Czarski
Oracle Deutschland B.V. & Co KG
Oracle XML DB
Kurzprofil
• XML und SQL in einer Datenbank
• Standardkonform (W3C, SQL:2003...)
• XML/SQL
• XQuery
• XML Schema, DOM
• Verfügbar ab Oracle 9i Release 2
• Alle Datenbankeditionen
• Keine zusätzliche Installation erforderlich
Oracle XML DB
Oracle XML DB
XQuery
XPath
SQL
Transformationen
XML- Sichten
SQL*Net
HTTP / WebDAV
FTP
Recherchen
Relationale Sichten
XML DB Installation
Ab Oracle12c ist
die XML DB immer
installiert.
•
Überprüfen ob Funktionalität installiert
SQL> select comp_id, version from dba_registry where comp_id='XDB';
COMP_ID
VERSION
------------------------------ -----------------------------XDB
12.1.0.1.0
•
Falls Funktionalität nicht installiert
1. XML DB Repository installieren mit
$ORACLE_HOME/rdbms/admin/catqm.sql
2. Bei Bedarf: HTTP- und FTP-Listener aktivieren
DBMS_XDB.SETFTPPORT
DBMS_XDB.SETHTTPPORT
Oracle XML DB
Entwicklung der Funktionalität
Oracle12c
XML DB
• XQuery Update und FullText
Oracle11g
• Replication Support
XML DB
• JSON
Oracle10g
• Parallel DML for XMLTYPE
• Binary XML und XMLIndex
• DB Native Webservices
• PL/SQL Embedded Gateway
XML DB
• Repository Events
• XQuery
Oracle9i
• Protokollserver: HTTPS
• SQL:2003
XML DB
Oracle8i
• Datentyp XMLTYPE
• CLOB und O/R Speicherung
• SQL/XML-Funktionen
• Protokollserver FTP, HTTP
• XML Developers Kit
1998
2001
2003
2008
2013
XML DB: Zugriffe
ftp> open 192.168.2.140 2100
Connected to 192.168.2.140.
220- cczarski-linux-140
Unauthorised use of this FTP server is prohibited and may be subject to
civil SQL>
and criminal
prosecution.
select extract(object_value,
'/nachricht/aktie').getstringval()
220 cczarski-linux-140
FTP
Server
(Oracle
XML DB/Oracle Database) ready.
2 from "nachricht429_TAB" e;
ftp> user xmldemo xmldemo
331 pass
required for XMLDEMO
XML_TITEL
230 XMLDEMO
logged in
----------------------------------------------------------------------ftp> dir
<aktie xmlns="http://www.oracle.com/aktie/nachrichten.xsd" wkn="871460„
200 PORT Command
successfulreuters="ORCL" branche="Software"/>
name="Oracle"
150 ASCII
Data
Connection
<aktie
xmlns="http://www.oracle.com/aktie/nachrichten.xsd"
wkn="871460„
drw-r--r-2
SYS
oracle
0
AUG
09
15:48
home
name="Oracle" reuters="ORCL" branche="Software"/>
drw-r--r-2 SYS
oracle
0 AUG 10 11:14 i
<aktie xmlns="http://www.oracle.com/aktie/nachrichten.xsd"
wkn="840400„
drw-r--r-2 SYS
oracle
0 AUG
30 17:57 public
name="Allianz"
reuters="ALV"
branche="Versicherungen"/>
drw-r--r-2
SYS
oracle
0
AUG
09 15:48 sys
:
226 ASCII Transfer Complete
ftp: 238
SQL>bytes received in 0,03Seconds 7,93Kbytes/sec.
ftp>
XML DB Protokollserver
Kontrolle
LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 14-FEB-2014 09:18:18
Copyright (c) 1991, 2013, Oracle.
All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
-----------------------Alias
LISTENER
Version
TNSLSNR for Linux: Version 12.1.0.1.0 - Production
Start Date
08-NOV-2013 14:02:54
Uptime
97 days 19 hr. 15 min. 24 sec
Trace Level
off
Security
ON: Local OS Authentication
SNMP
OFF
Listener Parameter File
/opt/oracle/product/12.1.0/db/network/admin/listener.ora
Listener Log File
/opt/oracle/diag/tnslsnr/sccloud017/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sccloud017.de.oracle.com)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sccloud017.de.oracle.com)(PORT=8080))(Presentation=HTTP)(Session=RAW))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sccloud017.de.oracle.com)(PORT=2100))(Presentation=FTP)(Session=RAW))
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "pdb01" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "sample" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
XML DB in der Oracle DB
Dateien und Ordner im XML DB Repository
• File/Folder-Sicht auf eine Repository-Tabelle
• PL/SQL-Zugriff via DBMS_XDB
• Basis für FTP und WebDAV
•
•
•
•
Zugriffskontrolle mit ACL
Versionierung
Links
Metadatenverwaltung
XML DB Repository im SQL Developer
Datentyp XMLTYPE
• Verwendbar wie jeder andere Datentyp
• als Tabellenspalte,
• in PL/SQL Logik
• Entwickler-Schnittstelle (SQL-Funktionen)
•
•
•
•
•
•
XMLQUERY, XMLTABLE
UPDATEXML
APPENDCHILDXML
SCHEMAVALIDATE
EXTRACT, EXTRACTVALUE
...
Datentyp XMLTYPE
• Tabellen anlegen
create table xml_tab (doc xmltype)
xmltype column doc
store as [clob | object relational | binary xml]
• Beispiel: Objektrelationale Speicherung
CREATE TABLE order_tab(
id
number(10),
order_doc xmltype
)
xmltype column order_doc store as object relational
xmlschema "http://xmldb.oracle.com/purchaseOrder"
element "purchaseOrder"
Beispiel-XML
Tabelle PURCHASEORDER_TAB
Zugriff mit SQL
Standardfunktion XMLTABLE
• SQL/XML Standard als Teil von SQL:2003
select
x.reference, x.username, x.costcenter
from Purchaseorder_tab p, xmltable(
'/PurchaseOrder'
passing xml_document
columns
reference
varchar2(30) path '/PurchaseOrder/Reference',
username
varchar2(30) path '/PurchaseOrder/User',
costcenter varchar2(10) path '/PurchaseOrder/CostCenter'
) x
Zugriff mit SQL
Hierarchie vs. flache Tabellen
• SQL-Funktion XMLTABLE: Ergebnis
REFERENCE
-----------------------------ADAMS-20011127121051212PST
ADAMS-20011127121044463PST
ADAMS-20011127121044793PST
ADAMS-20011127121045424PST
ADAMS-20011127121045484PST
ADAMS-20011127121046265PST
ADAMS-2001112712104796PST
:
USERNAME
---------ADAMS
ADAMS
ADAMS
ADAMS
ADAMS
ADAMS
ADAMS
:
COSTCENTER
---------R20
R20
R20
R20
R20
R20
R20
:
Zugriff mit SQL
Hierarchie vs. flache Tabellen
• XMLTABLE "hintereinander" schalten
• Ein XMLTABLE pro Hierarchieebene
select x.reference, x.username, count(it.item_number) anz_items
from
Purchaseorder_tab p, xmltable(
'/PurchaseOrder[CostCenter="A10"]'
passing xml_document
columns
reference varchar2(30) path '/PurchaseOrder/Reference',
username varchar2(30) path '/PurchaseOrder/User',
lineitems xmltype
path '/PurchaseOrder/LineItems/LineItem'
) x, xmltable(
'/LineItem'
passing x.lineitems
columns item_number number path '/LineItem/@ItemNumber'
) it
group by x.reference, x.username
Zugriff mit SQL
Hierarchie vs. flache Tabellen
• SQL-Funktion XMLTABLE: Ergebnis
REFERENCE
-----------------------------CLARK-2001112712104736PST
CLARK-2001112712105385PST
CLARK-2001112712105263PST
CLARK-2001112712104168PST
CLARK-2001112712105223PST
CLARK-20011127121039575PST
CLARK-2001112712104919PST
USERNAME
ANZ_ITEMS
---------- ---------CLARK
7
CLARK
21
CLARK
17
CLARK
40
CLARK
5
CLARK
8
CLARK
26
Zugriff mit SQL-Funktionen
Bearbeiten von XML-Dokumenten
• DML-Kommandos für XML
•
•
•
•
•
updateXML()
insertChildXML()
appendChildXML()
insertXMLbefore()
deleteXML()
• Piecewise Updates = Performance!
• Bei objektrelationaler Speicherung
XMLTYPE Update
Ab Oracle12c: XQuery Update
UPDATE purchaseorder_tab po
SET xml_document = XMLQuery(
'copy $i := $p1 modify (
for $j in $i/PurchaseOrder/Actions/Action[1]/User
return replace value of node $j with $p2
)
return $i'
PASSING xml_document AS "p1", 'SKING' AS "p2"
RETURNING CONTENT
)
WHERE XMLExists(
'$p/PurchaseOrder[Reference="SBELL-2002100912333601PDT"]'
PASSING xml_document AS "p"
)
XMLTYPE Speicherungsformen
Storage Clause einer XMLTYPE-Spalte
Oracle XML DB: Textbasiert
Ein Blick hinter die Kulisse
SQL> select object_value from xml_text where rownum=1;
OBJECT_VALUE
-----------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-i
nstance" xsi:noNamespaceSchemaLocation="http:/localhost:9021
1 Zeile wurde ausgewählt.
SQL> select e.xmldata from xml_text e where rownum=1;
XMLDATA
-----------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-i
nstance" xsi:noNamespaceSchemaLocation="http:/localhost:9021
Oracle XML DB: Objektrelational
Ein Blick hinter die Kulisse
SQL> select object_value from xml_or where rownum=1;
OBJECT_VALUE
-----------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-i
nstance" xsi:noNamespaceSchemaLocation="http:/localhost:9021
1 Zeile wurde ausgewählt.
SQL> select e.xmldata from xml_or e where rownum=1;
XMLDATA(SYS_XDBPD$, Reference, ACTIONS(SYS_XDBPD$, ACTION(SY
-----------------------------------------------------------XDBPO_TYPE(XDB$RAW_LIST_T('23FF01020084000088010035687474703
A2F6C6F63616C686F73743A393032312F7075626C69632F584D4C44454D4
F2F70757263686173654F726465722E787364000102030405060708'), '
ADAMS-20011127121044463PST', XDBPO_ACTIONS_TYPE(XDB$RAW_LIST
_T('1301000000'), ...
Objektrelationale Speicherung:
XML Schema
XML Schema in der Oracle-Datenbank
• "Registrierung"
• PL/SQL Paket (DBMS_XMLSCHEMA)
• Oracle Enterprise Manager
• Nachbildung der XML-Strukturen
• Oracle Objekttypen
• XML-Speicherung als "Objekt"
Oracle XML DB: Binary XML
Ein Blick hinter die Kulisse
SQL> select object_value from xml_binary where rownum=1;
OBJECT_VALUE
-----------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-i
nstance" xsi:noNamespaceSchemaLocation="http:/localhost:9021
1 Zeile wurde ausgewählt.
SQL> select e.xmldata from xml_binary e where rownum=1;
XMLDATA
-----------------------------------------------------------9F01039E000000B203000000030001787369C85DA1DD0001C03400156874
74703A2F6C6F63616C686F73743A393032312F7075626C69632F584D4C44
454D4F2F70757263686173654F726465722E787364C01956E14144414D53
2D3230303131313237313231303434343633505354C83A7CC81AAAC00403
3F53434F....
Speicherungsformen
Entscheidungsbaum -I1. Zugriffe
Nur auf ganze
Dokumente
<document id="2">
<element date="2007-0
<action>
<member name="Ora
:
Textbasierte
Speicherung
Auf einzelne
Dokumentknoten
2. XML Schema ...
Speicherungsformen
Entscheidungsbaum -II-
2. XML Schema
Nicht vorhanden
110100100100111000100
100101010111010001110
111001000111100001111
100010011110100001000
111100011100011111001
Binary XML
vorhanden
3. Flexibilität ...
Speicherungsformen
Entscheidungsbaum -III-
3. Flexibilität
XML Schema
wird sich häufig
ändern
XML Schema
wird stabil sein
110100100100111000100
100101010111010001110
111001000111100001111
100010011110100001000
111100011100011111001
Binary XML
Objektrelational
Speicherungsformen
Zusammenfassung:
• Drei Fragen führen zur richtigen Speicherungsform
• Zugriffe auf ganze Dokumente oder auf Dokumentteile?
• Liegt ein XML Schema vor oder nicht?
• Wird sich das XML Schema ändern oder stabil bleiben?
• Richtige Speicherungsform ist entscheidend!
• Performance-Unterschied: Faktoren
• Durch Tuning (Index, I/O) nicht einzuholen
• Binary XML in den meisten Fällen richtig
• Sehr flexibel und performant
• Default für XMLTYPE ab 11.2.0.2
XML Indizieren
• Index für XML: XDB.XMLINDEX
• Für Storage: Textbasiert und Binary XML
• Nicht aber für objektrelationale Speicherung
hier wie schon immer: B-Tree Indizes
create index xml_index on
purchaseorder_tab(object_value)
indextype is xdb.xmlindex parameters (
'PATHS (INCLUDE (/PurchaseOrder/User)
(/PurchaseOrder/LineItems)'
)
XML und Indizes
Weitere Möglichkeiten
• B-Tree Index (Nur objektrelationale Speicherung)
• Indizierung einzelner Knoten oder Attribute
• Verhalten wie "normale" B-Tree Indizes; sehr performant
• Function Based Index (Alle Speicherungsformen)
• Indizierung von 1:n-Beziehungen nicht möglich
• Oracle TEXT-Index (Alle Speicherungsformen)
• Volltextrecherche, aber keine Bereichssuche
• Für "einfaches" Indizieren eines Knotens zu aufwändig
XQuery Full Text
• Oracle11g: Oracle TEXT zur Suche in XML-Dokumenten
• Section-Suche: Suche innerhalb gegebener XML-Tags
• SQL-Funktion CONTAINS (Oracle TEXT)
• XML_SECTION_GROUP, PATH_SECTION_GROUP
• Ab Oracle12c: XQuery Fulltext
• XML Datenmodell wird komplett unterstützt
• SQL Funktion XMLEXISTS (SQL:2003)
• Abfragesprache nun XQuery Fulltext und damit standardisiert!
XQuery Fulltext: Setup
• Oracle TEXT Index nötig
• Erstellen mit PATH_SECTION_GROUP und
XML_ENABLE=TRUE
begin
ctx_ddl.create_section_group('my_sg_xquery', 'PATH_SECTION_GROUP');
ctx_ddl.set_sec_grp_attr('my_sg_xquery', 'xml_enable', 'true');
end;
/
sho err
create index ft_tabxml on tab_xml (docs)
indextype is ctxsys.context
parameters ('section group my_sg_xquery')
/
XQuery Fulltext: Abfragen
• Nutzung von XMLExists und XQuery-Syntax
SELECT id
FROM tab_xml
WHERE XMLExists('declare namespace ns="http://mynamespaces.com/ns2";
//ns:tag[. contains text "text"]'
PASSING docs)
• SQL/XML-Funktion XMLExists verwenden
• CONTAINS-Funktion (Oracle TEXT) nicht verwenden
• Kombination mit XQuery oder SQL/XML möglich
XML erzeugen: In der Datenbank
XML-Schnittstellen
SQL/XML Standard (SQL:2003)
•
•
•
•
•
•
•
•
XMLElement()
XMLForest()
XMLAgg()
XMLComment()
XMLCDATA()
XMLPI()
XMLRoot()
XMLSerialize()
XML-Dokumente erzeugen
SQL/XML am Beispiel
• View auf Ebene der Wertpapiere
create or replace view WERTPAPIER_XML_VIEW as
select
XMLElement("wertpapier",
XMLAttributes(
wp.isin
as "isin",
dp.kontonummer as "depotnummer"
),
XMLElement("bezeichnung", wp.wp_bezeichnung),
XMLElement("stueck_nominale", wp.amount)
)
from wertpapier wp join depot dp using (depot_id)
XML-Dokumente erzeugen
SQL/XML am Beispiel
• Ergebnis ...
XML-Dokumente erzeugen
SQL/XML am Beispiel
• Komplexeres XML mit Hierarchie erzuegen
select
XMLElement("kunde",
XMLAttributes(kd.kunde_id as "kundennummer"),
XMLForest(
kd.kunde_name as "name",
kd.kunde_vorname as "vorname",
kd.kunde_ort as "ort"
),
XMLComment('Generiert am '||to_char(sysdate)),
(
select
XMLAgg(
XMLElement("depot",
XMLAttributes(dp.kontonummer as "kontonummer"),
(
select
XMLAgg(
:
XML-Dokumente erzeugen
SQL/XML am Beispiel
• Ergebnis ...
XML Views und das XML DB Repository
Abrufen der Inhalte per HTTP oder FTP
• Virtuelle Dateien: Inhalte kommen aus View
XMLDIFF und XMPATCH
"Original und Fälschung" ... für XML
• 1. Dokument ...
<vortrag xmlns="oracle-sig"
titel="Oracle XML DB: Immer noch unschlagbar"/>
• 2. Dokument ...
<s:vortrag xmlns:s="oracle-sig"
titel="Oracle XML DB: Immer noch unschlagbar"></s:vortrag>
Welche Unterschiede gibt es
zwischen diesen Dokumenten ...?
Deltas in XML-Dokumenten erkennen
Die Herausforderung ...
• XML: Das Gleiche unterschiedlich aussagen ...
•
•
•
•
Namespace-Präfix
XML-Tags ohne Inhalt
Whitespace
Entity-Referenzen
<vortrag xmlns="oracle-sig"/>
<vortrag></vortrag>
<s:vortrag xmlns:s="oracle-sig"/>
<tag1/>
<tag2/>
<vortrag/>
<vortrag>"</vortrag>
<vortrag>
</vortrag>
<vortrag>"</vortrag>
• Einfacher Textvergleich greift zu kurz!
XML-Deltas in erkennen
Die Lösung: ... Mit SQL!
• SQL-Funktionen XMLDiff und XMLPatch
• Deltas erkennen (XMLDiff) ...
... und auf andere Dokumente anwenden (XMLPatch)
• Deltas zwischen Systemen übertragen ...
... mit Rücksicht auf XML-Besonderheiten!
<xd:xdiff xsi:schemaLocation="http://....
<?oracle-xmldiff
operations-in-docorder="true"
output-model="snapshot"
diff-algorithm="global"?>
<!-- Leere Menge: Dokumente identisch-->
</xd:xdiff>
XMLDiff: Ein anderes Beispiel
Unterschiedliche XML-Dokumente (XML Schemas)
<xd:xdiff xsi:schemaLocation="http://....
<?oracle-xmldiff
operations-in-docorder="true"
output-model="snapshot"
diff-algorithm="global"?>
<xd:append-node
xd:node-type="element"
xd:parent-xpath=
"/xs:schema[1]/xs:simpleType[6]/xs:restriction[1]"
>
<xd:content>
<xs:enumeration value="E999" />
</xd:content>
</xd:append-node>
</xd:xdiff>
Weitere Informationen
• Oracle XML DB im OTN
http://www.oracle.com/technetwork/database/features/xmldb/index.html
• Oracle Dokumentation
http://docs.oracle.com/
• Handbücher zur Oracle Database
• XML DB Developers Guide
• Blog: SQL und PL/SQL in Oracle
http://sql-plsql-de.blogspot.com
[email protected]
http://tinyurl.com/apexcommunity
http://sql-plsql-de.blogspot.com
http://oracle-text-de.blogspot.com
http://oracle-spatial.blogspot.com
http://plsqlexecoscomm.sourceforge.net
http://plsqlmailclient.sourceforge.net
Twitter: @cczarski @oraclebudb
Herunterladen