Top Banner
HELIA – TIKO-05 XML ja tietokannat 1 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 XML ja tietokannat Miksi XML-dokumentteja tietokannassa? Unicode-merkistö ja XML-tietorakenne mahdollistavat yleispätevän alustariippumattoman tiedon talletusrakenteen ja sanomarakenteen tietojen välitykseen eri sovellusten kesken. Merkkipohjainen XML-dokumentti ei kuitenkaan sellaisenaan ole mikään tietokantaratkaisu. Pelkkä dokumentti ei pysty suojaamaan tietoja asiattomalta käytöltä tai muutoksilta kuten tietokanta. Se ei pysty samanaikaisuuden ja transaktioiden hallintaan ja vähänkin laajemman XML-dokumentin käsittely on hidasta. Kertaluontoinen validointi XML Schemaa käyttäen ei suojaa dokumenttia jatkuvasti eikä edes validoitaessa turvaa yksittäisen dokumentin tietojen eheyttä muiden dokumenttien tai tietokantojen tietojen kesken. Turvallisen, tehokkaan ja muuhun tiedonhallintaan integroivan infrastruktuurin XML-dokumenteilla tarjoaa oikea tietokantajärjestelmä. Client-side XML Ennen kuin DBMS-järjestelmiin alettiin toteuttamaan varsinaista XML-tiedon talletusta yksinkertainen tapa tallettaa XML-dokumentti perinteisessä relaatiotietokannassa oli tallettaa dokumentti relaatiotaulun rivin ns. CLOB-tyyppiä olevaan sarakkeeseen, ks kuva 1. CLOB tulee sanoista ”Character Larger OBject” ja se on SQL-standardin määrittämä isojen merkkijonojen talletusmuoto. Sellaisenaan tämä ei tarjonnut tukea XML-dokumentin jäsentävään käsittelyyn, vaan käsittely oli tehtävä sovellusohjelmissa tietokannan ulkopuolella. Toinen vaihtoehto oli jäsentää XML-dokumentin tiedot sovellusohjelmassa ja tallettaa tiedot ohjelmallisesti jakaen ne eri tauluihin (shredding, decomposition) ja vastaavasti koostaen (composition) XML-dokumentti aina sitä tarvittaessa ohjelmallisesti relaatiotauluista. XML document CLOB column CLOB value shredding into relational tables XML document CLOB column CLOB value shredding into relational tables Application Kuva 1 Ohjelmallinen talletus CLOB-sarakkeeseen tai ositus relaationaalisiin tauluihin
24

XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

Jul 16, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 1 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007

XML ja tietokannat

Miksi XML-dokumentteja tietokannassa? Unicode-merkistö ja XML-tietorakenne mahdollistavat yleispätevän alustariippumattoman tiedon talletusrakenteen ja sanomarakenteen tietojen välitykseen eri sovellusten kesken. Merkkipohjainen XML-dokumentti ei kuitenkaan sellaisenaan ole mikään tietokantaratkaisu. Pelkkä dokumentti ei pysty suojaamaan tietoja asiattomalta käytöltä tai muutoksilta kuten tietokanta. Se ei pysty samanaikaisuuden ja transaktioiden hallintaan ja vähänkin laajemman XML-dokumentin käsittely on hidasta. Kertaluontoinen validointi XML Schemaa käyttäen ei suojaa dokumenttia jatkuvasti eikä edes validoitaessa turvaa yksittäisen dokumentin tietojen eheyttä muiden dokumenttien tai tietokantojen tietojen kesken. Turvallisen, tehokkaan ja muuhun tiedonhallintaan integroivan infrastruktuurin XML-dokumenteilla tarjoaa oikea tietokantajärjestelmä.

Client-side XML Ennen kuin DBMS-järjestelmiin alettiin toteuttamaan varsinaista XML-tiedon talletusta yksinkertainen tapa tallettaa XML-dokumentti perinteisessä relaatiotietokannassa oli tallettaa dokumentti relaatiotaulun rivin ns. CLOB-tyyppiä olevaan sarakkeeseen, ks kuva 1. CLOB tulee sanoista ”Character Larger OBject” ja se on SQL-standardin määrittämä isojen merkkijonojen talletusmuoto. Sellaisenaan tämä ei tarjonnut tukea XML-dokumentin jäsentävään käsittelyyn, vaan käsittely oli tehtävä sovellusohjelmissa tietokannan ulkopuolella. Toinen vaihtoehto oli jäsentää XML-dokumentin tiedot sovellusohjelmassa ja tallettaa tiedot ohjelmallisesti jakaen ne eri tauluihin (shredding, decomposition) ja vastaavasti koostaen (composition) XML-dokumentti aina sitä tarvittaessa ohjelmallisesti relaatiotauluista.

XMLdocument

CLOBcolumn

CLOBvalue

shredding into relational tables

ApplicationXMLdocument

CLOBcolumn

CLOBvalue

shredding into relational tables

Application

Kuva 1 Ohjelmallinen talletus CLOB-sarakkeeseen tai ositus relaationaalisiin tauluihin

Page 2: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 2 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 Varsin pitkälle ja vähällä ohjelmoinnilla nämä relaatiotietokantatietojen ja XML-dokumenttien sovellusohjelmissa tehtävät konversiot saadaan toteutettua esimerkiksi Microsoftin .NET-arkkitehtuurissa ADO.NETin XML-palveluina. Java-arkkitehtuureissa XML-dokumenttien ohjelmallinen käsittely tapahtuu SAX-algoritmilla tai DOM-puuna. SAX-algoritmissa dokumentti luetaan kertaalleen läpi käsitellen sen kiinnostavat osat, mutta tallentamatta sitä sovelluksen muistiin. DOM-mallissa XML-dokumentin tiedot ladataan ohjelman muistiin hierarkkiseksi puurakenteeksi, jossa voidaan navigoida puun polkuja pitkin ja päivittää puuta. Päivitetty DOM-puu voidaan serialisoida XML-dokumentiksi. DOM-mallin soveltamista massiivisten XML-dokumenttien käsittelyyn rajoittaa puurakenteen vaatima tila sovelluksen rajallisessa muistiavaruudessa. Javan tietokantaliittymä JDBC 3 API olin vielä täysin suuntautunut perinteisten SQL-taulujen käsittelyyn, mutta JDBC 4 huomioi myös XML-dokumenttien käsittelyn SQL-standardin XML-laajennusten mukaisesti. Sovellusohjelmissa toteutetut muunnosratkaisut kuormittavat edelleen vastausaikoja ja DBMS-järjestelmätoimittajat ovat nyt lähteneet toteuttamaan aitoa XML-tukea itse tietokantajärjestelmissä.

