Title: IV1023 ht2013 Avancerad Datahantering med XML Propriet
1IV1023 ht2013Avancerad Datahantering med
XMLProprietära lösningar
- nikos dimitrakas
- nikosd_at_kth.se
- 08-7904460
- Rum 8522
Läsanvisningar Respektive produkts
dokumentation Kompendierna med introduktion till
respektive produkt Kapitel 13.3 i kursboken
2Leverantörer/Produkter
- IBM
- DB2 10.5
- Oracle
- Oracle Database 12c
- Microsoft
- SQL Server 2012
3IBM DB2 10.5
- Stöd för SQL/XML enligt SQL 2006 med vissa
undantag - Inget stöd för XML-datatyper med kopplat schema
- Inget fullt stöd för XPath, XQuery
- Extra tillägg
- XMLGROUP, XMLROW, XSLTRANSFORM
- XQUERY, extra XQuery-funktioner
- Stöd i tidigare versioner
- Datatyper XMLVARCHAR, XMLCLOB, XMLFILE
- DTD-validering
- Composition och shredding enligt templates
(DAD-filer) - Uppdatering av data inuti XML-strukturen
- update-funktion
- Funktioner för XPath-användning
- extractInteger, extractDate, extractVarchar,
extractCLOB, etc - extractIntegers, extractDates, extractVarchars,
etc.
4Oracle Database 12c
- Stöd för det mesta av SQL/XML enligt SQL 2006
- Extra tillägg
- Metoder för XML-datatypen (kvalificering krävs!)
- Extract
- Transform
-
- Funktioner (många deprecated i version 12)
- Extract, ExtractValue, existsNode
- UpdateXML, InsertXML, DeleteXML,
- XMLTransform, XMLColAttVal
-
- XQuery-tillägg
- oraview, oracontains, oramatches
- Ännu flera Oracle-specifika lösningar i tidigare
versioner, som en efter en fasas ut.
5Microsoft SQL Server 2012
- Datatyp
- Stöd för validering
- Enligt SQL-standarden
- FOR XML
- OPENXML
- XML-metoder
- query (XQuery)
- value
- exist
- modify (DML)
- nodes
- Begränsat stöd för XQuery
- få funktioner
- inte alla axes
- delvis stöd för let-klausulen
6Exempeldata
PERSON PERSON
pid name yearofbirth
1 John Higgins 1975
2 Steven Hendry 1973
3 Mathew Stevens 1982
4 Ronnie OSullivan 1980
5 Ken Doherty 1974
6 Steve Davis 1960
7 Paul Hunter 1983
8 Neil Robertson 1982
CAR
licencenumber color brand model year owner
ABC123 black NISSAN Cherry 1995 1
CCD457 blue FIAT Forza 2001 2
DKL998 green SAAB 9000C 1998 3
RSQ199 black NISSAN Micra 1999 4
WID387 red FIAT Nova 2003 5
ROO197 blue SAAB 900i 1982 3
TYD226 black NISSAN Cherry 1990 1
PTF357 red VOLVO V70 2001 6
7Exempeldata
- Kolumnen employments enligt följande XML
Schemalt?xml version"1.0"?gtltschema
xmlns"http//www.w3.org/2001/XMLSchema"gt ltelemen
t name"root"gt ltcomplexTypegt ltsequencegt lt
element name"employment" type"EmploymentType"
minOccurs"0" maxOccurs"unbounded"
/gt lt/sequencegt lt/complexTypegt lt/elementgt ltc
omplexType name"EmploymentType"gt ltattribute
name"startdate" type"date" use"required"
/gt ltattribute name"enddate" type"date"
use"optional" /gt ltattribute name"employer"
type"string" use"required" /gt lt/complexTypegtlt/
schemagt
8Exempeldata
pid employments
1 ltrootgtltemployment startdate"2001-08-20" enddate"2009-02-28" employer"ABB"/gt ltemployment startdate"2009-04-15" employer"UPC"/gtlt/rootgt
2 ltrootgtltemployment startdate"2002-08-20" enddate"2003-06-30" employer"ABB"/gt ltemployment startdate"2003-08-01" employer"UPC"/gt ltemployment startdate"2006-11-01" employer"ABB"/gtlt/rootgt
3 ltrootgtltemployment startdate"2003-01-10" employer"UPC"/gt lt/rootgt
4 ltrootgtltemployment startdate"2002-03-10" enddate"2010-05-22" employer"LKP"/gt ltemployment startdate"2010-08-15" employer"STG"/gtlt/rootgt
5 ltrootgtltemployment startdate"2002-02-12" enddate"2003-05-11" employer"LKP"/gt ltemployment startdate"2003-05-12" enddate"2003-12-02" employer"ABB"/gt ltemployment startdate"2003-12-06" enddate"2005-02-17" employer"LKP"/gt ltemployment startdate"2005-02-18" enddate"2008-05-16" employer"FFD"/gt ltemployment startdate"2008-06-02" employer"STG"/gtlt/rootgt
6 ltrootgtltemployment startdate"2001-01-05" enddate"2005-12-31" employer"ABB"/gt ltemployment startdate"2006-01-15" enddate"2009-01-22" employer"LKP"/gt ltemployment startdate"2009-02-01" employer"FFD"/gtlt/rootgt
7 ltrootgtltemployment startdate"2004-01-10" enddate"2008-09-29" employer"FFD"/gt ltemployment startdate"2008-10-01" enddate"2010-11-20" employer"LKP"/gtlt/rootgt
8 ltrootgtltemployment startdate"2006-02-03" enddate"2008-10-30" employer"UPC"/gt ltemployment startdate"2008-11-20" employer"ABB"/gtlt/rootgt
9DB2 - datatyp
- XML
- Inget stöd för explicit associering av XML
Schema, DTD - Accepterar well-formed XML och XML-fragment
- Validering
- Stöd för XML Schema
- Ej stöd för DTD
- Funktionen XMLVALIDATE
- explicit schema
- implicit schema
- Registrering av XML Schema
- VALIDATED constraint
- Testar om ett XML-värde är validerat
- generellt
- enligt specifik XML Schema
10DB2 - XML Schema Repository
- Stöd för XML Schema och DTD
- REGISTER XMLSCHEMA
- ADD XMLSCHEMA
- COMPLETE XMLSCHEMA
- UPDATE XMLSCHEMA
- REGISTER XSROBJECT
11DB2 - SQL/XML
- Stödjer följande funktioner
- XMLELEMENT
- XMLATTRIBUTES
- XMLFOREST
- XMLCONCAT
- XMLCOMMENT
- XMLPI
- XMLAGG
- XMLTEXT
- XMLDOCUMENT
- XMLPARSE
- XMLVALIDATE
- XMLNAMESPACES
- XMLSERIALIZE
- XMLTABLE
- XMLQUERY (endast SEQUENCE)
- XMLCAST (klassificerad som expression, inte som
funktion) - XMLEXISTS (klassificerad som predikat, inte som
funktion)
12DB2 - XMLROW
- Returnerar ett XML-dokument per rad
- SELECT XMLROW(name, yearofbirth, pid) FROM
person - ltrowgtltNAMEgtJohn Higginslt/NAMEgtltYEAROFBIRTHgt1975lt/
YEAROFBIRTHgtltPIDgt1lt/PIDgtlt/rowgtltrowgtltNAMEgtStephen
Hendrylt/NAMEgtltYEAROFBIRTHgt1973lt/YEAROFBIRTHgtltPIDgt2
lt/PIDgtlt/rowgt ltrowgtltNAMEgtMatthew
Stevenslt/NAMEgtltYEAROFBIRTHgt1982lt/YEAROFBIRTHgtltPIDgt
3lt/PIDgtlt/rowgtltrowgtltNAMEgtRonnie
O'Sullivanlt/NAMEgtltYEAROFBIRTHgt1980lt/YEAROFBIRTHgtltP
IDgt4lt/PIDgtlt/rowgtltrowgtltNAMEgtKen
Dohertylt/NAMEgtltYEAROFBIRTHgt1974lt/YEAROFBIRTHgtltPIDgt
5lt/PIDgtlt/rowgtltrowgtltNAMEgtSteve Davislt/NAMEgtltYEAROF
BIRTHgt1960lt/YEAROFBIRTHgtltPIDgt6lt/PIDgtlt/rowgtltrowgtltN
AMEgtPaul Hunterlt/NAMEgtltYEAROFBIRTHgt1983lt/YEAROFBIR
THgtltPIDgt7lt/PIDgtlt/rowgtltrowgtltNAMEgtNeil
Robertsonlt/NAMEgtltYEAROFBIRTHgt1982lt/YEAROFBIRTHgtltPI
Dgt8lt/PIDgtlt/rowgt
13DB2 - XMLROW - elementnamn
- Tillåter konfigurering av elementnamn
- SELECT XMLROW(name AS "Namn", yearofbirth AS
"Födelseår", pid AS ID OPTION ROW
"Någon") FROM person - ltNågongtltNamngtJohn Higginslt/NamngtltFödelseårgt1975lt/
FödelseårgtltIDgt1lt/IDgtlt/NågongtltNågongtltNamngtStephen
Hendrylt/NamngtltFödelseårgt1973lt/FödelseårgtltIDgt2lt/IDgt
lt/NågongtltNågongtltNamngtMatthew Stevenslt/NamngtltFödel
seårgt1982lt/FödelseårgtltIDgt3lt/IDgtlt/NågongtltNågongtltNa
mngtRonnie O'Sullivanlt/NamngtltFödelseårgt1980lt/Födels
eårgtltIDgt4lt/IDgtlt/NågongtltNågongtltNamngtKen
Dohertylt/NamngtltFödelseårgt1974lt/FödelseårgtltIDgt5lt/ID
gtlt/NågongtltNågongtltNamngtSteve Davislt/NamngtltFödelseå
rgt1960lt/FödelseårgtltIDgt6lt/IDgtlt/NågongtltNågongtltNamngt
Paul Hunterlt/NamngtltFödelseårgt1983lt/FödelseårgtltIDgt7
lt/IDgtlt/NågongtltNågongtltNamngtNeil
Robertsonlt/NamngtltFödelseårgt1982lt/FödelseårgtltIDgt8lt/
IDgtlt/Någongt SELECT XMLELEMENT(NAME "Någon",
XMLFOREST(name AS "Namn", yearofbirth AS
"Födelseår", pid AS ID)) FROM person
14DB2 - XMLROW - attribut
- Möjligt att välja attribut istället för element
- SELECT XMLROW(name AS "Namn", yearofbirth AS
"Födelseår", pid AS ID OPTION ROW
"Någon" AS ATTRIBUTES) FROM person - ltNågon Namn"John Higgins" Födelseår"1975"
ID"1"/gtltNågon Namn"Stephen Hendry"
Födelseår"1973" ID"2"/gtltNågon Namn"Matthew
Stevens" Födelseår"1982" ID"3"/gtltNågon
Namn"Ronnie O'Sullivan" Födelseår"1980"
ID"4"/gtltNågon Namn"Ken Doherty"
Födelseår"1974" ID"5"/gtltNågon Namn"Steve
Davis" Födelseår"1960" ID"6"/gtltNågon
Namn"Paul Hunter" Födelseår"1983"
ID"7"/gtltNågon Namn"Neil Robertson"
Födelseår"1982" ID"8"/gt - SELECT XMLELEMENT(NAME "Någon",
XMLATTRIBUTES(name AS "Namn", yearofbirth
AS "Födelseår", pid AS ID)) FROM person
15DB2 - XMLGROUP
- Returnerar många rader som ett XML-dokument
- Aggregeringsfunktion
- SELECT XMLGROUP(name, yearofbirth, pid) FROM
person - ltrowsetgt ltrowgt ltNAMEgtJohn
Higginslt/NAMEgt ltYEAROFBIRTHgt1975lt/YEAROFBIRT
Hgt ltPIDgt1lt/PIDgt lt/rowgt ltrowgt
ltNAMEgtStephen Hendrylt/NAMEgt
ltYEAROFBIRTHgt1973lt/YEAROFBIRTHgt
ltPIDgt2lt/PIDgt lt/rowgt ltrowgt
ltNAMEgtMatthew Stevenslt/NAMEgt
ltYEAROFBIRTHgt1982lt/YEAROFBIRTHgt
ltPIDgt3lt/PIDgt lt/rowgt - lt/rowsetgt
16DB2 - XMLGROUP - elementnamn
- Tillåter konfigurering av elementnamn
- SELECT XMLGROUP(name AS "Namn", yearofbirth AS
"Födelseår", pid AS ID OPTION ROOT "Alla" ROW
"Någon") FROM person - ltAllagt ltNågongt ltNamngtJohn
Higginslt/Namngt ltFödelseårgt1975lt/Födelseårgt
ltIDgt1lt/IDgt lt/Någongt ltNågongt
ltNamngtStephen Hendrylt/Namngt
ltFödelseårgt1973lt/Födelseårgt ltIDgt2lt/IDgt
lt/Någongt ltNågongt ltNamngtMatthew
Stevenslt/Namngt ltFödelseårgt1982lt/Födelseårgt
ltIDgt3lt/IDgt lt/Någongt lt/Allagt
17DB2 - XMLGROUP - attribut
- Möjligt att välja attribut istället för element
- SELECT XMLGROUP(name AS "Namn", yearofbirth AS
"Födelseår", pid AS ID OPTION AS ATTRIBUTES
ROOT "Alla" ROW "Någon") FROM person - ltAllagt ltNågon ID"1" Födelseår"1975"
Namn"John Higgins"/gt ltNågon ID"2"
Födelseår"1973" Namn"Stephen Hendry"/gt
ltNågon ID"3" Födelseår"1982" Namn"Matthew
Stevens"/gt ltNågon ID"4" Födelseår"1980"
Namn"Ronnie O'Sullivan"/gt ltNågon ID"5"
Födelseår"1974" Namn"Ken Doherty"/gt ltNågon
ID"6" Födelseår"1960" Namn"Steve Davis"/gt
ltNågon ID"7" Födelseår"1983" Namn"Paul
Hunter"/gt ltNågon ID"8" Födelseår"1982"
Namn"Neil Robertson"/gtlt/Allagt - SELECT XMLELEMENT(NAME "Alla",
XMLAGG(XMLROW(name AS "Namn", yearofbirth AS
"Födelseår", pid AS ID OPTION ROW "Någon" AS
ATTRIBUTES))) FROM person
18DB2 - XSLTRANSFORM
- Transformerar ett XML-dokument enligt ett
XSL-dokument (XSLT 1.0) - XSLTRANSFORM(XML-värde USING XSL-värde)
- ltxsltransform version"1.0" xmlnsxsl"http//www
.w3.org/1999/XSL/Transform"gt - ltxsloutput method"xml" /gt
- ltxsltemplate match"/"gt
- ltxslelement name"Employers"gt
- ltxslapply-templates select"//_at_employer" /gt
- lt/xslelementgt
- lt/xsltemplategt
- ltxsltemplate match"_at_employer"gt
- ltxslelement name"Employer"gt
- ltxslvalue-of select"."/gt
- lt/xslelementgt
- lt/xsltemplategt
- lt/xsltransformgt
19DB2 - XSLTRANSFORM
- SELECT XSLTRANSFORM(employments USING
'ltxsltransform version"1.0" xmlnsxsl"http//w
ww.w3.org/1999/XSL/Transform"gt ltxsloutput
method"xml" /gt ltxsltemplate match"/"gt ltxsle
lement name"Employers"gt ltxslapply-templates
select"//_at_employer" /gt lt/xslelementgt lt/xslt
emplategt ltxsltemplate match"_at_employer"gt ltxsl
element name"Employer"gt ltxslvalue-of
select"."/gt lt/xslelementgt lt/xsltemplategtlt/
xsltransformgt') - FROM person
- WHERE name 'Steve Davis'ltEmployersgt ltEmployer
gtABBlt/Employergt ltEmployergtLKPlt/Employergt ltEmploy
ergtFFDlt/Employergtlt/Employersgt
20DB2 - XSLTRANSFORM
- CREATE TABLE xsl (name VARCHAR(15) NOT NULL
PRIMARY KEY, value XML NOT NULL) - INSERT INTO xsl VALUES ('employers',
'ltxsltransform version"1.0" xmlnsxsl"http//w
ww.w3.org/1999/XSL/Transform"gt ltxsloutput
method"xml" /gt ltxsltemplate match"/"gt ltxsle
lement name"Employers"gt ltxslapply-templates
select"//_at_employer" /gt lt/xslelementgt lt/xslt
emplategt ltxsltemplate match"_at_employer"gt ltxsl
element name"Employer"gt ltxslvalue-of
select"."/gt lt/xslelementgt lt/xsltemplategtlt/
xsltransformgt') - SELECT XSLTRANSFORM(employments USING
xsl.value)FROM person, xslWHERE person.name
'Steve Davis' AND xsl.name 'employers'
21DB2 - XQUERY
- Stöd för XQuery-uttryck
- XQuery-uttryck efter nyckelordet XQUERY
- xqueryfor a in (1,2,3)return element Nummer
a - Tre rader i resultatetltNummergt1lt/NummergtltNummer
gt2lt/NummergtltNummergt3lt/Nummergt - xqueryelement Resultat for a in (1,2,3)
return element Nummer a - ltResultatgt ltNummergt1lt/NummergtltNummergt2lt/Nummergtlt
Nummergt3lt/Nummergtlt/Resultatgt
22DB2 - XQUERY - sqlquery
- XQuery-funktion för SQL i XQuery
- db2-fnsqlquery
- stöd för parametrar
- resultatet är en sekvens i XQuery-kontext
- SELECT-satsen måste returnera en kolumn av
XML-typ - xquery for a in distinct-values(db2-fnsqlquery(
"SELECT employments FROM person")//_at_employer)retu
rn element Företag a - ltFöretaggtABBlt/FöretaggtltFöretaggtUPClt/FöretaggtltFö
retaggtLKPlt/FöretaggtltFöretaggtSTGlt/FöretaggtltFöreta
ggtFFDlt/Företaggt
23DB2 - XQUERY - sqlquery
- Parametrar
- xquery for a in distinct-values(db2-fnsqlquery(
"SELECT employments FROM person WHERE yearofbirth
gt parameter(1)", 1979)//_at_employer)return element
Företag a - ltFöretaggtUPClt/FöretaggtltFöretaggtLKPlt/FöretaggtltFö
retaggtSTGlt/FöretaggtltFöretaggtFFDlt/FöretaggtltFöreta
ggtABBlt/Företaggt
24DB2 - XQUERY - sqlquery
- xquery
- let a db2-fnsqlquery('SELECT XMLELEMENT(NAME
"Person", name) FROM person WHERE yearofbirth
lt1975') - return element Folk a
- ltFolkgt ltPersongtStephen Hendrylt/Persongt ltPersongtK
en Dohertylt/Persongt ltPersongtSteve
Davislt/Persongtlt/Folkgt
25DB2 - XQUERY - xmlcolumn
- XQuery-funktion för att hämta data från en
XML-kolumn - db2-fnxmlcolumn
- Tabellnamn och kolumnnamn är case-sensitive
- xquery for a in distinct-values(db2-fnxmlcolumn
('PERSON.EMPLOYMENTS')//_at_employer)return element
Företag a - ltFöretaggtABBlt/FöretaggtltFöretaggtUPClt/FöretaggtltFö
retaggtLKPlt/FöretaggtltFöretaggtSTGlt/FöretaggtltFöreta
ggtFFDlt/Företaggt
26DB2 - XML DML
- XQuery Update Facility
- några syntaxskillnader
- transform-uttryck
- (transform-klausul)
- copy-klausul
- modify-klausul
- do delete
- do insert
- do rename
- do replace
- return-klausul
- nyckelord för do insert
- before
- after
- as first into
- as last into
- into
- nyckelord för do replace
- (value of) with
- nyckelord för do rename
- as
27DB2 - XML DML
- Hela XML-värdet måste uppdateras
- UPDATE Person
- SET employments XMLQUERY('transform-uttryck'
PASSING employments) - WHERE
28DB2 - transform - insert
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify do insert ltagt123lt/agt as first into x
- return x
- ltrootgt ltagt123lt/agt ltagt456lt/agt ltagt789lt/agtlt/rootgt
29DB2 - transform - insert
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify do insert ltagt123lt/agt before x/atext()
789 - return x
- ltrootgt ltagt456lt/agt ltagt123lt/agt ltagt789lt/agtlt/rootgt
30DB2 - transform - insert
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify do insert attribute c 5 into x/atext()
789 - return x
- ltrootgt ltagt456lt/agt lta c"5"gt789lt/agtlt/rootgt
31DB2 - transform - insert
- UPDATE PersonSET employments
XMLQUERY(' transform copy nye e modify do
insert element employment attribute
startdate "2011-09-01", attribute employer
"LBM" as last into nye/root return nye'
PASSING employments AS "e")WHERE pid 3 - SELECT employments FROM Person WHERE pid 3
- ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gt ltemployment startdate"2011-09-0
1" employer"LBM"/gtlt/rootgt
32DB2 - transform - delete
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify do delete x/atext() 789
- return x
- ltrootgt ltagt456lt/agtlt/rootgt
33DB2 - transform - delete
- SELECT XMLQUERY('transform copy nye
e modify do delete nye//employment2 return
nye' PASSING employments AS "e")FROM
PersonWHERE pid 3 - ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gtlt/rootgt - SELECT employments FROM person WHERE pid 3
- ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gt ltemployment startdate"2011-09-0
1" employer"LBM"/gtlt/rootgt
34DB2 - transform - delete
- UPDATE Person SET employments
XMLQUERY('transform copy nye e
modify do delete nye//employment2
return nye' PASSING employments AS "e")
WHERE pid 3 - SELECT employments FROM Person WHERE pid 3
- ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gtlt/rootgt
35DB2 - transform - replace
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify do replace x/atext() 789 with
ltbgt123lt/bgt - return x
- ltrootgt ltagt456lt/agt ltbgt123lt/bgtlt/rootgt
36DB2 - transform - replace
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify do replace value of x/atext() 789
with 123 - return x
- ltrootgt ltagt456lt/agt ltagt123lt/agtlt/rootgt
37DB2 - transform - replace
- xquery
- transform
- copy x ltrootgtlta b"ccc"gt456lt/agtltagt789lt/agtlt/roo
tgt - modify do replace x/a1/_at_b with attribute f
"ddd" - return x
- ltrootgt lta f"ddd"gt456lt/agt ltagt789lt/agtlt/rootgt
38DB2 - transform - rename
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify do rename x/a2 as "b"
- return x
- ltrootgt ltagt456lt/agt ltbgt789lt/bgtlt/rootgt
39DB2 - transform - rename
- xquery
- transform
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify for a in x/a
- return do rename a as "b"
- return x
- ltrootgt ltbgt456lt/bgt ltbgt789lt/bgtlt/rootgt
40Oracle - datatyp
- XMLTYPE
- Stöd för explicit associering till XML Schema
- Strukturell validering
- Sparar valideringstillståndet
- Konstruktorfunktion XMLTYPE
- XMLTYPE('lta/gt')
- Bara XML-dokument
- Endast XML-dokument i kolumner
- Full validering med
- proceduren SchemaValidate
- sparar resultatet
- som testas med metoden IsSchemaValidated
- metoden IsSchemaValid
- returnerar resultatet
- Hanterar inte attributnoder så bra
41Oracle Database 12c
- Stöd för det mesta av SQL/XML enligt SQL 2006
- Extra tillägg
- Metoder för XML-datatypen (kvalificering krävs!)
- Extract
- Transform
-
- Funktioner (många är deprecated i version 12)
- Extract, ExtractValue, existsNode
- UpdateXML, InsertXML, DeleteXML,
- XMLTransform, XMLColAttVal
-
- XQuery-tillägg
- oraview, oracontains, oramatches
- Ännu flera Oracle-specifika lösningar i tidigare
versioner, som en efter en fasas ut.
42Oracle - SQL/XML
- XMLNAMESPACES (stöds inte)
- namespaces skapas med XMLATTRIBUTES!
- XMLSERIALIZE
- XMLTABLE (delvis)
- XMLQUERY (endast CONTENT)
- XMLCAST
- XMLEXISTS
- Stödjer följande funktioner
- XMLELEMENT (delvis)
- XMLATTRIBUTES
- XMLFOREST
- XMLCONCAT
- XMLCOMMENT
- XMLPI
- XMLAGG
- XMLPARSE
- Dynamiska nodnamn med nyckelordet EVALNAME
- Fungerar med XMLELEMENT, XMLATTRIBUTES,
XMLFOREST, XMLPI
43Oracle - andra funktioner
- XMLCDATA
- XMLISVALID
- XMLCOLATTVAL
- EXTRACT
- EXTRACTVALUE
- EXISTSNODE
- XMLSEQUENCE
- XMLTRANSFORM
- Deprecated
- UPDATEXML
- APPENDCHILDXML
- INSERTCHILDXML
- INSERTCHILDXMLAFTER
- INSERTCHILDXMLBEFORE
- INSERTXMLAFTER
- INSERTXMLBEFORE
- DELETEXML
44Oracle - XMLTYPE
- Metoder (ibland kallade medlemsfunktioner "member
functions") - extract
- existsNode
- transform
- isSchemaValidated
- isSchemaValid
- isSchemaBased
- isFragment
- getStringVal
- getNumberVal
- getCLOBVal
- getBLOBVal
- getNamespace
- getRootElement
- getSchemaURL
45Oracle - XMLCDATA
- Motsvarar SQL/XMLs XMLTEXT
- Lägger texten inuti lt!CDATAvärdetgt
- SELECT XMLELEMENT(NAME Person, XMLCDATA(name))
FROM person WHERE pid 1 - ltPERSONgtlt!CDATAJohn Higginsgtlt/PERSONgt
- SELECT XMLELEMENT(NAME Tecken, 'lt') FROM dual
- ltTECKENgtltlt/TECKENgt
- SELECT XMLELEMENT(NAME Tecken, XMLCDATA('lt'))
FROM dual - ltTECKENgtlt!CDATAltgtlt/TECKENgt
46Oracle - XMLISVALID
- Motsvarar SQL/XMLs XMLVALIDATE
- implicit schemaXMLISVALID(xmlvärde)
- explicit schemaXMLISVALID(xmlvärde, schemanamn)
47Oracle - XMLROOT
- Deprecated i SQL/XML
- Används för att generera XML-deklarationen
- SELECT XMLELEMENT(NAME Person, name) FROM
person WHERE pid 1ltPERSONgtJohn
Higginslt/PERSONgt - SELECT XMLROOT(XMLELEMENT(NAME Person, name))
FROM person WHERE pid 1lt?xml version"1.0"
encoding"UTF-8"?gt - ltPERSONgtJohn Higginslt/PERSONgt
48Oracle - XMLCOLATTVAL
- Genererar ett XML-fragment med ett column-element
för varje kolumn/värde - SELECT XMLCOLATTVAL(name, yearofbirth) FROM
person WHERE pid 1 - ltcolumn name "NAME"gtJohn Higginslt/columngtltcolu
mn name "YEAROFBIRTH"gt1975lt/columngt - SELECT XMLCOLATTVAL('nikos' AS "subject",
'hälsar' AS "predikat") FROM dual - ltcolumn name"subject"gtnikoslt/columngtltcolumn
name"predikat"gtharlt/columngt
49Oracle - EXTRACT
- Applicerar ett XPath-uttryck på ett XML-värde
- Returnerar XML
- Deprecated. Ersätts av SQL/XMLs XMLQUERY
- SELECT name, EXTRACT(employments,
'//employment1') FROM person - John Higgins ltemployment startdate"2001-08-20"
enddate"2009-02-28" employer"ABB"/gt - Stephen Hendry ltemployment startdate"2002-08-20"
enddate"2003-06-30" employer"ABB"/gt - Matthew Stevens ltemployment startdate"2003-01-10"
employer"UPC"/gt - Ronnie O'Sullivan ltemployment startdate"2002-03-1
0" enddate"2010-05-22" employer"LKP"/gt - Ken Doherty ltemployment startdate"2002-02-12"
enddate"2003-05-11" employer"LKP"/gt - Steve Davis ltemployment startdate"2001-01-05"
enddate"2005-12-31" employer"ABB"/gt - Paul Hunter ltemployment startdate"2004-01-10"
enddate"2008-09-29" employer"FFD"/gt - Neil Robertson ltemployment startdate"2006-02-03"
enddate"2008-10-30" employer"UPC"/gt
50Oracle - EXTRACT
- SELECT name, EXTRACT(employments,
'//employment1/_at_employer') FROM person - John Higgins ABBStephen Hendry ABBMatthew
Stevens UPCRonnie O'Sullivan LKPKen
Doherty LKPSteve Davis ABBPaul
Hunter FFDNeil Robertson UPC
51Oracle - EXTRACTVALUE
- Applicerar ett XPath-uttryck på ett XML-värde
- Returnerar ett värde
- Deprecated. Ersätts av SQL/XMLs XMLQUERY
- SELECT name, EXTRACTVALUE(employments,
'//employment1 /_at_employer') FROM person - John Higgins ABBStephen Hendry ABBMatthew
Stevens UPCRonnie O'Sullivan LKPKen
Doherty LKPSteve Davis ABBPaul
Hunter FFDNeil Robertson UPC
52Oracle - EXISTSNODE
- Testar om ett XPath-uttryck matchar någon nod i
ett XML-värde - Deprecated. Ersätts av XMLEXISTS
- Returnerar 1 (sant) eller 0 (falskt)
- SELECT nameFROM person WHERE
EXISTSNODE(employments, '//employment_at_employer"A
BB"') 1 - John HigginsStephen HendryKen DohertySteve
DavisNeil Robertson
53Oracle - XMLSEQUENCE
- Delar upp ett XML-fragment i flera XML-dokument
- Deprecated. Ersätts av SQL/XMLs XMLTABLE
- SELECT e. FROM person, TABLE(XMLSEQUENCE(E
XTRACT(employments, '//employment'))) eWHERE pid
5 - ltemployment startdate"2002-02-12"
enddate"2003-05-11" employer"LKP"/gt - ltemployment startdate"2003-05-12"
enddate"2003-12-02" employer"ABB"/gt - ltemployment startdate"2003-12-06"
enddate"2005-02-17" employer"LKP"/gt - ltemployment startdate"2005-02-18"
enddate"2008-05-16" employer"FFD"/gt - ltemployment startdate"2008-06-02"
employer"STG"/gt - Obs! Fem rader i resultatet
54Oracle - XMLTRANSFORM
- Omvandlar ett XML-dokument enligt ett
XSLT-dokument (XSLT 1.0) - SELECT XMLTRANSFORM(employments ,
'ltxsltransform xmlnsxsl"http//www.w3.org/1999
/XSL/Transform" version"1.0"gt ltxsloutput
method"xml"/gt ltxsltemplate match"/"gt
ltxslelement name"Employers"gt
ltxslfor-each select"//employment/_at_employer"gt
ltxslelement name"Employer"gt
ltxslvalue-of select"."/gt
lt/xslelementgt lt/xslfor-eachgt
lt/xslelementgt lt/xsltemplategtlt/xsltransformgt
')FROM personWHERE name 'Ken Doherty' - lt?xml version"1.0" encoding"UTF-8"?gtltEmployers
gt ltEmployergtLKPlt/Employergt ltEmployergtABBlt/Empl
oyergt ltEmployergtLKPlt/Employergt
ltEmployergtFFDlt/Employergt ltEmployergtSTGlt/Employer
gtlt/Employersgt
55Oracle - XMLTRANSFORM
- SELECT XMLTRANSFORM(employments ,
'ltxsltransform xmlnsxsl"http//www.w3.org/1999
/XSL/Transform" version"1.0"gt ltxsloutput
method"xml"/gt ltxsltemplate match"/"gt
ltxslelement name"Employers"gt
ltxslfor-each select"//employmentnot (_at_employer
precedingemployment/_at_employer)/_at_employer"
gt ltxslelement name"Employer"gt
ltxslvalue-of select"."/gt
lt/xslelementgt lt/xslfor-eachgt
lt/xslelementgt lt/xsltemplategtlt/xsltransformgt
')FROM personWHERE name 'Ken Doherty' - lt?xml version"1.0" encoding"UTF-8"?gtltEmployersgt
ltEmployergtLKPlt/Employergt ltEmployergtABBlt/Emplo
yergt ltEmployergtFFDlt/Employergt
ltEmployergtSTGlt/Employergtlt/Employersgt
56Oracle - XMLTYPE DML
- DEPRECATED Funktioner som skapar ett nytt
förändrat XML-värde - UpdateXML
- DeleteXML
- AppendXML
- InsertChildXML, InsertChildXMLBefore,
InsertChildXMLAfter - InsertXMLBefore, InsertXMLAfter
- Hela värdet i kolumnen måste uppdateras
- UPDATE person
- SET employments DML-funktion(employments, )
- WHERE
57Oracle - UPDATEXML
- Ersätter en nod med en ny
- Returnerar det förändrade XML-värdet. Originalet
påverkas inte. - SELECT UPDATEXML(employments, '//employment1
/_at_employer', 'ZZZ')FROM personWHERE pid
1 - ltrootgt ltemployment startdate"2001-08-20"
enddate"2009-02-28" employer"ZZZ"/gt
ltemployment startdate"2009-04-15"
employer"UPC"/gtlt/rootgt
58Oracle - UPDATEXML
- SELECT UPDATEXML(employments, '//root/employment1
', 'lta/gt')FROM personWHERE pid 1 - ltrootgt lta/gt ltemployment startdate"2009-04-15"
employer"UPC"/gtlt/rootgt - SELECT UPDATEXML(XMLTYPE('ltagt56lt/agt'),
'//a/text()', 'hej')FROM dual - ltagthejlt/agt
59Oracle - UPDATEXML
- SELECT UPDATEXML(employments, '//employment1/
_at_employer', XMLTYPE('lta b"abc"/gt').extract('/
/_at_b')) FROM person WHERE pid 1 - Vad förväntar man sig?
- employer-attributet ersätts av b-attributet?
- employer-attributets värde ersätts av "abc"?
60Oracle - INSERTCHILDXML
- Lägger till nya noder under alla element som
matchar ett XPath-uttryck - noll eller flera tillägg
- INSERTCHILDXML(xml, xpath, nyttnamn, nyttvärde)
- Om nyttnamn börjar med _at_ skapas ett attribut
- nyttvärde kan vara text (för attribut) eller XML
(för element) - SELECT INSERTCHILDXML(XMLTYPE('ltxgtlty u"aaa"
v"bbb" /gtlty u"ccc" v"ddd" /gtlt/xgt'), '/x/y2',
'_at_z', 'ggg')FROM dual - ltxgt lty u"aaa" v"bbb"/gt lty u"ccc" v"ddd"
z"ggg"/gtlt/xgt
61Oracle - INSERTCHILDXML
- Med element
- parameter 3 anger rotelementet i parameter 4
- parameter 4 måste vara XMLTYPE, inte text
- SELECT INSERTCHILDXML(XMLTYPE('ltxgtlty u"aaa"
v"bbb" /gtlty u"ccc" v"ddd" /gtlt/xgt'), '/x/y2',
'z', XMLTYPE('ltzgtggglt/zgt'))FROM dual - ltxgt lty u"aaa" v"bbb"/gt lty u"ccc" v"ddd"
gt ltzgtggglt/zgt lt/ygtlt/xgt
62Oracle - INSERTCHILDXMLBEFORE
- Lägger till XML-noder (ej attribut) före en annan
nod - Ange föräldern, nästa barn och den nya noden
- INSERTCHILDXMLBEFORE(xml, förälder, nästabarn,
nynod) - noll eller flera tillägg (om förälder eller
nästabarn ger en sekvens) - Nästa barn måste finnas
- SELECT INSERTCHILDXMLBEFORE( XMLTYPE('ltxgtltygt123lt
/ygtltygt456lt/ygtlt/xgt'), '/x', 'y2',
XMLTYPE('ltzgt000lt/zgt'))FROM dual - ltxgt ltygt123lt/ygt ltzgt000lt/zgt ltygt456lt/ygtlt/xgt
63Oracle - INSERTCHILDXMLBEFORE
- SELECT INSERTCHILDXMLBEFORE( XMLTYPE('ltxgtltygtltz
id "1"/gtltz id "2"/gtlt/ygt ltygtltz id "3"/gtltz id
"4"/gtlt/ygt lt/xgt'), '/x/y', 'z2',
XMLQUERY('for a in (2,3) return element F
a' RETURNING CONTENT))FROM dualltxgt
ltygt ltz id"1"/gtltFgt2lt/FgtltFgt3lt/Fgtltz id"2"/gt
lt/ygt ltygt ltz id"3"/gtltFgt2lt/FgtltFgt3lt/Fgtltz
id"4"/gt lt/ygtlt/xgt
64Oracle - INSERTCHILDXMLAFTER
- Som INSERTCHILDXMLBEFORE, men lägger den nya
noden efter varje angivet barn - SELECT INSERTCHILDXMLAFTER( XMLTYPE('ltxgtltygt123lt/
ygtltygt456lt/ygtlt/xgt'), '/x', 'y',
XMLTYPE('ltzgt000lt/zgt'))FROM dual - ltxgt ltygt123lt/ygt ltzgt000lt/zgt ltygt456lt/ygt
ltzgt000lt/zgtlt/xgt
65Oracle - INSERTXMLBEFORE
- Lägger till nya noder före en annan nod (ej
attribut) - INSERTXMLBEFORE(xml, nästanod, nyttxml)
- nästanod kan vara en sekvens
- SELECT INSERTXMLBEFORE( XMLTYPE('ltxgtltygt123lt/ygtlty
gt456lt/ygtlt/xgt'), '/x/y2', XMLTYPE('ltzgt000lt/zgt'))
FROM dual - ltxgt ltygt123lt/ygt ltzgt000lt/zgt ltygt456lt/ygtlt/xgt
66Oracle - INSERTXMLAFTER
- Som INSERTXMLBEFORE, men lägger den nya noden
efter varje angiven nod - SELECT INSERTXMLAFTER( XMLTYPE('ltxgtltygt123lt/ygtltygt
456lt/ygtlt/xgt'), '/x/y', XMLTYPE('ltzgt000lt/zgt'))FRO
M dual - ltxgt ltygt123lt/ygt ltzgt000lt/zgt ltygt456lt/ygt
ltzgt000lt/zgtlt/xgt
67Oracle - INSERTXMLAFTER
- Även kommentarnoder och PI-noder förstås
- SELECT INSERTXMLAFTER( XMLTYPE('ltxgtltygt123lt/ygtlt!-
- hmmmm --gtltygt456lt/ygtlt/xgt'), '/x/comment()',
XMLTYPE('ltzgt000lt/zgt'))FROM dual - ltxgt ltygt123lt/ygt lt!-- hmmmm --gt ltzgt000lt/zgt
ltygt456lt/ygtlt/xgt
68Oracle - APPENDCHILDXML
- Lägger till XML-noder som sista barn till en
angiven element-nod - APPENDCHILDXML(xml, förälder, nyttxml)
- förälder kan vara en sekvens
- SELECT APPENDCHILDXML( XMLTYPE('ltxgtltygt123lt/ygtltygt
456lt/ygtlt/xgt'), '/x', XMLTYPE('ltzgt000lt/zgt'))FROM
dualltxgt ltygt123lt/ygt ltygt456lt/ygt
ltzgt000lt/zgtlt/xgt
69Oracle - DELETEXML
- Tar bort noder som matchar ett XPath-uttryck
- Returnerar ett nytt XML-värde
- SELECT DELETEXML(employments, //employment_at_emplo
yer"UPC"')FROM personWHERE pid 1 - ltrootgt ltemployment startdate"2001-08-20"
enddate"2009-02-28" employer"ABB"/gtlt/rootgt - SELECT employments FROM person WHERE pid 1
- ltrootgt ltemployment startdate"2001-08-20"
enddate"2009-02-28" employer"ABB"/gt
ltemployment startdate"2009-04-15"
employer"UPC"/gtlt/rootgt
70Oracle - XML DML
- XQuery Update Facility
- några syntaxskillnader
- transform-uttryck
- (transform-klausul)
- copy-klausul
- modify-klausul
- do delete
- do insert
- do rename
- do replace
- return-klausul
- nyckelord för do insert
- before
- after
- as first into
- as last into
- into
- nyckelord för do replace
- (value of) with
- nyckelord för do rename
- as
Obs! Buggig i hantering av predikat i
XPath-uttryck
71Oracle - XML DML
- Hela XML-värdet måste uppdateras
- UPDATE Person
- SET employments XMLQUERY('transform-uttryck'
PASSING employments RETURNING
CONTENT) - WHERE
72Oracle - transform - insert
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify insert node ltagt123lt/agt as first into x
- return x
- ltrootgt ltagt123lt/agt ltagt456lt/agt ltagt789lt/agtlt/rootgt
73Oracle - transform - insert
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify insert node ltagt123lt/agt before x/a2
- return x
- ltrootgt ltagt456lt/agt ltagt123lt/agt ltagt789lt/agtlt/rootgt
- Obs! Buggigt Funkar inte med t ex predikatet
text() 780 eller . 789
74Oracle - transform - insert
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify insert node attribute c 5 into x/a2
- return x
- ltrootgt ltagt456lt/agt lta c"5"gt789lt/agtlt/rootgt
75Oracle - transform - insert
- UPDATE PersonSET employments XMLQUERY(' copy
nye e modify insert node element employment
attribute startdate "2011-09-01",
attribute employer "LBM" as last into
nye/root return nye' PASSING employments AS
"e" RETURNING CONTENT)WHERE pid 3 - SELECT employments FROM Person WHERE pid 3
- ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gt ltemployment startdate"2011-09-0
1" employer"LBM"/gtlt/rootgt
76Oracle - transform - delete
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify delete node x/a2
- return x
- ltrootgt ltagt456lt/agtlt/rootgt
- Obs! Buggigt Funkar inte med t ex predikatet
text() 780 eller . 789
77Oracle - transform - delete
- SELECT XMLQUERY('copy nye e modify delete
node nye//employment2 return nye' PASSING
employments AS "e" RETURNING CONTENT)FROM
PersonWHERE pid 3 - ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gtlt/rootgt - SELECT employments FROM person WHERE pid 3
- ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gt ltemployment startdate"2011-09-0
1" employer"LBM"/gtlt/rootgt
78Oracle - transform - delete
- UPDATE Person SET employments XMLQUERY('copy
nye e modify delete node
nye//employment2 return nye' PASSING
employments AS "e" RETURNING CONTENT) WHERE
pid 3 - SELECT employments FROM Person WHERE pid 3
- ltrootgt ltemployment startdate"2003-01-10"
employer"UPC"/gtlt/rootgt
79Oracle - transform - replace
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify replace node x/a2 with ltbgt123lt/bgt
- return x
- ltrootgt ltagt456lt/agt ltbgt123lt/bgtlt/rootgt
- Obs! Buggigt Funkar inte med t ex predikatet
text() 780 eller . 789
80Oracle - transform - replace
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify replace value of node x/a2 with 123
- return x
- ltrootgt ltagt456lt/agt ltagt123lt/agtlt/rootgt
81Oracle - transform - replace
- XQUERY
- copy x ltrootgtlta b"ccc"gt456lt/agtltagt789lt/agtlt/roo
tgt - modify replace node x/a1/_at_b with attribute f
"ddd" - return x
- ltrootgt lta f"ddd"gt456lt/agt ltagt789lt/agtlt/rootgt
82Oracle - transform - rename
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify rename node x/a2 as "b"
- return x
- ltrootgt ltagt456lt/agt ltbgt789lt/bgtlt/rootgt
83Oracle - transform - rename
- XQUERY
- copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
- modify for a in x/a
- return rename node a as "b"
- return x
- Fungerar inte. Returnerar x oförändrad
- ltrootgt ltagt456lt/agt ltagt789lt/agtlt/rootgt
84Oracle - XMLTYPE-metoder
- Om objektet är i en kolumn, måste kolumnen
kvalificeras med tabellaliasnamnet - tabellalias.kolumn.metod()
- Flera metoder motsvarar funktioner där
XML-objektet är det första argumentet - EXTRACT(xmlobjekt, xpath-uttryck)
- xmlobjekt.extract(xpath-uttryck)
85Oracle - extract
- Motsvarar funktionen EXTRACT
- Returnerar XML givet ett XPath-uttryck
- SELECT extract(employments, '//employment1'),
p.employments.extract('//employment1') FROM
person p - De två kolumnerna i resultatet är identiska.
86Oracle - existsNode
- Motsvarar funktionen EXISTSNODE
- Kontrollerar om ett XPath-uttryck matchar någon
nod - Returnerar 1 (sant) eller 0 (falskt)
- SELECT name, EXISTSNODE(employments,
'//employment_at_employer"ABB"'),
p.employments.existsNode('//employment_at_employer
"ABB"') FROM person p - John Higgins 1 1
- Stephen Hendry 1 1
- Matthew Stevens 0 0
- Ronnie O'Sullivan 0 0
- Ken Doherty 1 1
- Steve Davis 1 1
- Paul Hunter 0 0
- Neil Robertson 1 1
87Oracle - transform
- Motsvarar funktionen XMLTRANSFORM
- Den tar inte emot XSLT-dokumentet som string
- SELECT p.employments.transform(XMLTYPE('ltxsltra
nsform xmlnsxsl"http//www.w3.org/1999/XSL/Trans
form" version"1.0"gt ltxsloutput
method"xml"/gt ltxsltemplate match"/"gt
ltxslelement name"Employers"gt
ltxslfor-each select"//employment/_at_employer"gt
ltxslelement name"Employer"gt
ltxslvalue-of select"."/gt
lt/xslelementgt lt/xslfor-eachgt
lt/xslelementgt lt/xsltemplategtlt/xsltransformgt
'))FROM person pWHERE name 'Steve Davis' - ltEmployersgt ltEmployergtABBlt/Employergt
ltEmployergtLKPlt/Employergt ltEmployergtFFDlt/Employer
gtlt/Employersgt
88Oracle - getVal
- Metoder för omvandling till andra datatyper
- getNumberVal
- getStringVal Deprecated. Ersätts av SQL/XMLs
XMLSERIALIZE - getBLOBVal Deprecated. Ersätts av SQL/XMLs
XMLSERIALIZE - getCLOBVal Deprecated. Ersätts av SQL/XMLs
XMLSERIALIZE - Returnerar noden som ett värde av den valda typen
- getNumberVal kräver en nod som kan omvandlas till
nummer - SELECT XMLTYPE('lta v"44"gt55lt/agt').extract('//_at_v'
).getNumberVal() FROM DUAL - SELECT XMLTYPE('lta v"44"gt55lt/agt').extract('//tex
t()').getNumberVal() FROM DUAL
89Oracle - getRootElement
- Returnerar namnet av rotelementet
- NULL om XML-objektet är ett XML-fragment
- Deprecated. Ersätts av XQuery-funktionen
local-name - SELECT XMLTYPE('ltroten /gt').getRootElement()
FROM DUALReturnerar "roten"SELECT
EXTRACT(XMLTYPE('ltagtltb/gtltb/gtlt/agt'),'//b').getRootE
lement() FROM DUAL - eller
- SELECT XMLQUERY('for a in (1,2) return ltb/gt'
RETURNING CONTENT).getRootElement() FROM
DUALReturnerar NULL - Obs! XMLTYPE('ltb/gtltb/gt') fungerar inte.
90Oracle - getSchemaURL
- Returnerar URLen till det aktuella
XML-dokumentets XML Schema - Eller NULL om inget schema är associerat
-
- SELECT XMLTYPE('lta /gt').getSchemaURL() FROM
DUAL - Returnerar NULL
91Oracle - schema-metoder
- isSchemaValid
- Motsvarar funktionen XMLISVALID
- Man kan ange specifikt XML Schema
- Returnerar resultatet (1 eller 0)
- isSchemaValidated
- returnerar det sparade värdet
- isSchemaBased
- returnerar 0 eller 1
92Oracle - isFragment
- Kollar om ett XML-värde är ett fragment eller ett
dokument - Returnerar 1 (fragment) eller 0 (dokument)
- SELECT XMLQUERY('for a in (1,2) return ltb/gt'
RETURNING CONTENT).isFragment() FROM DUAL - Returnerar 1
- SELECT XMLTYPE('ltagtltb/gtltb/gtlt/agt').isFragment()
FROM DUAL - Returnerar 0
93Oracle - oraview
- Oracle-specifik XQuery-funktion
- tar emot namnet av en tabell/vy
- returnerar ett XML-fragment där
- varje rad är ett ROW-element
- varje kolumn är ett element med kolumnens namn
- SELECT XMLQUERY('oraview("person")' RETURNING
CONTENT) FROM dual - ltROWgtltPIDgt1lt/PIDgtltNAMEgtJohn Higginslt/NAMEgtltYEAROFB
IRTHgt1975lt/YEAROFBIRTHgtltEMPLOYMENTSgtltrootgt - ltemployment startdate"2001-08-20"
enddate"2009-02-28" employer"ABB"/gt - ltemployment startdate"2009-04-15"
employer"UPC"/gt - lt/rootgt
- lt/EMPLOYMENTSgtlt/ROWgt
- ltROWgtltPIDgt2lt/PIDgtltNAMEgtStephen Hendrylt/NAMEgtltYEARO
FBIRTHgt1973lt/YEAROFBIRTHgtltEMPLOYMENTSgtltrootgt - ltemployment startdate"2002-08-20"
enddate"2003-06-30" employer"ABB"/gt - ltemployment startdate"2003-08-01"
employer"UPC"/gt - ltemployment startdate"2006-11-01"
employer"ABB"/gt - lt/rootgt
- lt/EMPLOYMENTSgtlt/ROWgt
94Oracle - oraview
- SELECT XMLQUERY('for r in oraview("person")/ROW
PID (1,2,3) let pd r//PIDr//NAME
return element Person pd' RETURNING
CONTENT) FROM dual - ltPersongtltPIDgt1lt/PIDgtltNAMEgtJohn Higginslt/NAMEgtlt/Per
songtltPersongtltPIDgt2lt/PIDgtltNAMEgtStephen
Hendrylt/NAMEgtlt/PersongtltPersongtltPIDgt3lt/PIDgtltNAMEgtM
atthew Stevenslt/NAMEgtlt/Persongt
95Oracle - XQUERY
- Stöd för XQuery-uttryck
- XQuery-uttryck efter nyckelordet XQUERY (i
versaler) - XQUERYfor a in (1,2,3)return element Nummer
a - Tre rader i resultatetltNummergt1lt/NummergtltNummer
gt2lt/NummergtltNummergt3lt/Nummergt - XQUERYelement Resultat for a in (1,2,3)
return element Nummer a - ltResultatgt ltNummergt1lt/NummergtltNummergt2lt/Nummergtlt
Nummergt3lt/Nummergtlt/Resultatgt
96Microsoft SQL Server 2012
- Datatyp
- Stöd för validering
- Enligt SQL-standarden
- FOR XML
- OPENXML
- XML-metoder
- query (XQuery)
- value
- exist
- modify (DML)
- nodes
- Begränsat stöd för XQuery
- få funktioner
- inte alla axes
- delvis stöd för let-klausulen
97SQL Server - datatyp
- XML
- untyped - well-formed XML och XML-fragment
- typed - kopplad till ett XML Schema
- Stödjer inte DTD
- Stödjer inline DTD för t ex default-värden
- XML SCHEMA COLLECTION
- registrerar och namnger XML Schema
- används för att definiera typed XML
- CREATE XML SCHEMA COLLECTION namn AS 'schemat'
- Metoder
- query, value, exist, modify, nodes
- Begränsat stöd för XPath och XQuery
- Stödjer inte alla axes
- Stödjer inte alla funktioner
- Stödjer inte computed constructors fullt och inte
i let-klausulen
98SQL Server - typed XML
- Schemat måste läggas i en XML SCHEMA COLLECTION
- CREATE XML SCHEMA COLLECTION employments_xsd AS
'lt?xml version"1.0"?gtltxsdschema
xmlnsxsd"http//www.w3.org/2001/XMLSchema"gt
ltxsdelement name"root"gt ltxsdcomplexTypegt
ltxsdsequencegt ltxsdelement
name"employment" type"EmploymentType"
minOccurs"0" maxOccurs"unbounded" /gt
lt/xsdsequencegt lt/xsdcomplexTypegt
lt/xsdelementgt ltxsdcomplexType
name"EmploymentType"gt ltxsdattribute
name"startdate" type"xsddate" use"required"
/gt ltxsdattribute name"enddate"
type"xsddate" use"optional" /gt
ltxsdattribute name"employer" type"xsdstring"
use"required" /gt lt/xsdcomplexTypegtlt/xsdschem
agt'
99SQL Server - typed XML
- Schemat måste läggas i en XML SCHEMA COLLECTION
- default namespaces
- CREATE XML SCHEMA COLLECTION employments_xsd AS
'lt?xml version"1.0"?gtltschema
xmlns"http//www.w3.org/2001/XMLSchema"
xmlnsns"http//ns" targetNamespace"http//ns
"gt ltelement name"root"gt ltcomplexTypegt
ltsequencegt ltelement name"employment"
type"nsEmploymentType" minOccurs"0"
maxOccurs"unbounded" /gt lt/sequencegt
lt/complexTypegt lt/elementgt ltcomplexType
name"EmploymentType"gt ltattribute
name"startdate" type"date" use"required" /gt
ltattribute name"enddate" type"date"
use"optional" /gt ltattribute name"employer"
type"string" use"required" /gt
lt/complexTypegtlt/schemagt'
100SQL Server - typed XML
- Skapa kolumnen som en typed XML baserad på den
redan skapade XML SCHEMA COLLECTION - CREATE TABLE person (pid INTEGER NOT NULL
IDENTITY (1,1) PRIMARY KEY, name VARCHAR (30)
NOT NULL, yearofbirth INTEGER NOT NULL,
employments XML(employments_xsd)) - Innehållet valideras vid INSERT och UPDATE
101SQL Server SQL/XML
- Stödjer inte publiceringsfunktionerna
- FOR XML-klausul i SELECT-satsen istället
- Stödjer inte XMLQUERY, XMLTABLE, XMLEXISTS
- XML-metoder istället (delvis även OPENXML)
- Stödjer inte XMLVALIDATE
- validering sker automatiskt för typed XML
- Stödjer inte XMLCAST
- Den generella SQL-funktionen CAST räcker (även
CONVERT)
102SQL Server - OPENXML
- Omvandlar XML-data till relationsdata
- Kräver användning av procedurer
- Kan generera en rad per nod
- Default, resultatet är en så kallad edge table
- Kan generera en kolumn per angivet uttryck
- Med nyckelordet WITH
- Lämplig för batch-shredding av XML-filer
103SQL Server - FOR XML
- En extra klausul i SELECT-satser
- Omvandlar resultatet till XML enligt olika modes
- RAW
- AUTO
- EXPLICIT (bör undvikas)
- PATH
- Resultatet är alltid ett XML-värde
- Antingen fragment eller well-formed XML med
nyckelordet ROOT - Antingen serialiserat eller av XML-typen med
nyckelordet TYPE
104SQL Server - FOR XML RAW
- Varje rad blir ett element
- default elementnamn "row"
- varje kolumn blir ett attribut
- SELECT pid, name, yearofbirth FROM personWHERE
pid lt4 FOR XML RAW - ltrow pid"1" name"John Higgins"
yearofbirth"1975" /gtltrow pid"2" name"Stephen
Hendry" yearofbirth"1973" /gtltrow pid"3"
name"Matthew Stevens" yearofbirth"1982" /gt
105SQL Server - FOR XML RAW
- ROOT anger att ett rotelement skall skapas
- default elementnamn "root"
- Elementnamn kan specificeras
- rotelementet efter ROOT
- row-elementet efter RAW
- SELECT pid, name, yearofbirth FROM personWHERE
pid lt4 FOR XML RAW ('Person'), ROOT ('Folk') - ltFolkgt ltPerson pid"1" name"John Higgins"
yearofbirth"1975" /gt ltPerson pid"2"
name"Stephen Hendry" yearofbirth"1973" /gt
ltPerson pid"3" name"Matthew Stevens"
yearofbirth"1982" /gtlt/Folkgt
106SQL Server - FOR XML RAW
- ELEMENTS anger att element skall skapas istället
för attribut - elementnamnen (eller attributnamn) kan styras i
SELECT-klausulen - SELECT pid AS PersonID, name AS Namn,
yearofbirth AS FödelseÅrFROM personWHERE pid
2FOR XML RAW ('Person'), ROOT ('Folk'),
ELEMENTS - ltFolkgt ltPersongt ltPersonIDgt2lt/PersonIDgt
ltNamngtStephen Hendrylt/Namngt
ltFödelseÅrgt1973lt/FödelseÅrgt lt/Persongtlt/Folkgt
107SQL Server - FOR XML AUTO
- Skapar automatiskt element
- I enkla situationer nästan identisk med RAW
- default elementnamn tabellens/aliasets namn
- SELECT pid, name, yearofbirthFROM personWHERE
pid lt 4FOR XML AUTO - ltperson pid"1" name"John Higgins"
yearofbirth"1975" /gtltperson pid"2"
name"Stephen Hendry" yearofbirth"1973"
/gtltperson pid"3" name"Matthew Stevens"
yearofbirth"1982" /gt
108SQL Server - FOR XML AUTO
- Nästlar automatiskt
- Ett element per använd tabell (i FROM och SELECT)
- Nästlingen styrs av kolumnernas ordning i
SELECT-klausulen - ORDER BY-klausulen styr grupperingen av
subelement - SELECT pid, name AS Namn, model, brand,
yearofbirth, licencenumber, color AS FärgFROM
person AS Person, car AS BilWHERE pid lt 3 AND
owner pidFOR XML AUTOltPerson pid"1"
Namn"John Higgins" yearofbirth"1975"gt ltBil
model"Cherry" brand"NISSAN" licencenumber"ABC12
3" Färg"black" /gtlt/PersongtltPerson pid"2"
Namn"Stephen Hendry" yearofbirth"1973"gt ltBil
model"Forza" brand"FIAT" licencenumber"CCD457"
Färg"blue" /gtlt/PersongtltPerson pid"1"
Namn"John Higgins" yearofbirth"1975"gt ltBil
model"Cherry" brand"NISSAN" licencenumber"TYD22
6" Färg"black" /gtlt/Persongt
109SQL Server - FOR XML AUTO
- SELECT model, pid, name AS Namn, brand,
yearofbirth, licencenumber, color AS FärgFROM
person AS Person, car AS BilWHERE pid lt 3 AND
owner pidFOR XML AUTOltBil model"Cherry"
brand"NISSAN" licencenumber"ABC123"
Färg"black"gt ltPerson pid"1" Namn"John
Higgins" yearofbirth"1975" /gtlt/BilgtltBil
model"Forza" brand"FIAT" licencenumber"CCD457"
Färg"blue"gt ltPerson pid"2" Namn"Stephen
Hendry" yearofbirth"1973" /gtlt/BilgtltBil
model"Cherry" brand"NISSAN" licencenumber"TYD22
6" Färg"black"gt ltPerson pid"1" Namn"John
Higgins" yearofbirth"1975" /gtlt/Bilgt
110SQL Server - FOR XML AUTO
- ORDER BY-klausulen styr grupperingen av
subelement - SELECT pid, name AS Namn, brand, model,
yearofbirth, licencenumber, color AS FärgFROM
perso