IV1023 ht2013 Avancerad Datahantering med XML Propriet - PowerPoint PPT Presentation

About This Presentation
Title:

IV1023 ht2013 Avancerad Datahantering med XML Propriet

Description:

Title: F rel sning SQL Author: nikos dimitrakas Last modified by: nikos dimitrakas Created Date: 1/6/1999 3:00:23 PM Document presentation format – PowerPoint PPT presentation

Number of Views:72
Avg rating:3.0/5.0
Slides: 140
Provided by: nikos4
Category:

less

Transcript and Presenter's Notes

Title: IV1023 ht2013 Avancerad Datahantering med XML Propriet


1
IV1023 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
2
Leverantörer/Produkter
  • IBM
  • DB2 10.5
  • Oracle
  • Oracle Database 12c
  • Microsoft
  • SQL Server 2012

3
IBM 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.

4
Oracle 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.

5
Microsoft 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

6
Exempeldata
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
7
Exempeldata
  • 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

8
Exempeldata
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
9
DB2 - 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

10
DB2 - XML Schema Repository
  • Stöd för XML Schema och DTD
  • REGISTER XMLSCHEMA
  • ADD XMLSCHEMA
  • COMPLETE XMLSCHEMA
  • UPDATE XMLSCHEMA
  • REGISTER XSROBJECT

11
DB2 - 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)

12
DB2 - 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

13
DB2 - 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

14
DB2 - 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

15
DB2 - 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

16
DB2 - 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

17
DB2 - 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

18
DB2 - 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

19
DB2 - 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

20
DB2 - 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'

21
DB2 - 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

22
DB2 - 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

23
DB2 - 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

24
DB2 - 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

25
DB2 - 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

26
DB2 - 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

27
DB2 - XML DML
  • Hela XML-värdet måste uppdateras
  • UPDATE Person
  • SET employments XMLQUERY('transform-uttryck'
    PASSING employments)
  • WHERE

28
DB2 - 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

29
DB2 - 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

30
DB2 - 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

31
DB2 - 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

32
DB2 - transform - delete
  • xquery
  • transform
  • copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
  • modify do delete x/atext() 789
  • return x
  • ltrootgt ltagt456lt/agtlt/rootgt

33
DB2 - 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

34
DB2 - 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

35
DB2 - 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

36
DB2 - 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

37
DB2 - 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

38
DB2 - 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

39
DB2 - 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

40
Oracle - 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

41
Oracle 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.

42
Oracle - 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

43
Oracle - andra funktioner
  • XMLCDATA
  • XMLISVALID
  • XMLCOLATTVAL
  • EXTRACT
  • EXTRACTVALUE
  • EXISTSNODE
  • XMLSEQUENCE
  • XMLTRANSFORM
  • Deprecated
  • UPDATEXML
  • APPENDCHILDXML
  • INSERTCHILDXML
  • INSERTCHILDXMLAFTER
  • INSERTCHILDXMLBEFORE
  • INSERTXMLAFTER
  • INSERTXMLBEFORE
  • DELETEXML

44
Oracle - XMLTYPE
  • Metoder (ibland kallade medlemsfunktioner "member
    functions")
  • extract
  • existsNode
  • transform
  • isSchemaValidated
  • isSchemaValid
  • isSchemaBased
  • isFragment
  • getStringVal
  • getNumberVal
  • getCLOBVal
  • getBLOBVal
  • getNamespace
  • getRootElement
  • getSchemaURL

45
Oracle - 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

46
Oracle - XMLISVALID
  • Motsvarar SQL/XMLs XMLVALIDATE
  • implicit schemaXMLISVALID(xmlvärde)
  • explicit schemaXMLISVALID(xmlvärde, schemanamn)

47
Oracle - 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

48
Oracle - 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

49
Oracle - 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

50
Oracle - 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

51
Oracle - 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

52
Oracle - 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

53
Oracle - 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

54
Oracle - 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

55
Oracle - 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

56
Oracle - 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

57
Oracle - 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

58
Oracle - 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

59
Oracle - 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"?

60
Oracle - 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

61
Oracle - 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

62
Oracle - 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

63
Oracle - 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

64
Oracle - 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

65
Oracle - 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

66
Oracle - 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

67
Oracle - 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

68
Oracle - 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

69
Oracle - 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

70
Oracle - 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
71
Oracle - XML DML
  • Hela XML-värdet måste uppdateras
  • UPDATE Person
  • SET employments XMLQUERY('transform-uttryck'
    PASSING employments RETURNING
    CONTENT)
  • WHERE

72
Oracle - 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

73
Oracle - 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

74
Oracle - 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

75
Oracle - 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

76
Oracle - 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

77
Oracle - 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

78
Oracle - 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

79
Oracle - 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

80
Oracle - 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

81
Oracle - 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

82
Oracle - transform - rename
  • XQUERY
  • copy x ltrootgtltagt456lt/agtltagt789lt/agtlt/rootgt
  • modify rename node x/a2 as "b"
  • return x
  • ltrootgt ltagt456lt/agt ltbgt789lt/bgtlt/rootgt

83
Oracle - 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

84
Oracle - 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)

85
Oracle - 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.

86
Oracle - 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

87
Oracle - 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

88
Oracle - 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

89
Oracle - 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.

90
Oracle - 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

91
Oracle - 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

92
Oracle - 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

93
Oracle - 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

94
Oracle - 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

95
Oracle - 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

96
Microsoft 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

97
SQL 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

98
SQL 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'

99
SQL 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'

100
SQL 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

101
SQL 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)

102
SQL 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

103
SQL 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

104
SQL 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

105
SQL 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

106
SQL 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

107
SQL 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

108
SQL 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

109
SQL 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

110
SQL 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
Write a Comment
User Comments (0)
About PowerShow.com