Server-side XML, arkkitehtuureja ja standardeja XML-dokumenttien tietokantaratkaisuiksi on kehitetty erityisiä XML-tietokantoja, mm. Software AG:n Tamino-järjestelmä. Näiden ongelmana on niiden tietojen erillisyys valtavirran SQL-pohjaisten tietokantojen tiedoista. Toistaiseksi XML-tietokantajärjestelmät eivät ole olleet kaupallisia menestyjiä. Hierarkkinen tietomalli tietokannassa ei ole uusi asia. Jo ennen relaatiotietokantoja käytössä oli hierarkkiseen malliin perustuvia järjestelmiä, joista merkittävin ja edelleen käytössä oleva on IBM:n IMS DB. Tämä tunnetaan käsittelykielensä Data Language I mukaan myös nimellä DL/I.

Huom. Toisen merkittävän relaatiotietokantoja edeltävän tietokanta-arkkitehtuurin muodostavat verkkomalliin perustuvan ANSI:n Codasyl-standardin mukaiset järjestelmät, joiden vaikutus näkyy nykyisissä oliotietokantajärjestelmissä.

Relaatiomallin isä E.F. Codd kehittikin relaatiomallin itse asiassa yksinkertaistamaan tietokantojen käsittelyä ”vapauttaen” ohjelmoijat tietokantanavigoinnista. Tästä voidaan nyt olla montaa mieltä. Navigointi ohjelmointiparadigmana on tullut takaisin XPath, XQuery ja oliotietokantaohjelmointiin. Myös uusi SQL-standardi ja sitä toteuttavat Object-Relational DBMS-järjestelmät ovat ottaneet eroa puhtaaseen relaatiomalliin SQL:n olio- ja XML-laajennuksilla. SQL:2003-standardin XML-laajennus on määritetty sen osassa 14 ”SQL/XML” [sqlp14]. Tämä määrittää XML-tietotyypin käytettäväksi SQL-taulun sarakkeen tietotyyppinä sekä joukon julkaisufunktioita, joilla XML-dokumentti (tai XML-fragmentti) tai XML-näkymä voidaan rakentaa (composition) SQL-taulujen tiedoista.

Täydellinen XML-dokumentti alkaa XML-prologilla <?xml version= .. ?> ja yksikäsitteisellä juurielementillä. Jos nämä puuttuvat muuten XML-syntaksin mukaisesta dokumentista käytetään tästä nimitystä XML-fragmentti (fragment) tai XML CONTENT.

Page 3: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 3 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 Esimerkki 1 (sovitettu lähteestä [Che07]) – XML-tietotyyppi: Luodaan Orders-taulu seuraavasti:

CREATE TABLE Orders (orderid INTEGER, orderinfo XML );

ja kirjataan sinne rivi seuraavalla INSERT-komennolla INSERT INTO orders (orderid, orderinfo) VALUES (2, '<order> <orderdate>2007-02-14</orderdate> <customer id="WILMK"> <name>Wilman Kala</name> <zip>12345</zip> </customer> <shipnote>Freezed contents</shipnote> </order>' );

ja katsotaan mitä taulusta löytyy SELECT * FROM Orders;

orderid orderinfo ----------- ------------------------------------------------------------------------------ 2 <order><orderdate>2007-02-14</orderdate><customer id="WILMK">

<name>Wilman Kala</name><zip>12345</zip></customer> <shipnote>Freezed contents</shipnote></order>

SQL:2003-standardin XML-julkaisufunktioita (publishing functions) ovat seuraavat: XMLAGG: luo XML-elementtien kokoelmasta XML-elementtimetsän. Tällä voidaan koota

XML-dokumenttia useammalta tauluriviltä löytyvistä XML-elementeistä. XMLATTRIBUTES: generoi SQL-kyselyn palauttamat tiedot XML elementin attribuuteiksi XMLCOMMENT: generoi XML-kommentin XMLCONCAT: konkatenoi kaksi tai useampia XML-fragmenttia yhdeksi merkkijonoksi XMLELEMENT: generoi XML-elementin valitun solmun lapsielementiksi muodossa

<elementName>value</elementName> XMLFOREST: generoi relationaalisesta arvojoukosta XML-elementtien “metsä”-listan ("forest") XMLNAMESPACES: määrittää XML-elementeille käytettävät nimiavaruudet XMLPARSE: generoi merkkijonosta XML-fragmentin tehden sille XML-syntaksitarkistuksen,

mutta ei validoi tätä. XMLPI: generoi XML-dokumenttiin sen käsittelykohjeen (processing instruction) XMLSERIALIZE: serialisoi XML-dokumentin merkkijonoksi

Page 4: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 4 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 Esimerkki 2: (sovitettu lähteestä [Ste04]) Seuraava SQL/XML-lauseke

XMLELEMENT (NAME asiakas, XMLELEMENT (NAME asno, Customers.CustomerID), XMLELEMENT (NAME nimi, Customers.CustomerName))

voisi tuottaa yhdestä Customers-taulun rivin sarakkeista CustomerID ja CustomerName seuraavan asiakas-elementin: <asiakas> <asno>WILMK</asno> <nimi>Wilman Kala</nimi> </asiakas> SQL:2003-standardi oli XML-käsittelyn osalta vielä kovin keskeneräinen. Seuraavan eli SQL:2006-standardin SQL/XML versio tuntee jo W3C:n kehittämän XQuery-kyselykielen ja määrittää osin tätä hyödyntäviä funktioita, joita ovat alustavasti seuraavat [sqlp14]: XMLTABLE: määrittää relationaalisen näkymän XML-dokumenteista. XMLTEXT: generoi XQueryn tuottamasta yhden tekstisolmun tuloksesta XML-arvon. XMLCAST: määrittää conversion XML-tyypistä merkkijonoksi tai merkkijonon XML-

tyypiksi XMLDOCUMENT: generoi XQuery-kyselyn tuloksesta XML-dokumentin XMLEXISTS: testaa onko XQuery-kyselyn tulos ei-tyhjä XMLITERATE: XQuery-tuloksen läpikäynti tauluna XMLVALIDATE: validoi XML-dokumentin XMLQUERY: suorittaa XQuery-kyselyn. Esimerkki 3 (sovitettu lähteestä [Che07] – jatkaen esimerkkiä 1): Luodaan XMLTABLE-funktiota käyttävä SQL-näkymä XML-sarakkeeseen:

CREATE VIEW vOrderInfo AS SELECT X.* FROM XMLTABLE ('db2-fn:xmlcolumn("ORDERS.ORDERINFO")//customer' COLUMNS id CHAR(8) PATH '@id', name CHAR(20) PATH 'name', postcode CHAR(5) PATH 'zip', note VARCHAR(50) PATH '../shipnote' ) AS X ;

Tässä merkkijono 'db2-fn:xmlcolumn("ORDERS.ORDERINFO")//customer' on DB2:n toteutus näkymän kontekstisolmun määritykseen XML-sarakkeen dokumenteissa. Näkymän määrittämät sarakkeet poimitaan kontekstisolmusta lähtien määritettävillä XPath-lausekkeilla PATH-määreissä. Perinteisesti SQL-standardi ei ota kantaa talletusrakenteisiin, joten XML-tietotyypin talletus- (esimerkiksi mahdollinen shredding) ja indeksointiratkaisut ovat DBMS-järjestelmän toimittajan päätettävissä. (SQL:2006-standardi määrittää myös miten XML-dokumentteja voidaan päivittää, mutta tämä osuus on vielä tässä dokumentissa työn alla.)

Page 5: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 XML Schema XML-dokumentin tulee olla hyvin muodostettu (well-formed). SQL-standardin XML-tietotyyppi takaa, että XML-sarakkeeseen talletettu dokumentti on hyvin muodostettu XML-dokumentti. XML-dokumentin rakenne voidaan määrittää XML Schema -kuvauksena ja dokumenttia, joka noudattaa osoittamaansa XML Schemaa sanotaan validiksi (valid). XML Scheman sijainti määritetään URL-määrellä, joka voi paikallinen tai Internet-osoite. SQL-standardi mainitsee, että scheman tulee olla SQL-palvelimelle rekisteröity, mutta ei ota kantaa siihen miten XML Schema toteutetaan paikallisesti tietokannassa. Standardi määrittää funktion XMLVALIDATE, jolla dokumentti voidaan validoida käyttäen rekisteröityä XML Schemaa. Standardi ei ota kantaa siihen milloin XML-dokumentin validoinnin tulee tapahtua ja toimittajien toteukset ovatkin tämän osalta hyvin erilaisia. SQL-tunnusten ja XML-tunnusten muodostussäännöt ja merkistöt eivät ole täysin vastaavat joten SQL-standardi määrittää tunnusten kuvautumisia varten kuvautumissäännöt (mapping). W3C:n määrittämä XML Schema on SQL-kieltä ilmaisuvoimaisempi tietotyyppien sallittujen arvojen määrityksessä. Lähes kaikille SQL-standardin tietotyypeille löytyy XML Schema nimiavaruudesta vastaava xsd:<tietotyyppi>, jota tarvittaessa voidaan tarkentaa SQL-yhteensopivaksi sqlxml-nimiavaruuden annotaatioilla. XML Scheman facet-määreillä arvoalue on rajattavissa tarkemminkin (esim. minimi- ja maksimipituudet, pattern matching, precision, scale, jne). Seuraava esimerkki SQL-määrityksen DECIMAL(8,2) XML Schema –sovituksesta on poimittu Connollyn [Con05] kirjan luvusta 30.4

<xsd:simpleType> <xsd:restriction base = "xsd:decimal">

<xsd:precision value = "9"/> <xsd:scale value = "2"/> <xsd:annotation>

<sqlxml:sqltype name = "DECIMAL" userPrecision = "8" scale = "2">

</xsd:annotation> </xsd:restriction>

</xsd:simpleType> SQL/XML standardi kehittynee vielä. Toistaiseksi ainakin IBM ja Oracle pyrkivät toteuttamaan tätä tietokantatuotteissaan. Ongelmana on standardin kehittymisen hitaus, minkä vuoksi toimittajat ovat ehtineet tehdä jo tästä poikkeavia ratkaisuja.

Page 6: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 6 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 XQuery Varsinainen XML-standardien kehitys tapahtuu avoimena W3C:n toimesta ja tämä ei ota kantaa näiden tietokantatoteutuksiin, mutta keskeiset tietokantatoimittajat ovat alkaneet seuraamaan tätä kehitystä tuotteissaan. W3C:n XML Scheman ja XML-kyselykielen XQuery kehityksessä ovat IBM, Oracle ja Microsoft mukana ja ovat tehneet XQuery:stä jo uusiin DBMS-versioihinsa omat toteutuksensa. XQuery standardi ei sinänsä edellytä tietokantatoteutusta ja sitä toteuttavia editoreja on useita. Tunnetuimpia toteutuksia on Atovan XMLSpyn Xquery. XQuery-kyselyn ns. FLWOR-rakenne (for-let-where-order by-return) muistuttaa SQL:n SELECT-lausetta, mutta sen toiminta perustuu navigointiin. Kyselyn tulos rakennetaan RETURN-määreellä, jossa voidaan kuvata XML-fragmentti. Ohitamme tässä yhteydessä XQueryn tarkemman esittelyn, mutta jonkin kuvan kielestä antaa seuraava esimerkki 2. Esimerkki 2: (sovitettu lähteestä [Ste04]) Edellä esitellyn esimerkin 1 tulos voitaisiin tuottaa seuraavalla XQuery-kyselyllä:

FOR $c IN doc(”Customers”)/row/Customers WHERE $c/CustomerID = ”WILMK” RETURN <asiakas>

<asno>($c/CustomerID)</asno> <nimi>($c/CustomerName)</nimi>

</asiakas>

Tässä muuttuja $c on eräänlainen elementtikursori, joka käy läpi IN-määreen elementtijoukon ja josta käsin voidaan polkulausekkeilla osoittaa ja poimia RETURN-osaan muita elementtejä ja näiden attribuutteja.

Page 7: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 7 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 Server-side XML-toteutuksia

Tarkastelemme seuraavassa DB2 UDB 8.2/9.1:n, Microsoft SQL Server 2005:n ja Oracle 10gR2:n XML-toteutuksia. Verrattuna SQL-standardin näiden toteutukset poikkeavat

melkoisesti toisistaan. Keskeinen suunnitteluongelma on XML-sarakkeen talletusratkaisu: CLOB vai SQL-tauluihin purettu toteutus. Näiden vaihtoehdoksi on muodostunut "native XML" -puurakenne (binary XML). XML Scheman paikallinen talletus ja XML-sarakkeen vahva tyyppitystapa XML Schema -sidonnalla on kaikissa erilainen. CLOB-pohjaiset ratkaisut mahdollistavat XML-dokumentin lukemisen alkuperäisessä asussa (DOM fidelity), kun taas koostettaessa dokumenttia uudelleen tauluista menetetään tietosisällön kannalta merkityksettämiä ”whitespace”-merkkejä, jotka voivat vaikuttaa dokumentin ulkoasuun.

Kaikki tarkastellut DBMS-järjestelmät tarjoavat mahdollisuuksia XML-dokumentin ja dokumentin osien päivityksiin ainakin shredded-ratkaisuissa.

SQL/XML-julkaisufunktioissa on eroja. SQL Server käyttää näiden asemesta omaa SELECT FOR XML –ratkaisuaan.

XMLdocument

CLOB/ XMLcolumn

CLOBvalue

XMLcolumn shredding into

”nested tables” /”side tables”

tree

XMLcolumn

binaryunstructured structured

XMLdocument

CLOB/ XMLcolumn

CLOBvalue

XMLcolumn shredding into

”nested tables” /”side tables”

tree

XMLcolumn

binaryunstructured structured kuva 2. XML-sarakkeen CLOB, binary/tree tai shredded toteutus

Page 8: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 8 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007

DB2 XML Extender ja Information Integration (lähde [db2ext]) DB2:n XML Extender on ensimmäisiä XML-tiedon relaatiotietokantatoteutuksia. Siinä XML-dokumentti voidaan toteuttaa SQL-taulun joko

• XMLVARCHAR-tyyppisessä (user-defined) UDT-sarakkeessa (pituus korkeintaan 32672 tavua),

• XMLCLOB-tyyppisessä UDT-sarakkeessa (pituus korkeintaan 2 GB) tai • XMLFILE viittauksen osoittamassa ulkoisessa XML-tiedostossa.

XML-sarakkeen elementit ja attribuutit voidaan toteuttaa indeksoitavissa aputauluissa (side table), joihin mäppäys tapahtuu Document Access Definition (DAD) –kuvaustiedostojen perusteella. DAD-kuvausten perusteella XML-dokumentti voidaan myös tuottaa uudelleen aputauluista. XML-dokumenttien schemat ovat aikaisemmin perustuneet DTD_REF-kuvaustauluun talletettuihin DTD-määrityksiin, mutta nykyisin DB2 XML Extender tukee myös XML Scheman käyttöä. XML Schema talletetaan paikalliseen tiedostoon tietokannan ulkopuolelle ja rekisteröidään DBMS:n käyttöön XML-muotoisella DAD-tiedostolla. XML-dokumentin osia voidaan päivttää Extenderin valmiilla talletetuilla proseduureilla. Talletetussa XML-dokumentissa voidaan navigoida XPath-viittauksilla, XML-dokumentista voidaan tuottaa uusia XML-dokumentteja XLST-muunnoksilla. DB2 XML Extender ei vielä versiossa 8.2 ainakaan dokumentoi SQL-standardin SQL/XML-määrityksiä. Lähteen [Ste04] mukaan IBM tulee toteuttamaan SQL/XML:n mukaisen natiivin XML-tietotyypin ja julkaisufunktiot, kun SQL/XML-standardi on valmiimpi. Osa SQL/XML funktioista on toteutettu funktiolla XML2CLOB ja talletetuilla proseduureilla. DB2 Information Integrator (II) on IBM:n middleware ohjelmisto, jolla voidaan toteuttaa heterogeeninen hajautettu kyselytietokanta (fedarated database), jonka data source –jäseninä voi olla esimerkiksi DB2-, Oracle- ja SQL Server –instansseja. Integrator mahdollistaa myös XML Wrapperin käytön, jolla voidaan käsitellä XML-dokumenttia relationaalisesti NICKNAME-rakenteilla (vertaa SQL Serverin OPENXML-funktio).

DB2 V9 pureXML Versiossa v9.1, jota IBM kutsuu hybriditietokannaksi, on toteutettu SQL-standardin mukainen XML-tietotyyppi, SQL/XML ja XQuery-kielen toteutus relaatiotietokannan ja SQL:n rinnalla. Näistä generoituva matalamman tason suoritussuunnitelman välikieli on yhteinen, mikä mahdollistaa DB2:n palvelujen hyödyntämisen myös XML-käsittelyssä. Tämän tutkiminen tätä tekstiä varten on vielä kesken. Tarkempia tietoja löytyy lähteestä [Ste07], version manuaaleista ja esimerkiksi IBM Systems Journal lehden teemanumerosta ”Celebrating 10 Years of XML” Volume 45, Number 2, 2006.

Page 9: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 9 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007

SQL Server 2005 (ks. DBTech Pro XML and Databases workshop Heliassa 20.4.2005)

Microsoft on toteuttanut SQL Server 2005:ssä XML-tietotyypin XML-nimisenä. SQL/XML-funktioita Microsoft ei kuitenkaan ole toteuttanut, vaan SQL-taulujen tiedon julkaisu XML-muodossa ja XML-näkymien kautta toteutetaan Microsoftin omalla SELECT-lauseiden FOR XML-optioilla.

Microsoft on toteuttanut myös XML-dokumentin kuvautuvuuden SQL-näkymäksi OPENXML-funktiolla.

SELECT dname as "Name", loc as "Location", (SELECT empno as "employeeNumber",

(SELECT ename as "Name", job as "Title", mgr as "Manager", CONVERT(CHAR(10),hiredate,20) as "StartDate", sal as "Salary", comm as "Commission"

FROM Emp e -- <e> ... </e>WHERE Employee.empno = e.empnoFOR XML AUTO, TYPE, ELEMENTS) -- ~ XMLForest(...)

FROM Emp EmployeeWHERE Employee.deptno = Department.deptnoFOR XML AUTO, TYPE, -- ~ XMLAgg(XMLElement("Employee", XMLAttributes ("employeeNumber")))

ROOT('EmployeeList')) -- ~ XMLElement("EmployeeList"FROM Dept DepartmentFOR XML AUTO, ELEMENTS -- ~ XMLElement("Department")GO

Kuva 3. XML-dokumentin generointi sisäkkäisillä SELECT FOR XML -lauseilla

CREATE TABLE PublishedMedia(ISBN int PRIMARY KEY, Title varchar(50), Publisher varchar(50))

GO

CREATE PROCEDURE [dbo].[xml_insert] (@doc NTEXT)ASBEGINdeclare @idoc int-- Create the internal representationexec sp_xml_preparedocument @idoc OUTPUT, @doc-- SELECT statement using OPENXML rowset providerINSERT INTO PublishedMedia

SELECT * FROM OPENXML (@idoc, '/Books/Book', 1)WITH (ISBN int '@ISBN',

Title varchar(50) '@Title',Publisher varchar(50) '@Publisher')

-- Remove the internal representationEXEC sp_xml_removedocument @idocENDGO

Kuva 4. OPENXML-esimerkki

Page 10: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 10 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 XML-tietotyypin validointi perustuu tietokantaan SCHEMACOLLETION-rakenteisiin tallettuihin XML Schemoihin.

XML-dokumentin osia voidaan päivittää XML-sarakkeiden XML DML –kielilaajennuksen modify-metodeilla ja dokumenttia voidaan tutkia XML-sarakkeiden query-metodilla, jossa kyselylause kirjoitetaan XQuery-kielellä. Microsoftin XQuery-toteutuksessa ei ole XQueryn LET-määrettä.

strongly typed XML column:col XML(schemaCollection)table

XML documentsin the table:

schemaCollection

<schema ……

</schema>

<schemaN ……

</schemaN>

<doc1 xmlns=……

</doc1>

<doc1 xmlns=……

</doc1>

<docN xmlns=……

</docN>

id

schema versionsor different schemas

strongly typed XML column:col XML(schemaCollection)table

XML documentsin the table:

schemaCollection

<schema ……

</schema>

<schemaN ……

</schemaN>

<doc1 xmlns=……

</doc1>

<doc1 xmlns=……

</doc1>

<docN xmlns=……

</docN>

id

schema versionsor different schemas

Kuva 5. Vahvasti tyypitetty XML-sarake

Page 11: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 11 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007

Oracle XML DB (ks. DBTech Pro XML and Databases workshop Heliassa 21.4.2005 http://myy.helia.fi/~dbms/seminars/dbtechprows4/Day2/Oracle10XmlDb.pdf)

Oraclen XML DB on monipuolisin ja lähinnä SQL-standardin SQL/XML-osaa oleva XML-toteutus. XML-dokumentti voidaan toteuttaa XMLtype-tyyppisessä SQL-taulun sarakkeessa. Dokumenttien validointi perustuu XML Schema-määrityksiin, jotka on talletettu XML DB:n repositoryyn. XML DB:n repository on kannassa toteutettu tiedostojärjestelmä, jota voidaan käsitellä XML DB:n HTTP-palvelujen kautta WebDAV-protokollalla tai XML DB:n FTP-palvelun kautta.

XML-sarakkeen talletusratkaisu voi perustua CLOB-pohjaiseen toteutukseen tai Oraclen ”Nested Tables” –rakenteeksi kutsumaan aputaulu-pohjaiseen toteutukseen (native structured XML storage). Nested Tables –ratkaisu voidaan generoida XML Schemaan lisättyjen annotaatioden ohjaamana.

Kuva 6. Oracle XML DB:n talletusratkaisut ja saantitavat lähde: [Ada05] Oracle XML DB Developer’s Guide, 10g Release 2

Page 12: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 12 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 Nested Tables –toteutuksessa voidaan hyödyntää indeksejä ja päivittää dokumentin osia XPath-pohjaisesti. DBMS muuntaa käsittelyn SQL-pohjaiseksi ja käyttää suoritussuunnitelman laskemiseen SQL-optimoijaa. Oraclen toteutuksessa XML-dokumenttien eheyttä voidaan valvoa UNIQUE ja FOREIGN KEY –rajoitteilla. Foreign Key –määreet voivat viitata myös SQL-tauluihin. Seuraavat esimerkit on poimittu Oraclen XML-demosta, missä purchaseorder-taulu on XMLtype-tyyppiä eli se on luotu komennolla

CREATE TABLE purchaseorder OF XMLType ; (ilman sarakemäärityksiä) ja sinne talletetaan ostotilausten XML-dokumentteja.

ALTER TABLE purchaseorder ADD CONSTRAINT reference_is_unique UNIQUE (XMLDATA."Reference") / Tämä määrittää dokumenttien Reference-elementit yksikäsitteisiksi siten ettei samaa arvoa voi esiintyä missään muussa taulun dokumentissa! ALTER TABLE purchaseorder ADD CONSTRAINT user_is_valid FOREIGN KEY (XMLDATA."User") REFERENCES scott.emp(ename) / Tämä määrittää User-elementin arvot viiteavaimiksi, joiden arvojen täytyy löytyä jostakin Scott-käyttäjän EMP-taulun rivin ename-sarakkeesta.

Oracle 10gR2 toteuttaa kaikki SQL/XML-standardin julkaisufunktiot (myös lähteen [sqlp14] alustavat laajennukset) ja on toteuttanut seuraavat laajennukset: XMLSEQUENCE: palauttaa XMLtype-kokoelman, jota voidaan käsitellä SELECT-lauseessa

tauluna. XMLROOT: luo parametrina saamastaan XML-elementistä XML-dokumentti-instanssin, jossa

XML-elementin eteen on lisätty XML-prolog. XML-dokumentin käsittelyyn Oracle on toteuttanut seuraavat SQL/XML-funktiot: existsNode: palauttaa arvon 1 (true), jos XML-documentista löytyy parametrina annettu

XPath-lausekkeen osoittama solmu, ja muuten 0 (false). extract: palauttaa XPath-lausekkeen osoittaman solmun XML-dokumenttina tai usean

solmun joukon XML-fragmenttina. extractValue: poimii Xpath-lausekkeen osoittaman solmun tekstiarvon SQL:n vastaavaan

tietotyyppiin muunnettuna. updateXML: päivittää uudet arvot parametrina annettujen XPath-lausekkeiden osoittamille

solmuille XML-dokumentissa. Oracle on lisäksi toteuttanut XML-dokumenttien käsittelyyn myös erillisiä PL/SQL paketteja, joista esimerkiksi DBMS-SQLGEN on tarkoitettu XML-dokumenttien generointiin ja DBMS_XDB käsittelee XML DB:n repositoria. Oraclen versiossa 10gR2 on myös XQuery-kielen tuki itsenäisenä XQUERY-komentona sekä SQL-lauseissa käytettävänä SQL/XML-standardin (luonnoksen) mukaisena XMLQuery-funktiona. Oracle on toteuttanut myös SQL/XML-standardin (luonnoksen) mukaisen

Page 13: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 13 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 XMLTable-funktion, jolla XMLQueryn tulos muunnetaan virtuaaliseen SQL-tauluun ja tätä voidaan edelleen käyttää SQL-lauseissa taululausekkeena. Oracle XML DB toteuttaa XML / SQL duaalisuuden (XML/SQL duality) periaatteen eli XML-dokumentteihin voidaan luoda SQL-näkymät ja SQL-tauluihin voidaan luoda XML-näkymät. Näin XQuery-kyselyjä voidaan kohdistaa myös SQL-tauluihin. Oraclen XQuery-toteutuksissa on käytettävissä seuraavat nimiavaruudet:

Näistä ora-nimiavaruudesta löytyy käteviä Oracle funktiolaajennuksia, joista ora:view toteuttaa SQL-taululle automaattisesti XML-näkymän siten että riveistä tulee ROW-elementtejä ja sarakkeista elementtejä, joiden nimet kirjoitetaan isoilla kirjaimilla. Seuraava iSQLPlus:lla ajettu XQUERY-esimerkki listaa Scott-käyttäjän EMP-taulusta kaikki osaston 10 työntekijät:

SET LONG 1000 SET LINESIZE 200 XQUERY for $e in ora:view("emp") where $e/ROW/DEPTNO= 10 return $e /

Result Sequence

<ROW><EMPNO>9901</EMPNO><ENAME>DRAKE</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-09-01</HIREDATE><SAL>4000</SAL><COMM>0</COMM><DEPTNO>10</DEPTNO></ROW>

<ROW><EMPNO>7782</EMPNO><ENAME>CLARK</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-06-09</HIREDATE><SAL>2450</SAL><DEPTNO>10</DEPTNO></ROW>

<ROW><EMPNO>7839</EMPNO><ENAME>KING</ENAME><JOB>PRESIDENT</JOB><HIREDATE>1981-11-17</HIREDATE><SAL>5000</SAL><DEPTNO>10</DEPTNO></ROW>

<ROW><EMPNO>7934</EMPNO><ENAME>MILLER</ENAME><JOB>CLERK</JOB><MGR>7782</MGR><HIREDATE>1982-01-23</HIREDATE><SAL>1300</SAL><DEPTNO>10</DEPTNO></ROW>

lähde: Oracle XML DB Developer’s Guide, taulukko 17-1

Page 14: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 14 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 ja seuraava kysely sarakkeiden empno, ename ja sal tiedot niistä, joiden palkka on yli 3000 dollaria

XQUERY for $e in ora:view("emp") where $e/ROW/SAL > 3000 return <emp> {$e/ROW/EMPNO}{$e/ROW/ENAME}{$e/ROW/SAL} </emp> /

Esimerkkinä XMLQuery-funktion käytöstä tarkastelemme kyselyä, joka listaa kaikkien osastojen tiedot DEPT-taulusta

SELECT XMLQuery(' for $d in ora:view("DEPT") order by $d/ROW/DEPTNO return $d' returning content) AS output FROM DUAL /

OUTPUT

<ROW><DEPTNO>10</DEPTNO><DNAME>ACCOUNTING</DNAME><LOC>NEW YORK</LOC></ROW> <ROW><DEPTNO>20</DEPTNO><D NAME>RESEARCH</DNAME><LOC>DALLAS</LOC></ROW> <ROW><DEPTNO>30</DEPTNO><DNAME>SALES</DNAME><LOC>CHICAGO </LOC></ROW> <ROW><DEPTNO>40</DEPTNO><DNAME>OPERATIONS</DNAME><LOC>BOSTON</LOC></ROW>

DUAL on Oraclen virtuaalinen yhden rivin taulu, jota hyödynnetään yleisesti pelkkiä funktioita tai systeemitietoja kuten esimerkiksi CURRENT_DATE listattaessa. Seuraava XMLQuery-liitosesimerkki listaa niiden työntekijöiden nimen ja osastonimen niiltä, joiden palkka on yli 3000 dollaria, tehden jokaiselle työntekijälle oman <emp>-elementin ja tulossarakkeista elementin attribuutit:

SELECT XMLQuery(' for $e in ora:view("EMP"), $d in ora:view("DEPT") where $e/ROW/DEPTNO = $d/ROW/DEPTNO and $e/ROW/SAL>3000 order by $e/ROW/EMPNO return <emp ename="{$e/ROW/ENAME}" dept="{$d/ROW/DNAME}"/>' returning content) AS output FROM DUAL /

OUTPUT

<emp ename="KING" dept="ACCOUNTING"></emp><emp ename="DRAKE" dept="ACCOUNTING"></emp>

Page 15: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 15 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 SQL-taulujen XML-näkymän kautta tai Nested Tables –tauluihin talletettuihin XML-dokumentteihin kohdistuvat XPath- ja XQuery-kyselyt kääntyvät Oracle XML DB:n sisäisessä esitysmuodossa SQL-lauseiksi joille Oraclen optimoija ratkaisee lopullisen suoritussuunnitelman. Jos edellinen esimerkki ajetaan AUTOTRACE-tilassa, saadaan tästä seuraava suoritussuunnitelmaraportti:

Seuraava esimerkki näyttää miten XMLQuery voi käsitellä suoraan XML-dokumenttitiedostoja (lähde: Oracle XML DB Developer’s Guiden [Ada05] XQuerya esittelevä luku 17). Luodaan ensin XML DB:n repositoryn hakemistoon public XML-dokumentit emps.xml ja depts.xml: DECLARE res BOOLEAN; empsxmlstring VARCHAR2(300):= '<?xml version="1.0"?> <emps> <emp empno="1" deptno="10" ename="John" salary="21000"/> <emp empno="2" deptno="10" ename="Jack" salary="310000"/> <emp empno="3" deptno="20" ename="Jill" salary="100001"/> </emps>'; deptsxmlstring VARCHAR2(300):= '<?xml version="1.0"?> <depts> <dept deptno="10" dname="Administration"/> <dept deptno="20" dname="Marketing"/> <dept deptno="30" dname="Purchasing"/> </depts>'; BEGIN res := DBMS_XDB.createResource('/public/emps.xml', empsxmlstring); res := DBMS_XDB.createResource('/public/depts.xml', deptsxmlstring); END;

Page 16: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 16 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 / Seuraavassa SELECT-lauseen XMLQuery-funktiolla tulostetaan XQuery-kyselyn tulos. Kysely hakee emps.xml-dokumentista työntekijät, joiden vuosipalkka on yli 100000 dollaria, ja tulostaa näiden nimet sekä liitoksella haetun osaston nimen depts.xml-dokumentista: SELECT XMLQuery('for $e in doc("/public/emps.xml")/emps/emp

let $d := doc("/public/depts.xml")//dept[@deptno = $e/@deptno]/@dname where $e/@salary > 100000 order by $e/@empno return <emp ename="{$e/@ename}" dept="{$d}"/>'

RETURNING CONTENT) FROM DUAL; XMLQUERY('FOR$EINDOC("/PUBLIC/EMPS.XML")/EMPS/EMPLET$D:=DOC("/PUBLIC/DEPTS.XML") -------------------------------------------------------------------------------- <emp ename="Jack" dept="Administration"/> <emp ename="Jill" dept="Marketing"/>

Page 17: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 17 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 XSL / XSLT Oracle XML DB tarjoaa infrastruktuurin myös XSL / XSLT-käsittelyyn. Oracle XML DB tarjoaa 3 tapaa käyttää XSL-prosessointia:

• SQL-funktion XMLtrasform • XMLType:n metodin transform( ) • PL/SQL paketin DBMS_XSLPROCESSOR

Nämä kaikki odottavat sekä muokattavan XML-dokumentin että muokkausta ohjaavan XSL-tyylisivun olevan XMLType-objekteja jossakin XML DB:n taulussa tai XML-dokumentteina XML DB:n repositorissa. Nämä tietokantaan talletetut dokumentit voivat olla täysin samanlaisia kuin ne olisivat tavallisessa tiedostomuodossa. Muunnoksen tuloksen oletetaan myös olevan validi XHTML-dokumentti eli sekä validi XML- että validi HTML-dokumentti. Muunnoskäsittely tapahtuu tietokantapalvelimessa optimoituna. XML Schema -pohjaisten dokumenttien osalta XML DB voi luottaa näiden validisuuteen ja käsiteltävä virtuaalinen DOM-puu voidaan instantioida muistiin "lazy load"-pohjaisesti vain sitä mukaa kuin tarvitaan. Tämä säästää sekä tarvittavaa muistia että prosessointityötä.

* * *

XML doc

XML Schemadoc

DBMS_XMLSCHEMA.RegisterSchema

url

CREATE TABLE xml_tabid number,xmlcol XMLType)XMLType COLUMN xmlcolXMLSCHEMA"<url>"ELEMENT "<elementname>"

xml_tabid xmlcol

INSERT

CREATE TABLE xsl_tabid number,stylesheet XMLType)

xsl _tabid stylesheet

XSL docINSERT

SELECT XMLTransform(X.xmlcol,(SELECT stylesheet FROM xsl_tabWHERE id = 1)).getStringVal( )

AS resultFROM xml_tab X

1

XML doc

result

XML doc

XML Schemadoc

DBMS_XMLSCHEMA.RegisterSchema

url

CREATE TABLE xml_tabid number,xmlcol XMLType)XMLType COLUMN xmlcolXMLSCHEMA"<url>"ELEMENT "<elementname>"

xml_tabid xmlcol

INSERT

CREATE TABLE xsl_tabid number,stylesheet XMLType)

xsl _tabid stylesheet

XSL docINSERT

SELECT XMLTransform(X.xmlcol,(SELECT stylesheet FROM xsl_tabWHERE id = 1)).getStringVal( )

AS resultFROM xml_tab X

1

XML doc

result

Kuva xslt. Skenaario XML Schema -pohjaisen dokumentin XSLT-käsitelystä

Page 18: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 18 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 Lähteet: [Ada05] Drew Adams: “Oracle XML DB Developer’s Guide, 10g Release 2”, Oracle, 2005 [db2ext] DB2 “XML Extender Administration and Programming”, Version 8.2, IBM, 2004 [Che07] Chen et al: “DB2 9 pureXML Guide”, IBM Redbooks, 2007 [Con05] Connolly and Begg: “Database Systems”, 4th ed., Addison-Wesley, 2005 [sqlp14] SQL-200n Part 14 XML-Related Specifications (SQL/XML), draft 2006-04-18 [sqlx05] http://www.sqlx.org (6.12.2005) [Ste04] Steegmans et al: ”XML for DB2 Information Integration”, IBM Redbooks, 2004

Page 19: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 19 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007

Harjoitukset Info9-palvelimen TUX2-instanssiin on toteutettu Oraclen XML-demon rakenteita ja ICT03-käyttäjille on järjestetty riittävät XML-harjoituksen käyttöoikeudet. XQueryn tuki on toteutettu vasta Oracle 10gR2:sta alkaen, joten sitä ei nyt kokeilla. Harjoitus 1. Käynnistä iSQLPlus istunto tunnuksellasi selaimella osoitteesta http://info9.helia.fi:7780/isqlplus Kokeile ajaa seuraavat komennot. Selitä mitä tapahtuu, miksi ja miten korjaisit: CREATE TABLE myTab ( id INT PRIMARY KEY, xml XMLtype ) ; INSERT INTO myTab (id, xml) VALUES (1, XMLTYPE('<?xml version="1.0"?><blah>')); INSERT INTO myTab (id, xml) VALUES (2, XMLTYPE('<?xml version="1.0"?><blah></blah>')); INSERT INTO myTab (id, xml) VALUES (3, XMLTYPE('<?xml version="1.0"?><blah/>')); INSERT INTO myTab (id, xml) VALUES (4, XMLTYPE('<hello/>')); INSERT INTO myTab (id, xml) VALUES (5, XMLTYPE('<?xml version="1.0"?><Hello>Hello world!</hello>')); INSERT INTO myTab (id, xml) VALUES (6, XMLTYPE('<?xml version="1.0"?><t1>liirum<t2></t1>laarum</t2>')); INSERT INTO myTab (id, xml) VALUES (7, XMLTYPE('<?xml version="1.0"?><t1>laarum</t1><t2>liirum</t2>')); INSERT INTO myTab (id, xml) VALUES (8, XMLTYPE('<t1>liirum<t2>laarum</t2></t1>')); SELECT * FROM myTab; ROLLBACK; SELECT * FROM myTab; COMMIT; Harjoitus 2. Kokeile myös seuraavia komentoja. Miten nämä eroavat harjoituksen 1 komennoista? CREATE TABLE myXML OF XMLtype ; INSERT INTO myXML VALUES (XMLTYPE('<?xml version="1.0"?><blah>')); INSERT INTO myXML VALUES (XMLTYPE('<?xml version="1.0"?><blah/>'));

Page 20: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 20 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 INSERT INTO myXML VALUES (XMLTYPE('<hello/>')); INSERT INTO myXML VALUES (XMLTYPE('<?xml version="1.0"?><Hello>Hello world!</hello>')); INSERT INTO myXML VALUES (XMLTYPE('<?xml version="1.0"?> <t1>liirum<t2></t1>laarum</t2>')); SELECT * FROM myXML; ROLLBACK; Harjoitus 3. CLOB ja XMType –sarakkeiden suoritusaikavertailu. Seuraava testi on poimittu Sean Dillonin Oracle Magazine March/April 2005 artikkelista ” Which Storage XML?” -- XML as a CLOB drop table xmlclobs; drop table xmldocs; CREATE TABLE xmlclobs ( xmlclobs CLOB ); CREATE TABLE xmldocs ( x XMLtype ); set serveroutput on; DECLARE l_start timestamp; l_elapsed interval day to second(4); BEGIN l_start := systimestamp; for i in 1 .. 1000 loop INSERT INTO xmlclobs VALUES ('<?xml version="1.0"?><blah/>'); end loop; l_elapsed := systimestamp - l_start; dbms_output.put_line('CLOB:'||to_char(l_elapsed)); l_start := systimestamp; for i in 1 .. 1000 loop insert into xmldocs values (xmltype( '<?xmlversion="1.0"?> <blah/>')); end loop; l_elapsed := systimestamp - l_start; dbms_output.put_line('XMLType:'||to_char(l_elapsed)); END; / -- XML Using Object-Relational Storage -- Tähän tarvitaan ALTER SESSION oikeus

Page 21: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 21 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 alter session Set events='31098 trace name context forever' / -- talletetaan XML Schema People.xsd XML DB:n repositoryyn DECLARE res BOOLEAN; schemaString VARCHAR2(1000):= '<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <xsd:element name="Person" type="PersonType"/> <xsd:complexType name="PersonType"> <xsd:sequence> <xsd:element name="FirstName"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="30"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="LastName"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="50"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="DateOfBirth" type="xsd:dateTime"/> </xsd:sequence> </xsd:complexType> </xsd:schema>'; BEGIN res := DBMS_XDB.createResource('/public/People.xsd', schemaString); END; / -- rekisteröidään XML Schema: BEGIN DBMS_XMLSCHEMA.registerSchema ('http://localhost:8080/public/People.xsd', xdbURIType('/public/People.xsd').getClob(), TRUE,TRUE,FALSE,TRUE ); End; / -- tehdään uudet taulut drop table xmlclobs; drop table xmldocs; -- CREATE TABLE xmlclobs ( xmlclobs XMLtype ); -- CREATE TABLE xmldocs OF XMLtype

Page 22: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 22 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 xmlschema "http://localhost:8080/public/People.xsd" element "Person"; -- mitataan 1000 dokumentin lisäyksen aika set serveroutput on; DECLARE l_xml xmltype; l_start timestamp; l_elapsed interval day to second(4); BEGIN l_xml := xmltype( '<?xml version="1.0"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://localhost:8080/public/People.xsd"> <FirstName>Sean</FirstName> <LastName>Dillon</LastName> <DateOfBirth>1971-05-18</DateOfBirth> </Person>'); -- l_start := systimestamp; for i in 1 .. 1000 loop INSERT INTO xmlclobs VALUES ( l_xml ); end loop; l_elapsed := systimestamp - l_start; dbms_output.put_line('XMLclobs:'||to_char(l_elapsed)); -- l_start := systimestamp; for i in 1 .. 1000 loop INSERT INTO xmldocs VALUES ( l_xml ); end loop; l_elapsed := systimestamp - l_start; dbms_output.put_line('XMLdocs:'||to_char(l_elapsed)); END; / Tässä nähdään myös esimerkki Oraclen PL/SQL-kielen ohjelmointiominaisuuksista. Harjoitus 4. Testataan XML Scheman vaikutusta lisättäessä XML-dokumentteja seuraavilla komennoille edellisen tehtävän tauluun xmldocs: -- tyhjennetään taulu ensin DELETE FROM xmldocs; COMMIT; -- kokeillaan lisäyksiä INSERT INTO xmldocs VALUES( '<?xml version="1.0"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://localhost:8080/public/People.xsd"> <FirstName>Mickey</FirstName>

Page 23: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 23 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 <LastName>Mouse</LastName> <DateOfBirth>1930-01-01</DateOfBirth> </Person>') / INSERT INTO xmldocs VALUES( '<?xml version="1.0"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://localhost:8080/public/People.xsd"> <FirstName>Minny</FirstName> <LastName>Mouse</LastName> <DateOfBirth>1935-05-01</DateOfBirth> </Person>') / INSERT INTO xmldocs VALUES( '<?xml version="1.0"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://localhost:8080/public/People.xsd"> <FirstName>Sean</FirstName> <LastName>Connery</LastName> <DateOfBirth>1940-13-18</DateOfBirth> </Person>') / INSERT INTO xmldocs VALUES( '<?xml version="1.0"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://localhost:8080/public/People.xsd"> <LastName>Connery</LastName> <FirstName>Sean</FirstName> <DOB>1940-05-18</DOB> </Person>') / INSERT INTO xmldocs VALUES( '<?xml version="1.0"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://localhost:8080/public/People.xsd"> <FirstName>Donald</FirstName> <LastName>Duck</LastName> <BirthPlace>Hollywood</BirthPlace> <DateOfBirth>1930-12-24</DateOfBirth> </Person>') / Laadi vielä yksi komento, jolla lisäät jonkun uuden henkilön tiedot xmldocs-tauluun.

Page 24: XML ja tietokannat5 - Haaga-Helia ammattikorkeakoulumyy.haaga-helia.fi/~ict1td003/rdbms/mats/XML_ja_tietokannat.pdf · HELIA – TIKO-05 XML ja tietokannat 5 ( 24) ICT03D Tieto ja

HELIA – TIKO-05 XML ja tietokannat 24 ( 24) ICT03D Tieto ja tiedon varastointi Martti Laiho 13.12.2007 Harjoitus 5. Kokeillaan XPath-kyselyjä ja päivityksiä: -- onko tällaista dokumenttia? SELECT existsNode(value(X), '/Person[FirstName="Mickey"]') FROM xmldocs X / -- keitä nämä ovat? SELECT extract(OBJECT_VALUE,'/Person/FirstName') FROM xmldocs WHERE existsNode(OBJECT_VALUE,'/Person[LastName="Mouse"]') = 1 / -- päivitetään Mickeyn syntymäpäivä UPDATE xmldocs SET OBJECT_VALUE = updateXML(OBJECT_VALUE,'/Person/DateOfBirth/text()','1930-12-08') WHERE existsNode(OBJECT_VALUE,'/Person[FirstName="Mickey"]') = 1 / Huom. OBJECT_VALUE on pseudosarake (pseudocolumn) jota voidaan käyttää (oliopohjaisen) XMLtype taulun aliasnimenä Oracle 10gR2:ssa korvaten aikaisemman value(x) -aliasnimen. Harjoitus 6. XML/SQL Duality luodaan SQL-näkymä xmldocs-taulun XML-dokumentteihin CREATE OR REPLACE VIEW People_View (fname, lname, DOB) AS SELECT extractValue(value(p),'/Person/FirstName'), extractValue(value(p),'/Person/LastName'), extractValue(value(p),'/Person/DateOfBirth') FROM xmldocs p / DESCRIBE People_View / SELECT * FROM People_View / Harjoitus 7. *** Sovella harjoituksia 3 ja 4 siten, että kopioit XML Scheman, lisäät siihen ID-elementin (kokonaislukutyyppiä), lisäät ID-elementit harjoituksen 4 XML-dokumentteihin ja näille uuden taulun, jossa sovelletaan muokkaamaasi XML Schemaa ja johon määrität ID-elementin yksikäsitteiseksi (unique) koko taulussa. Laadi myös yksikäsitteisyyden testaava ”tupladokumentti”.