Alfred Moos XQuery und SQL/XML in DB2-Datenbanken
Aus dem Programm
Datenbanken und Softwareentwicklung
Weitere Titel des Autors: Datenbank-Engineering von A. Moos
Datenbankentwicklung in IT-Berufen von H. Burnus Softwareentwicklung kompakt und verständlich von H. Brandt-Pook und R. Kollmeier Software Engineering von R. Dumke Grundkurs Datenbankentwurf von H. Jarosch SQL mit ORACLE von W.-M. Kähler Grundkurs Datenbankentwicklung von S. Kleuker Grundkurs Software-Entwicklung mit C++ von D. May Java will nur spielen von S. E. Panitz Grundkurs Relationale Datenbanken von R. Steiner
www.viewegteubner.de
Alfred Moos
XQuery und SQL/XML in DB2-Datenbanken Verwaltung und Erzeugung von XML-Dokumenten in DB2 Mit 70 Abbildungen STUDIUM
Bibliografische Informationd der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über abrufbar.
Das in diesem Werk enthaltene Programm-Material ist mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Der Autor übernimmt infolgedessen keine Verantwortung und wird keine daraus folgende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieses Programm-Materials oder Teilen davon entsteht. Höchste inhaltliche und technische Qualität unserer Produkte ist unser Ziel. Bei der Produktion und Auslieferung unserer Bücher wollen wir die Umwelt schonen: Dieses Buch ist auf säurefreiem und chlorfrei gebleichtem Papier gedruckt. Die Einschweißfolie besteht aus Polyäthylen und damit aus organischen Grundstoffen, die weder bei der Herstellung noch bei der Verbrennung Schadstoffe freisetzen.
1. Auflage 2008 Alle Rechte vorbehalten © Vieweg +Teubner |GWV Fachverlage GmbH, Wiesbaden 2008 Lektorat: Sybille Thelen | Andrea Broßler Vieweg +Teubner ist Teil der Fachverlagsgruppe Springer Science+Business Media. www.viewegteubner.de Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlags unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Umschlaggestaltung: KünkelLopka Medienentwicklung, Heidelberg Druck und buchbinderische Verarbeitung: MercedesDruck, Berlin Gedruckt auf säurefreiem und chlorfrei gebleichtem Papier. Printed in Germany ISBN 978-3-8348-0390-0
Vorwort ȱ Mitȱ derȱSQLȬNormȱausȱdemȱ Jahrȱ2003ȱ(SQL:2003)ȱundȱ ihrerȱImplementierungȱinȱ DB2ȱVersionȱ9.5ȱderȱFirmaȱIBMȱistȱjetztȱXMLȱintegralerȱBestandteilȱderȱaktuelȬ lenȱ undȱ nochȱ mehrȱ derȱ zukünftigenȱ Datenbanktechnikȱ geworden.ȱ Mitȱ denȱ nunȱ verfügbarenȱeingebautenȱFunktionenȱvonȱSQL/XMLȱkönnenȱausȱrelationalenȱDaȬ tenȱ beliebigȱ strukturierteȱ XMLȬDokumenteȱ generiertȱ werden.ȱ Aufȱ Inhalteȱ derȱ XMLȬDokumenteȱ wirdȱ mitȱ derȱ Spracheȱ XQueryȱ lesendȱ undȱ modifizierendȱzugeȬ griffen.ȱ Mitȱ derȱ Spracheȱ XMLȱ Schemaȱ werdenȱ XMLȬSchemataȱ erzeugt,ȱ dieȱ vomȱ Dokumentenvalidiererȱ vonȱ DB2ȱ zurȱ Überprüfungȱ vonȱ zuȱ speicherndenȱ XMLȬ Dokumentenȱverwendetȱwerden.ȱȱ MitȱdenȱsehrȱmächtigenȱneuenȱSprachmittelnȱvonȱSQL/XMLȱkönnenȱnunȱkompleȬ xeȱXMLȬDokumenteȱmitȱderȱSicherheit,ȱZuverlässigkeitȱundȱPerformanceȱmoderȬ nerȱ universellerȱ Datenbanksystemeȱ beliebigȱ verwaltetȱ werden.ȱ Dadurchȱ erhöhtȱ sichȱjedochȱauchȱdasȱstrukturelleȱGefügeȱinȱdenȱnunȱhierarchischenȱDatenstruktuȬ ren.ȱDieȱhierausȱresultierendeȱstrukturelleȱKomplexitätȱkannȱsinnvollȱnurȱnochȱmitȱ einerȱ grafischenȱ Spracheȱ ökonomischȱ undȱ zuverlässigȱ beherrschtȱ werden.ȱ Undȱ dieseȱSpracheȱfürȱdieȱarchitekturgetriebeneȱSoftwareentwicklungȱistȱheuteȱUML.ȱ ZentralesȱAnliegenȱdesȱBuchesȱistȱes,ȱdenȱLeserȱsoȱeinfachȱwieȱmöglichȱinȱerprobteȱ Methoden,ȱStrategienȱundȱVerfahrenȱderȱDatenmodellierungȱvonȱXMLȬDokumenȬ tenȱeinzuführen.ȱHierbeiȱwirdȱihmȱeinȱgrundlegendesȱVerständnisȱfürȱdieȱadäquaȬ teȱBezeichnungȱundȱStrukturierungȱvonȱXMLȬDokumentenȱvermittelt.ȱ Hieraufȱ aufbauendȱ werdenȱ dieȱ neuenȱ Sprachmittelȱ zurȱ Generierungȱ beliebigerȱ XMLȬDokumenteȱ ausȱ relationalenȱ Datenȱ intensivȱ undȱ übersichtlichȱ erarbeitet.ȱ Dabeiȱ wirdȱ ebenfallsȱ eineȱ leichtȱ verständlicheȱ Lernstrategieȱ vomȱ Einfachenȱ zumȱ Komplexenȱ hinȱ eingesetzt,ȱ dieȱ beiȱ zahlreichenȱ Vorlesungenȱ anȱ derȱ SRHȱ HochȬ schuleȱHeidelbergȱsichȱalsȱnützlichȱerwiesenȱhat.ȱȱ Einȱ besondererȱ Schwerpunktȱ desȱ Buchesȱ bildetȱ dieȱ Behandlungȱ derȱ neuenȱ SpraȬ cheȱ XQueryȱ imȱ DB2ȬUmfeldȱ zumȱ Lesenȱ undȱ Verändernȱ vonȱ Datenȱ inȱ XMLȬ Dokumenten.ȱAnȱebenfallsȱzahlreichenȱundȱgetestetenȱBeispielenȱwirdȱinȱdieȱneueȱ hierarchischeȱDenkweiseȱeingeführt,ȱderȱdieseȱSpracheȱAusdruckȱverleiht.ȱHierbeiȱ werdenȱdieȱvielenȱneuenȱDatentypenȱvonȱXQueryȱebensoȱpraktischȱeingesetztȱwieȱ auchȱihreȱOperatoren,ȱeingebautenȱFunktionenȱundȱdieȱZugriffspfadsteuerspracheȱ XPathȱ2.0.ȱȱ
ȱ V
Vorwortȱ DenȱAbschlussȱderȱXQueryȬBehandlungȱbildetȱeinȱkleinerȱExkursȱinȱdieȱProgramȬ mierspracheȱ Javaȱ undȱ denȱ Zugriffȱ aufȱ XMLȬDokumenteȱ überȱ dieȱ JDBCȬSchnittȬ stelleȱaufȱderȱGrundlageȱderȱherkömmlichenȱSQLȬȱundȱderȱneuenȱXQueryȬSprache.ȱ Dasȱ Buchȱ wirdȱ abgeschlossenȱ mitȱ einerȱ einfachenȱ Einführungȱ inȱ dieȱ SchemabeȬ schreibungsspracheȱXMLȱSchema.ȱDieȱgrundsätzlichenȱKonzepteȱdieserȱsehrȱumȬ fangreichenȱSpracheȱundȱderenȱsprachlicheȱUmsetzungȱbeiȱderȱLösungȱeinfacherȱ Problemeȱ werdenȱ anȱ vielenȱ Beispielenȱ einführendȱ erläutert.ȱ Immerȱ wirdȱ daraufȱ geachtet,ȱdassȱalles,ȱwasȱvorgestelltȱwurde,ȱauchȱinȱDB2ȱläuftȱundȱleichtȱnachvollȬ ziehbarȱist.ȱ DamitȱderȱLeserȱauchȱeineȱKontrolleȱüberȱseinenȱLernfortschrittȱhat,ȱschließtȱjedesȱ Kapitelȱ oderȱ Teilkapitelȱ mitȱ mehrerenȱ Übungenȱ ab.ȱ Musterlösungenȱ werdenȱ aufȱ derȱHomepageȱAlfredȬMoos.deȱangeboten.ȱ Dasȱ Buchȱ istȱ alsȱ Ergebnisȱ einerȱ vierzigjährigenȱ intensivenȱ Beschäftigungȱ mitȱ derȱ Datenmodellierung,ȱ demȱ SoftwareȬEngineering,ȱ vielenȱ Programmiersprachen,ȱ Betriebssystemenȱ undȱ etlichenȱ Datenbanksystemenȱ entstanden.ȱ Besondersȱ dieȱ unzähligenȱ Diskussionenȱ mitȱ Studierendenȱ anȱ derȱ SRHȱ Hochschuleȱ Heidelbergȱ habenȱ dasȱ Aussehenȱ desȱ Buchesȱ geprägt.ȱ Hierbeiȱ standȱ immerȱ derȱ didaktischeȱ Anspruchȱ einerȱ leichtenȱ Verständlichkeitȱ imȱ Vordergrundȱ derȱ Überlegungen,ȱ ohneȱ denȱ Anspruchȱ aufȱ eineȱ systematischeȱ undȱ wissenschaftlicheȱ Begründungȱ aufzugeben.ȱ Beiȱ meinenȱ Forschungenȱ zuȱ diesemȱ Buchȱ habenȱ besondersȱ dieȱ Herrenȱ Dipl.Ȭ Inform.ȱ(FH)ȱAndreasȱFördererȱundȱM.ȱSc.ȱStefanȱMüllerȱmirȱwertvolleȱZuarbeitenȱ geleistet.ȱ Ganzȱ besondersȱ dankeȱ ichȱ auchȱ denȱ Herrenȱ Prof.ȱ Dr.ȱ Haioȱ Röckleȱ undȱ Dipl.ȬInform.ȱ Holgerȱ Handelȱ fürȱ ihrȱ effektivesȱ Korrekturlesenȱ undȱ ihreȱ gutenȱ RatschlägeȱfürȱdieȱOptimierungȱderȱTexte.ȱ BesondersȱdankeȱichȱmeinerȱFamilieȱfürȱihreȱGeduldȱundȱderȱpositivenȱBegleitungȱ derȱArbeit.ȱ ȱ Hemsbach,ȱimȱAprilȱ2008ȱ
VIȱ
ȱ
ȱ
ȱ
ȱ
ȱȱȱȱȱȱȱȱȱȱAlfredȱMoos
Leitfaden zum Lesen des Buches ȱ InȱdenȱerstenȱKapitelnȱwerdenȱgrundlegendeȱFeststellungenȱüberȱXML,ȱUML,ȱdasȱ EntityȱRelationshipȬModellȱundȱdasȱrelationaleȱDatenbankmodellȱformuliert.ȱDerȱ geneigteȱLeser,ȱderȱsichȱaufȱdiesenȱGebietenȱschonȱgutȱauskennt,ȱkannȱdieseȱKapiȬ telȱkurzȱstreifen.ȱErȱsollteȱsichȱjedochȱdieȱBeispieltabellenȱanlegen,ȱdieȱinȱdenȱfolȬ gendenȱKapitelnȱintensivȱbenutztȱwerden.ȱ Dasȱ Kapitelȱ überȱ dieȱ neuenȱ Publikationsfunktionenȱ vonȱ SQL/XMLȱ sollteȱ jedochȱ intensivȱdurchgearbeitetȱwerden.ȱDieseȱFunktionenȱentfaltenȱinȱihrerȱverschachtelȬ tenȱ Anwendungȱ sehrȱ raschȱ eineȱ hoheȱ Komplexität.ȱ Dieseȱ Komplexitätȱ istȱ erfahȬ rungsgemäßȱnurȱnochȱdurchȱeineȱarchitekturgetriebeneȱundȱmodellgestützteȱHeȬ rangehensweiseȱwirtschaftlichȱzuȱbewältigen.ȱAuchȱempfiehltȱsichȱhierȱeineȱhoheȱ Darstellungsdisziplin,ȱweilȱansonstenȱsehrȱschnellȱdieȱÜbersichtȱverlorenȱgeht.ȱDieȱ einzelnenȱLernschritteȱsolltenȱmitȱdemȱDatenbankprozessorȱDB2ȱinȱseinerȱneuesȬ tenȱ Versionȱdurchgeführtȱwerden.ȱDieȱCommunityȱVersionȱ vonȱDB2,ȱwelcheȱdieȱ erforderlicheȱ Funktionalitätȱ enthält,ȱ kannȱ kostenlosȱ vonȱ derȱ Firmaȱ IBMȱ ausȱ demȱ WWWȱheruntergeladenȱwerden.ȱ Dieȱ folgendenȱ Kapitel,ȱ dieȱ inȱ dieȱ neueȱ Datenmanipulationsspracheȱ XQueryȱ undȱ dieȱ Datendefinitionsspracheȱ XMLȱ Schemaȱ einführen,ȱ solltenȱ ebenfallsȱ nachhaltigȱ undȱBeispielȱfürȱBeispielȱdurchgearbeitetȱwerden.ȱ ȱ Ichȱ wünscheȱ Ihnenȱ vielȱ Freudeȱ beiȱ derȱ Lektüreȱ desȱ Buchesȱ undȱ einenȱ schnellenȱ undȱnachhaltigenȱLernerfolg.ȱ
ȱ VIIȱ
Inhaltsverzeichnis 1ȱȱXMLȱ–ȱerweiterbareȱAuszeichnungssprache........................................................... 1 1.1ȱȱXMLȱ–ȱeinȱkurzerȱÜberblick.................................................................................. 1 1.2ȱȱVokabelȱ–ȱBegriffȱ–ȱBegriffssystem....................................................................... 3 1.2.1ȱȱBegriff................................................................................................................ 3 1.2.2ȱȱBegriffssystem.................................................................................................. 4 1.3ȱȱÜbungen .................................................................................................................. 5 2ȱȱUMLȱ–ȱgrafischeȱModellierungssprache .................................................................. 7 2.1ȱȱERMȱ–ȱeinȱkurzerȱÜberblick................................................................................ 11 2.2ȱȱRDBMȱ–ȱeinȱkurzerȱÜberblick............................................................................. 14 2.3ȱȱSQLȬDDLȱ–ȱeineȱvereinfachteȱAnwendung ...................................................... 16 2.3.1ȱȱBeispieltabellenȱvereinbaren ........................................................................ 17 2.3.2ȱȱBeispieltabellenȱladen ................................................................................... 19 2.3.3ȱȱBeispieltabellenȱlesen .................................................................................... 20 2.4ȱȱÜbungen ................................................................................................................ 27 3ȱȱXMLȱundȱSQLȱ–ȱVereinigungȱzweierȱWelten ....................................................... 29 3.1ȱȱXMLȱinȱSQLȱ–ȱSQL/XML ..................................................................................... 29 3.2ȱȱSQLȱinȱXMLȱ–ȱXQuery ......................................................................................... 32 3.3ȱȱXMLȱSchemaȱ–ȱDDLȱfürȱXMLȬDokumente....................................................... 33 3.4ȱȱÜbungen ................................................................................................................ 33 4ȱȱPublikationȱrelationalerȱDaten ................................................................................ 35 4.1ȱȱXMLȬSprachkonstrukteȱ–ȱeinȱkurzerȱÜberblick ............................................... 35 4.2ȱȱXMLDOCUMENTȱ–ȱerzeugtȱeinȱXMLȬDokument .......................................... 37 4.3ȱȱXMLELEMENTȱ–ȱerzeugtȱeinȱXMLȬElement.................................................... 38 4.4ȱȱXMLSERIALIZEȱ–ȱerzeugtȱZeichenform........................................................... 40 4.5ȱȱXMLFORESTȱ–ȱerzeugtȱvieleȱXMLȬElemente................................................... 45 4.6ȱȱXMLATTRIBUTESȱ–ȱerzeugtȱvieleȱXMLȬAttribute.......................................... 47 4.7ȱȱXMLCOMMENTȱ–ȱerzeugtȱeinenȱXMLȬKommentar ...................................... 54
ȱ IXȱ
Inhaltsverzeichnisȱ 4.8ȱȱXMLTEXTȱ–ȱerzeugtȱeinenȱXMLȬText ................................................................57 4.9ȱȱXMLNAMESPACESȱ–ȱerzeugtȱXMLȬNamensräume.......................................58 4.10ȱȱXMLCONCATȱ–ȱerzeugtȱeinenȱXMLȬWert .....................................................61 4.11ȱȱXMLAGGȱ–ȱerzeugtȱeinenȱXMLȬWert..............................................................64 4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungen ...........................................68 4.12.1ȱȱXMLȬDokumentȱAlleȱKunden ......................................................................71 4.12.2ȱȱXMLȬDokumentȱAlleȱKundenȱmitȱihrenȱRechnungen .................................74 4.12.3ȱȱXMLȬDokumentȱKundenrechnungen .......................................................78 4.12.4ȱȱXMLȬDokumentȱKundenrechnungenȱattributzentriert ..........................83 4.13ȱȱPublikationȱRechnungenȱihreȱKundenȱundȱArtikel .......................................87 4.14ȱȱÜbungen ...............................................................................................................92 5ȱȱXMLȬDokumenteȱrelationalȱspeichern ...................................................................95 5.1ȱȱSpalteȱvomȱDatentypȱXMLȱvereinbaren ............................................................95 5.2ȱȱXMLȬDatenȱinȱSpalteȱvomȱDatentypȱXMLȱladen .............................................96 5.3ȱȱKundendatenȱvomȱDatentypȱXMLȱladen ..........................................................99 5.4ȱȱÜbungen ...............................................................................................................103 6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQuery .....................................................................105 6.1ȱȱDieȱSpracheȱXQuery ...........................................................................................105 6.1.1ȱȱDasȱDatenmodellȱvonȱXQueryȱȬȱEinführung............................................105 6.1.2ȱȱBefehlȱXQueryȱinȱDB2ȬClientȱeingeben.....................................................109 6.1.3ȱȱÜbungen ........................................................................................................115 6.2ȱKonstruktorenȱzurȱErzeugungȱvonȱXDMȬKnoten ...........................................116 6.2.1ȱȱÜbungen ........................................................................................................127 6.3ȱȱDatentypenȱinȱXQuery .......................................................................................128 6.3.1ȱȱEingebautenȱDatentypenȱinȱXQueryȱvonȱDB2 .........................................130 6.3.2ȱȱNumerischeȱDatentypen .............................................................................135 6.3.3ȱȱZeichenförmigeȱDatentypen .......................................................................139 6.3.4ȱȱDatumȬȱundȱZeitȬDatentypen.....................................................................142 6.3.5ȱȱSonstigeȱDatentypen ....................................................................................150 6.3.6ȱȱÜbungen ........................................................................................................155
Xȱ
Inhaltsverzeichnisȱ 6.4ȱȱAusdrückeȱinȱXQuery ........................................................................................ 156 6.4.1ȱȱSequenzausdrücke....................................................................................... 157 6.4.2ȱȱArithmetischeȱAusdrücke .......................................................................... 164 6.4.3ȱȱDatumȬȱundȱZeitausdrücke........................................................................ 166 6.4.4ȱȱZeichenkettenausdrücke............................................................................. 171 6.4.5ȱȱVergleichsausdrücke ................................................................................... 175 6.4.6ȱȱLogischeȱAusdrücke.................................................................................... 178 6.4.7ȱȱAlternativausdrücke ................................................................................... 179 6.4.8ȱȱQuantifizierendeȱAusdrücke...................................................................... 181 6.4.9ȱȱMengenausdrücke ....................................................................................... 183 6.4.10ȱȱÜbungen ..................................................................................................... 187 6.5ȱȱPfadȬAusdrücke.................................................................................................. 189 6.5.1ȱȱZugriffȱaufȱXMLȬDokumente..................................................................... 189 6.5.2ȱȱEingebauteȱFunktionenȱzumȱLesenȱvonȱXMLȬDokumenten................. 193 6.5.3ȱȱPfadausdruck ............................................................................................... 198 6.5.4ȱȱStrukturȱdesȱPfadausdrucks....................................................................... 204 6.5.5ȱȱAchse ............................................................................................................. 205 6.5.6ȱȱKnotenbezeichnung .................................................................................... 214 6.5.7ȱȱPrädikat......................................................................................................... 220 6.5.8ȱȱAbkürzendeȱSchreibweisenȱfürȱAchsenȱundȱKnotentypen ................... 226 6.5.9ȱȱLesenȱohneȱSQLȬUnterstützung ................................................................ 228 6.5.10ȱȱÜbungen ..................................................................................................... 232 6.6ȱȱFLWORȬAusdruck ............................................................................................. 233 6.6.1ȱȱXDMȬWerteȱinȱFLWORȬAusdruckȱlesen.................................................. 237 6.6.2ȱȱAggregatsfunktionenȱinȱFLWORȬAusdrücken ....................................... 240 6.6.3ȱȱZusammenfassungenȱinȱFLWORȬAusdrücken ....................................... 247 6.6.4ȱȱVerbundeȱinȱFLWORȬAusdrücken ........................................................... 251 6.6.5ȱȱÜbungen ....................................................................................................... 258 7ȱȱXMLȬDatenȱinȱrelationaleȱDatenȱzerlegen........................................................... 261 7.1ȱȱRelationaleȱTabelleȱausȱXMLȬDokumentenȱerstellen .................................... 261 7.2ȱȱDasȱSQLȬPrädikatȱXMLEXISTS ........................................................................ 265 7.3ȱȱÜbungen .............................................................................................................. 268
XIȱ
Inhaltsverzeichnisȱ 8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQuery...................................................269 8.1ȱȱDatenȱinȱeinenȱXDMȬBaumȱeinfügen ...............................................................270 8.2ȱȱDatenȱinȱeinemȱXDMȬBaumȱlöschen ................................................................276 8.3ȱȱDatenȱinȱeinemȱXDMȬBaumȱersetzten..............................................................278 8.4ȱȱDatenȱinȱeinemȱXDMȬBaumȱumbenennen ......................................................280 8.5ȱȱVieleȱÄnderungenȱinȱeinemȱUmsetzungsausdruck .......................................281 8.6ȱȱÜbungen ...............................................................................................................283 9ȱȱXMLȬDatenȱinȱJavaȱverarbeiten..............................................................................285 9.1ȱȱVerbindungȱzwischenȱJavaȱundȱDB2ȱherstellen .............................................285 9.2ȱȱLesenderȱZugriffȱüberȱdieȱSQLȬSchnittstelle...................................................286 9.3ȱȱLesenderȱZugriffȱüberȱdieȱXQueryȬSchnittstelle.............................................288 9.4ȱȱÜbungen ...............................................................................................................289 10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchema ...............................................................291 10.1ȱȱXMLȱSchemaȱ–ȱeinȱkurzerȱÜberblick..............................................................291 10.2ȱȱVomȱModellȱbisȱzumȱvalidiertenȱXMLȬDokument ......................................294 10.3ȱȱZentraleȱSprachkonstrukteȱ–ȱeineȱAuswahl ..................................................301 10.3.1ȱȱTypdefinition ..............................................................................................302 10.3.2ȱȱEinfacherȱTyp..............................................................................................302 10.3.3ȱȱKomplexerȱTyp...........................................................................................304 10.4ȱȱÜbungen .............................................................................................................313 Literaturverzeichnis......................................................................................................315 Sachwortverzeichnis.....................................................................................................319
XIIȱ
1 XML – erweiterbare Auszeichnungssprache InȱdiesemȱKapitelȱlernenȱSie,ȱ – wasȱXMLȱistȱundȱȱ – wieȱBegriffssystemeȱmitȱXMLȱgeschaffenȱwerdenȱkönnen.ȱ MitȱIhremȱerworbenenȱWissenȱkönnenȱSieȱsodannȱauchȱgroßeȱundȱanspruchsvolleȱ XMLȬDokumenteȱentwickeln.ȱ
1.1 XML – ein kurzer Überblick XMLȱistȱdieȱAbkürzungȱfürȱEXtensibleȱMarkȬupȱLanguage.ȱImȱdeutschenȱSprachbeȬ reichȱwirdȱXMLȱauchȱalsȱErweiterbareȱAuszeichnungsspracheȱbezeichnet.ȱXMLȱwirdȱ vomȱWorldȱWideȱWebȱConsortiumȱ(W3C)ȱdefiniert.ȱDieȱersteȱXMLȬSpezifikationȱ wurdeȱalsȱRecommendationȱ1998ȱvomȱW3Cȱveröffentlicht.ȱDieȱletzteȱEmpfehlungȱ wurdeȱimȱAugustȱ2006ȱpubliziertȱ[W3C06].ȱ InȱXMLȱsindȱeinfacheȱRegelnȱfestgelegt,ȱdieȱbeiȱderȱFormulierungȱvonȱsichȱselbstȱ beschreibendenȱDokumentenȱzuȱbeachtenȱsind.ȱDaȱdieȱSpracheȱXMLȱnurȱwenigeȱ eigeneȱ Vokabelnȱ enthält,ȱ undȱ somitȱ vornehmlichȱ nurȱ Regelnȱ zurȱ Definitionȱ vonȱ benutzerspezifischenȱVokabularien,ȱistȱXMLȱeineȱMetasprache.ȱEineȱMetaspracheȱ istȱeineȱSpracheȱzurȱBeschreibungȱandererȱSprachen.ȱDieȱRegelnȱvonȱXMLȱbildenȱ dieȱ Grammatikȱ vonȱ XML.ȱ Dieseȱ Regelnȱ sindȱ beiȱ derȱ Niederschriftȱ vonȱ XMLȬ Dokumentenȱzuȱbeachten.ȱ Dieȱ Auszeichnungsspracheȱ XMLȱ legtȱ fest,ȱ wieȱ benutzerspezifischeȱ Vokabelnȱ inȱ XMLȬDokumentenȱzuȱverwendenȱsind.ȱDieseȱVokabelnȱdienenȱzurȱAuszeichnungȱ bzw.ȱ Kennzeichnungȱ vonȱ Textteilenȱ inȱ einemȱ XMLȬDokument.ȱ Imȱ Englischenȱ bezeichnetȱ manȱ dieseȱ Auszeichnungsvokabelnȱ alsȱ tags.ȱ Dasȱ Auszeichnenȱ selbstȱ wirdȱ alsȱ markȱ upȱ (deutsch:ȱ auszeichnen,ȱ markieren,ȱ kennzeichnen)ȱ bezeichnet.ȱ EineȱumfangreicheȱAuszeichnungsspracheȱistȱSGMLȱ(StandardȱGeneralizedȱMarkȬ upȱLanguage)ȱ[ISO88].ȱXMLȱistȱeineȱTeilmengeȱvonȱSGML.ȱȱ Einȱ XMLȬDokumentȱ bestehtȱ hauptsächlichȱ ausȱ Nutzdatenȱ undȱ denȱ AuszeichȬ nungsvokabeln,ȱ denȱ tags.ȱ Dieȱ tagsȱ sagenȱ aus,ȱ welcheȱ Bedeutungȱ dieȱ Nutzdatenȱ haben.ȱZusätzlichȱzuȱdiesenȱDatenȱkannȱeinȱXMLȬDokumentȱnochȱausȱdemȱPrologȱ undȱ derȱ DocumentȱTypeȱDefinitionȱ(DTD)ȱ bestehen.ȱ Nebenȱ derȱ BedeutungszuordȬ nungȱ dienenȱ dieȱ tagsȱ auchȱ nochȱ zurȱ hierarchischenȱ Gliederungȱ desȱ XMLȬDokuȬ mentes.ȱ
ȱ
1
1ȱȱXMLȱ–ȱerweiterbareȱAuszeichnungsspracheȱ Beispielȱ Hugo Mueller
(1) (2) (3) (4)
XMLȬDokumentȱ1:ȱEinführendesȱXMLȬDokumentȱ
DasȱBeispielȱistȱeinȱXMLȬDokument,ȱdasȱausȱdenȱbeidenȱNutzdatenwortenȱHugoȱ undȱMuellerȱbesteht.ȱDieȱAuszeichnungsvokabelnȱsindȱinȱspitzenȱKlammernȱeinȬ gefasst.ȱ Hinfortȱ werdenȱ wirȱ sieȱ alsȱ XMLȬElementeȱ bezeichnen.ȱ Inȱ Zeileȱ (1)ȱ stehtȱ dasȱStartȬElementȱ.ȱEsȱbeschreibtȱdenȱDokumentinhalt,ȱderȱinȱZeileȱ(2)ȱundȱ (3)ȱ steht.ȱ Inȱ Zeileȱ (4)ȱ stehtȱ dasȱ EndeȬElementȱ .ȱ Esȱ unterscheidetȱ sichȱ vonȱ seinemȱ StartȬElementȱ durchȱ denȱ Schrägstrichȱ vorȱ demȱ XMLȬElementname.ȱ Derȱ Dokumentteilȱ zwischenȱ demȱ StartȬȱ undȱ demȱ EndeȬElementȱ desȱ XMLȬElementesȱ ȱ istȱ dessenȱ Elementinhaltȱ oderȱ synonymȱ derȱ ElementȬWert.ȱ Derȱ ElementȬ WertȱvonȱȱbestehtȱselbstȱausȱdenȱbeidenȱXMLȬElementenȱȱundȱ ȱ mitȱ ihrenȱ jeweiligenȱ Elementinhalten.ȱ Dieseȱ beidenȱ XMLȬElementeȱ sindȱinȱdasȱXMLȬElementȱȱhierarchischȱgeschachtelt.ȱWieȱausȱdemȱBeispielȱ ersichtlichȱ ist,ȱ gestattetȱ dieȱ angemesseneȱ Benennungȱ derȱ XMLȬElementȬNamenȱ eineȱ sinntragendeȱ Beschreibungȱ ihrerȱ Elementinhalte.ȱ Inȱ einemȱ XMLȬDokumentȱ sindȱsomitȱNutzdatenȱundȱdieȱsieȱbeschreibendenȱDaten,ȱihreȱMetadaten,ȱvereinigt.ȱ EinȱsolchesȱMetadatumȱinȱGestaltȱeinesȱXMLȬElementȬNamensȱistȱderȱDeskriptorȱ desȱfolgendenȱElementȬInhalts.ȱȱ Durchȱ dieȱ beliebigeȱ hierarchischeȱ Schachtelungȱ derȱ XMLȬElementeȱ nimmtȱ dasȱ XMLȬDokumentȱ dieȱ Gestaltȱ einesȱ Datenbaumesȱ an,ȱ derȱ abstraktȱ betrachtetȱ auchȱ alsȱ Graphȱ mitȱ Knotenȱ undȱ Kantenȱ auffassbarȱ ist.ȱ Einȱ solcherȱ Baumȱ bestehtȱ ausȱ genauȱ einemȱ XMLȬElement,ȱ welchesȱ derȱ Wurzelknotenȱ ist,ȱ ausȱ beliebigȱ vielenȱ XMLȬElementen,ȱ denȱ Blättern,ȱ undȱ beliebigȱ vielenȱ XMLȬElementen,ȱ denȱ ZwiȬ schenknoten.ȱDieseȱbefindenȱsichȱzwischenȱdemȱWurzelknotenȱundȱdenȱBlattknoȬ ten.ȱJederȱdieserȱKnotenȱwirdȱdurchȱeinȱXMLȬElementȱgebildet.ȱ DerȱvonȱeinemȱXMLȬElementȱumfassteȱInhaltȱistȱvonȱdiesemȱexistenziellȱabhängig.ȱ OhneȱseinȱübergeordnetesȱXMLȬElementȱkannȱeinȱuntergeordnetesȱXMLȬElementȱ nichtȱ existieren.ȱ Speziellȱ seinȱ Sinnȱ gehtȱ verloren,ȱ wennȱ esȱ ausȱ demȱ SinnzusamȬ menhang,ȱdemȱKontext,ȱseinesȱübergeordnetenȱXMLȬElementesȱherausgelöstȱwird.ȱ
2ȱ
1.2ȱȱVokabelȱ–ȱBegriffȱ–ȱBegriffssystemȱ
1.2 Vokabel – Begriff – Begriffssystem Dieȱ Erweiterbareȱ Auszeichnungsspracheȱ (XML)ȱ ermöglichtȱ es,ȱ beliebigeȱ anwenȬ dungsȬȱ undȱ benutzerspezifischeȱ Auszeichnungssprachenȱ zuȱ schaffen.ȱ Dieseȱ beȬ stehenȱ ausȱ Vokabelnȱ undȱ grammatikalischenȱ Regeln,ȱ wobeiȱ dieȱ Vokabelnȱ alsȱ XMLȬElementȬNamenȱ bezeichnetȱ werden.ȱ Mitȱ diesenȱ Vokabelnȱ werdenȱ DokuȬ mentinhalteȱausgezeichnet.ȱBeiȱsinnvollȱgewähltenȱVokabelnȱwerdenȱimȱZugeȱderȱ AuszeichnungȱdieȱDokumentinhalteȱmitȱzusätzlichenȱSinnzuordnungenȱversehenȱ undȱ beiȱ Bedarfȱ hierarchischȱ organisiert.ȱ Wirdȱ einȱ derartȱ ausgezeichnetesȱ DokuȬ mentȱvonȱeinemȱSenderȱanȱeinenȱEmpfängerȱübertragen,ȱsoȱkannȱderȱEmpfängerȱ dieȱ Bedeutungȱ desȱ Dokumentesȱ aufgrundȱ derȱ Aussagenȱ derȱ inȱ ihmȱ enthaltenenȱ XMLȬElementȬNamenȱ unmissverständlichȱverstehen.ȱVoraussetzungȱist,ȱdassȱderȱ SenderȱundȱderȱEmpfängerȱsichȱüberȱdieȱBedeutungȱderȱXMLȬElementȬNamen,ȱd.ȱ h.ȱderȱVokabeln,ȱvorherȱverständigtȱhaben.ȱ EineȱVokabel,ȱdieȱalsȱNameȱeinesȱXMLȬElementesȱverwendetȱwird,ȱsollteȱderȱNaȬ meȱeinesȱimȱAnwendungsbereichȱgebräuchlichenȱBegriffsȱsein.ȱDadurchȱwirdȱeinȱ XMLȬElementȬNameȱzuȱeinemȱBegriffsbezeichner.ȱ
1.2.1 Begriff Derȱ Begriffȱ spieltȱ inȱ derȱ Informatik,ȱ wieȱ inȱ anderenȱ Wissenschaftenȱ auch,ȱ eineȱ herausragendeȱ Rolle.ȱ Speziellȱ fürȱ dieȱ Benennungȱ einesȱ XMLȬElementesȱ sindȱ dieȱ FrageȱnachȱdemȱBezeichnerȱdesȱfürȱdieȱBenennungȱverwendetenȱBegriffsȱundȱdas,ȱ wasȱsichȱhinterȱdiesemȱBezeichnerȱverbirgt,ȱvonȱbesondererȱBedeutung.ȱInȱAnlehȬ nungȱ anȱ DINȱ 2330ȱ „Begriffeȱ undȱ Benennungen;ȱ Allgemeineȱ Grundsätze“ȱ wollenȱ wirȱunterȱBegriffȱfolgendesȱverstehen:ȱȱ Dieȱ gedanklicheȱ Zusammenfassungȱ vonȱ individuellenȱ Gegenständenȱ zuȱ gedachtenȱ „allȬ gemeinenȱ Gegenständen“ȱ führtȱ zuȱ Denkeinheiten,ȱ dieȱ alsȱ „Begriffe“ȱ bezeichnetȱ werdenȱ können.ȱ[DINȱ2330]ȱ
EinȱBegriffȱbestehtȱausȱdreiȱTeilenȱ – seinemȱNamenȱ(Bezeichner,ȱVokabel)ȱ – seinerȱIntensionȱ(Bedeutung,ȱDefinition)ȱ – seinerȱExtensionȱ(MengeȱallerȱvonȱihmȱbetroffenenȱDinge)ȱ
3ȱ
1ȱȱXMLȱ–ȱerweiterbareȱAuszeichnungsspracheȱ Beispielȱ BetrachtenȱwirȱdenȱBegriffȱmitȱdemȱBezeichnerȱAnrede.ȱ BetrachtungsȬ gegenständeȱ
Beschreibungȱ
Beispielȱ
Bezeichnerȱ
NameȱdesȱBegriffsȱ
Anredeȱ
Intensionȱ
BedeutungȱdesȱBegriffsȱ bzw.ȱseineȱDefinition.ȱ
Etwas,ȱmitȱdemȱPersonenȱhöflichȱ angesprochenȱwerden.ȱ
Extensionȱ
MengeȱallerȱDingeȱ(EntiȬ täten),ȱdieȱunterȱdenȱ Begriffȱfallenȱ
DieȱWorteȱ Frau,ȱHerrȱ
Tabelleȱ1:ȱBestandteileȱeinesȱBegriffsȱ
Wendetȱ manȱ dieȱ etwasȱ abstraktenȱ Vorüberlegungenȱ aufȱ denȱ Findungsprozessȱ einesȱ Bezeichnersȱ fürȱ dasȱ XMLȬElementȱ an,ȱ soȱ kommtȱ manȱ wohlȱ zurȱ EntscheiȬ dung,ȱ dassȱ dasȱ XMLȬElementȱ ȱ heißenȱ soll,ȱ mitȱ demȱ dieȱ beidenȱ DokuȬ mentinhalteȱ Frauȱ bzw.ȱ Herrȱ inȱ einenȱ eindeutigenȱ Sinnzusammenhangȱ gebrachtȱ undȱ ausgezeichnetȱ werdenȱ können.ȱ Derȱ XMLȬElementȬNameȱ dientȱ dannȱ alsȱ DeȬ skriptorȱfürȱdieȱbeidenȱDokumentinhalteȱFrauȱbzw.ȱHerr.ȱ Beispielȱ Frau ȱ
(1)
Herr ȱ
(1)
ȱ
XMLȬDokumentȱ2:ȱDerȱNameȱAnredeȱbeschreibtȱHerrȱundȱFrauȱ
1.2.2 Begriffssystem Begriffsbezeichner,ȱ dieȱ fürȱ dieȱ Benennungȱ derȱ XMLȬElementnamenȱ verwendetȱ werden,ȱ solltenȱ einemȱ wohlorganisiertenȱ Begriffssystemȱ entstammen.ȱ Hierdurchȱ wirdȱ dieȱ allgemeineȱ Verständlichkeitȱ derȱ ausgezeichnetenȱ XMLȬDokumenteȱ geȬ fördert.ȱ Solcheȱ Begriffssystemeȱ unterscheidenȱ sichȱ hinsichtlichȱ derȱ Anwendung,ȱ Zielsetzung,ȱformallogischerȱBeschreibungȱusw.ȱ DieȱneuestenȱEntwicklungenȱinȱderȱInformatikȱaufȱdemȱGebietȱderȱinȱsichȱkonsisȬ tentenȱ Begriffssystemeȱ werdenȱ alsȱ Ontologienȱ bezeichnet.ȱ Sieȱ sindȱ dieȱ derzeitȱ höchsteȱ Stufeȱ einesȱ formalisiertenȱ Begriffssystems.ȱ Inȱ einerȱ Ontologieȱ sindȱ dieȱ einzelnenȱ Begriffeȱ undȱ speziellȱ derenȱ Zusammenhängeȱ strengȱ formalisiert.ȱ DaȬ
4ȱ
1.3ȱȱÜbungenȱ durchȱkönnenȱaufȱsolcheȱBegriffssystemeȱautomatisierteȱSchlussfolgerungsverfahȬ renȱangewendetȱwerden.ȱZurȱErstellungȱundȱPflegeȱvonȱOntologienȱwerdenȱheuteȱ undȱnochȱmehrȱinȱZukunftȱgeeigneteȱSprachenȱundȱWerkzeugeȱeingesetzt.ȱAktuelȬ leȱ Sprachenȱ sindȱ derzeitȱ dasȱ Resourceȱ Descriptionȱ Frameworkȱ (RDF)ȱ [MFM04]ȱ undȱdieȱWebȱOntologyȱLanguageȱ(OWL)ȱ[W3C07].ȱ
1.3 Übungen 1) Findenȱ Sieȱ imȱ Worldȱ Wideȱ Webȱ (WWW)ȱ dieȱ Veröffentlichungenȱ desȱ Worldȱ WideȱWebȱConsortiumsȱ(W3C)ȱüberȱXML.ȱ 2) Fassenȱ Sieȱ zusammen,ȱ wasȱ manȱ unterȱ Vokabularienȱ verstehtȱ undȱ findenȱ Sieȱ einigeȱBeispiele.ȱ 3) Untersuchenȱ Sieȱ einȱ XMLȬDokumentȱ unterȱ denȱ Gesichtspunktenȱ vonȱ MetaȬ spracheȱundȱbeschriebeneȱSprache.ȱ 4) HaltenȱSieȱfest,ȱwasȱmanȱunterȱeinerȱAuszeichnungsspracheȱversteht.ȱ 5) BeschreibenȱSieȱdieȱStrukturȱeinesȱXMLȬDokumentes.ȱ 6) Fassenȱ Sieȱ zusammen,ȱ wasȱ manȱ unterȱ einemȱ Begriff,ȱ einemȱ Begriffssystemȱ undȱeinerȱOntologieȱversteht.ȱ ȱ
5ȱ
2 UML – grafische Modellierungssprache InȱdiesemȱKapitelȱlernenȱSie,ȱ – – – – –
wieȱmitȱUMLȱBegriffssystemeȱmodelliertȱwerdenȱ wieȱmitȱUMLȱsemantischeȱDatenmodelleȱmodelliertȱwerdenȱ wieȱmitȱUMLȱDatenarchitekturenȱmodelliertȱwerdenȱ wieȱmitȱUMLȱrelationaleȱDatenbankmodelleȱmodelliertȱwerdenȱ wieȱdieȱArchitekturȱeinesȱXMLȬDokumentesȱmitȱUMLȱveranschaulichtȱwird.ȱ
Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ sodannȱ auchȱ großeȱ Begriffssysteme,ȱ DatenȬȱundȱDatenbankmodelleȱundȱXMLȬDokumenteȱveranschaulichen.ȱ ȱ „Einȱ Bildȱ sagtȱ mehrȱ alsȱ tausendȱ Worte“.ȱ Diesesȱ Sprichwortȱ drücktȱ eineȱ tiefgreiȬ fendeȱErfahrungȱvonȱunsȱDurchschnittsmenschenȱaus.ȱWerdenȱInformationenȱunsȱ inȱ Bildernȱ präsentiert,ȱsoȱ kannȱ unserȱ Gehirnȱ dieseȱvielȱ schnellerȱ undȱ inȱ größererȱ KomplexitätȱverarbeitenȱalsȱwennȱdieselbenȱInformationenȱinȱgeschriebenenȱWorȬ tenȱ unsȱ übermitteltȱ würden.ȱ Aufgrundȱ dieserȱ Tatsacheȱ istȱ esȱ sinnvoll,ȱ komplexeȱ SystemeȱmitȱgrafischenȱSprachenȱundȱnichtȱinȱSchriftsprachenȱzuȱbeschreiben.ȱ Dieȱ UMLȱ (Unifiedȱ Modelingȱ Language)ȱ [BJR97]ȱ istȱ derzeitȱ dieȱ verbreitetsteȱȱ Modellierungssprache.ȱ Sieȱ wirdȱ inȱ diesemȱ Buchȱ zurȱ grafischenȱ Darstellungȱ vonȱ Datenarchitekturenȱ verwendet.ȱ Datenarchitekturenȱ schlagenȱ sichȱ inȱ UMLȬDiaȬ grammenȱnieder,ȱdieȱDatenmodelleȱüberȱdieȱMiniweltȱundȱhierausȱabgeleitetȱderȱ implementierungsnahenȱEntwurfsweltȱübersichtlichȱdarstellen.ȱ Dieȱ UMLȱ eignetȱ sichȱ auchȱ zurȱ Darstellungȱ vonȱ Begriffssystemen.ȱ Einȱ mitȱ UMLȱ beschriebenesȱ Klassendiagramm,ȱ dasȱ dieȱ Strukturȱ miteinanderȱ inȱ Beziehungȱ steȬ henderȱ Klassenȱ dokumentiert,ȱ kannȱ manȱ alsȱ Vorbildȱ fürȱ einȱ Strukturdiagrammȱ zurȱ Beschreibungȱ vonȱ Begriffenȱ verwenden.ȱ Dieȱ Einführungȱ desȱ Namensȱ einesȱ Begriffs,ȱ d.ȱ h.ȱ dieȱ Deklarationȱ seinesȱ Namens,ȱ wirdȱ hierbeiȱ inȱ Formȱ einesȱ RechtȬ ecksȱdargestellt.ȱInȱdasȱRechteck,ȱdasȱimȱRahmenȱderȱobjektorientiertenȱModellieȬ rungȱeineȱKlasseȱrepräsentiert,ȱwirdȱderȱNameȱdesȱBegriffsȱeingetragen.ȱDamitȱderȱ Betrachterȱ denȱ Begriffȱ nichtȱ mitȱ einerȱ Klasseȱ verwechselt,ȱ wirdȱ zurȱ VerdeutliȬ chungȱ nochȱ derȱ Stereotypȱ ȱ verwendet.ȱ Unterȱ einemȱ Stereotypenȱ verȬ stehtȱmanȱinȱderȱUMLȱdieȱBezeichnungȱderȱSpielartȱeinerȱKlasse.ȱ UMLȱbietetȱdieȱMöglichkeit,ȱzwischenȱeinerȱAusprägungȱeinesȱTypsȱundȱdemȱTypȱ selbstȱ zuȱ unterscheiden.ȱ Inȱ derȱ objektorientiertenȱ Ausdrucksweiseȱ wirdȱ anstelleȱ vonȱ Ausprägungȱ oftȱ derȱ eingedeutschteȱ englischeȱ Bezeichnerȱ Instanzȱ (englisch:ȱ instance,ȱdeutsch:ȱBeispiel)ȱverwendet.ȱVonȱdieserȱeherȱmissverständlichenȱÜberȬ setzungȱ wollenȱ wirȱ inȱ diesemȱ Buchȱ absehen.ȱ Derȱ Nameȱ derȱ Ausprägungȱ einesȱ TypsȱwirdȱinȱUMLȱunterstrichen.ȱEinȱnichtȱunterstrichenerȱNameȱbezeichnetȱeinenȱ Typ.ȱ
ȱ
7
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ ȱ
«Begriff» Typ_Begriff
ȱ
«Begriff» Begriffsname
Abbildungȱ1:ȱUMLȱfürȱdieȱTypȬȱundȱdieȱAusprägungsebeneȱ
JederȱBegriffȱistȱeineȱAusprägungȱdesȱSchemas,ȱnachȱwelchemȱBegriffeȱzuȱerstellenȱ sind.ȱEinȱTypȱistȱebensoȱeinȱsolchesȱSchema.ȱEinȱTypȱwirdȱmitȱeinemȱNamenȱbeȬ zeichnet.ȱ Damitȱ wirȱ imȱ Fortgangȱ zwischenȱ Namenȱ fürȱ Typenȱ undȱ Namenȱ fürȱ Ausprägungenȱ deutlichȱ unterscheidenȱ können,ȱ schreibenȱ wirȱ einenȱ Typnamenȱ mitȱ demȱ Präfixȱ Typ_ȱ gefolgtȱ vonȱ demȱ eigentlichenȱ Namen.ȱ Fürȱ dieȱ Bezeichnungȱ einerȱAusprägungȱverwendenȱwirȱeinenȱNamenȱohneȱdenȱPräfixȱTyp_.ȱDasȱScheȬ maȱzurȱBildungȱvonȱBegriffenȱnennenȱwirȱdeshalbȱTyp_Begriff.ȱDieȱdreiȱBestandteiȬ leȱ einesȱ Begriffs,ȱ seinȱ Name,ȱ seineȱ Intensionenȱ undȱ seineȱ Extensionenȱ könnenȱ inȱ UMLȱ einfachȱ alsȱ Attributeȱ modelliertȱ werden.ȱ Inȱ UMLȱ wirdȱ somitȱ dasȱ abstrakteȱ Schemaȱ fürȱ dieȱ Begriffsbildungȱ mitȱ demȱ Namenȱ Typ_Begriffȱ bezeichnetȱ undȱ wieȱ folgtȱmodelliert.ȱ «Begriff» Typ_Begriff Name Intension [1..*] Extension [1..*]
ȱ
ȱ
Abbildungȱ2:ȱSchemaȱfürȱdieȱBildungȱvonȱBegriffenȱinȱUMLȱ
Aufȱ derȱ rechtenȱ Seiteȱ derȱ Bezeichnerȱ Intensionȱ undȱ Extensionȱ stehtȱ dieȱ UMLȬ spezifischeȱMultiplizitätsangabeȱfürȱeinsȱbisȱvieleȱ[1..*].ȱHiermitȱwirdȱausgedrückt,ȱ dassȱ einȱ Begriffȱ mindestensȱ ausȱ einerȱ Intensionsangabeȱ bestehenȱ mussȱ undȱ ausȱ vielenȱ Intensionsangabenȱbestehenȱ kann.ȱDasselbeȱgiltȱfürȱ dieȱ Extension.ȱEinȱ BeȬ griffȱbestehtȱsomitȱausȱeinemȱbisȱvielenȱBeispielenȱ(Extensionen).ȱ DieȱNamenȱderȱAttributeȱkönnenȱinȱUMLȱauchȱausȱdemȱVerzeichnisȱderȱAttributeȱ hinausverlagertȱ undȱ jeweilsȱ mitȱ einemȱ eigenenȱ UMLȬKlassensinnbildȱ dargestelltȱ werden.ȱInȱderȱfolgendenȱAbbildungȱ3ȱsindȱdieȱAttributeȱIntensionȱundȱExtensionȱ ausȱihremȱBegriffssinnbildȱentferntȱundȱjeweilsȱmitȱeinemȱeigenenȱKlassensinnbildȱ dargestellt.ȱDerȱZusammenhangȱmitȱihremȱauslagerndenȱTypȱwirdȱmitȱderȱKomȬ positionsbeziehungȱbeschrieben.ȱDieȱKompositionsbeziehungȱvonȱUMLȱsagtȱaus,ȱ dassȱeinȱGanzesȱmitȱseinemȱTeilȱinȱVerbindungȱstehtȱundȱdassȱdasȱTeilȱohneȱdasȱ Ganzeȱ nichtȱ existierenȱ kann.ȱ Dieȱ Kompositionsbeziehungȱ zwischenȱ Typ_Begriffȱ undȱ Intensionȱ bzw.ȱExtensionȱbringtȱsomitȱzumȱ Ausdruck,ȱdassȱeineȱAusprägungȱ
8ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ vonȱ Intensionȱ oderȱ Extensionȱ ohneȱ dasȱ Vorhandenseinȱ einerȱ Ausprägungȱ vomȱ GanzenȱderȱArtȱTyp_Begriffȱnichtȱexistierenȱkannȱbzw.ȱnichtȱeindeutigȱwäre.ȱ «Begriff» Typ_Begriff
1..*
Name 1..*
Intension Extension
ȱ
Abbildungȱ3:ȱAttributeȱinȱeigeneȱKlassenȱausgelagertȱ
Dieȱ Kompositionsbeziehungȱ kannȱ auchȱ alsȱ attributiveȱBeziehungȱ bezeichnetȱ werden,ȱ daȱmitȱihremȱEinsatzȱAttributeȱausȱihrerȱHeimatklasseȱausgelagertȱundȱalsȱeigenȬ ständigeȱBetrachtungsgegenständeȱmodelliertȱwerdenȱkönnen.ȱ DieȱIntensionȱeinesȱneuȱzuȱdeklarierendenȱBegriffsȱwirdȱdurchȱBegriffeȱbeschrieȬ ben,ȱ dieȱ möglicherweiseȱ bereitsȱ vorhandenȱ sind.ȱ Imȱ Zusammenhangȱ mitȱ demȱ neuenȱ Begriffȱ erhaltenȱ sieȱ jedochȱ eineȱ zusätzlicheȱ Bedeutung.ȱ Dieseȱ Bedeutungȱ hängtȱ existenziellȱ vonȱ derȱ Bedeutungȱ desȱ neuenȱ Begriffesȱ ab.ȱ Istȱ beispielsweiseȱ derȱBegriffȱNameȱvorhandenȱundȱwirdȱbeiȱderȱDefinitionȱdesȱneuenȱBegriffsȱKundeȱ verwendet,ȱsoȱverstehenȱwirȱanschließendȱdarunterȱeinenȱKundennamenȱundȱnichtȱ beispielsweiseȱeinenȱArtikelnamen.ȱ InȱderȱfolgendenȱAbbildungȱ4ȱsollȱeinȱneuerȱBegriffȱmitȱdemȱNamenȱKundeȱdeklaȬ riertȱ werden.ȱ Seineȱ Intensionȱ wirdȱ durchȱ dieȱ Aufzählungȱ derȱ ihnȱ definierendenȱ attributivenȱBegriffeȱKunde_Nr,ȱVornameȱundȱZunameȱgebildet.ȱEineȱseinerȱExtenȬ sionenȱsollȱderȱKundeȱHugoȱMüllerȱmitȱderȱKundennummerȱK001ȱsein.ȱ ȱ ȱ
«Begriff» Kunde
«Begriff» K001:Kunde
ȱ Kunde_Nr Kunde_Nr = K001 Vorname Vorname = Hugo 2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ Zuname Zuname = Müller ȱ Abbildungȱ4:ȱDerȱBegriffȱKundeȱmitȱseinerȱIntensionȱundȱderȱExtensionȱK001ȱ
Nebenȱ demȱ attributivenȱ Zusammenhangȱ zwischenȱ einemȱ Begriffȱ undȱ denȱ ihnȱ definierendenȱ Teilbegriffen,ȱ dieȱ wirȱ alsȱ Intensionȱ bezeichnetȱ haben,ȱ gibtȱ esȱ nochȱ denȱ hierarchischenȱZusammenhangȱzwischenȱzweiȱBegriffenȱ[STR02].ȱ Hierbeiȱistȱ beispielsweiseȱ einȱ neuȱ einzuführenderȱ Begriffȱ einȱ Unterbegriffȱ zuȱ einemȱ bereitsȱ bestehendenȱOberbegriff.ȱDerȱneueȱUnterbegriffȱistȱdabeiȱeineȱSpezialisierungȱdesȱȱ Oberbegriffs,ȱwobeiȱderȱOberbegriffȱeineȱGeneralisierungȱdesȱneuenȱUnterbegriffsȱ darstellt.ȱ Zurȱ Modellierungȱ desȱ Beziehungszusammenhangsȱ zwischenȱ einemȱȱ OberȬȱundȱeinemȱUnterbegriffȱgibtȱesȱinȱderȱUMLȱdieȱGeneralisierungsbeziehungȱ
9ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ inȱFormȱeinesȱPfeilsȱmitȱgeschlossenerȱSpitze.ȱDerȱUnterbegriffȱerbtȱdieȱIntensionȱ desȱOberbegriffsȱundȱfügtȱnochȱeineȱeigeneȱIntensionȱinȱGestaltȱvonȱweiterenȱeinȬ schränkendenȱAttributen,ȱd.ȱh.ȱspezialisierendenȱBegriffenȱhinzu.ȱ «Begriff» Oberbegriff
ȱ
«Begriff» Unterbegriff
ȱ
ȱ
Abbildungȱ5:ȱGeneralisierungȱverbindetȱUnterbegriffȱmitȱOberbegriffȱ
Amȱ Beispielȱ derȱ hierarchischȱ inȱ Beziehungȱ stehendenȱ Begriffeȱ Geschäftspartner,ȱ KundeȱundȱLieferantȱwirdȱdieȱVerwendungȱderȱhierarchischenȱGeneralisierungsbeȬ ziehungȱ undȱ derȱ attributivenȱ Kompositionsbeziehungȱ veranschaulicht.ȱ Derȱ BeȬ griffȱ Partnerȱ sollȱ durchȱ dieȱ ihnȱ definierendenȱ Begriffeȱ Partner_Nr,ȱ Vornameȱ undȱ Zunameȱdefiniertȱsein.ȱDerȱUnterbegriffȱKundeȱerbtȱdieȱIntensionȱvonȱPartnerȱundȱ wirdȱselbstȱdurchȱseinenȱihnȱspeziellȱdefinierendenȱBegriffȱBonitätȱcharakterisiert.ȱ AuchȱderȱUnterbegriffȱLieferantȱerbtȱdieȱIntensionȱvonȱPartnerȱundȱerhältȱzuȱseinerȱ SpezialisierungȱdenȱBegriffȱLiefertreue.ȱDasȱhiermitȱumrisseneȱBegriffsschemaȱkannȱ mitȱderȱUMLȱsodannȱfolgendermaßenȱdargestelltȱwerden.ȱ «Begriff» Partner
«Begriff» Partner
1
Partner_Nr Vorname Zuname
«Begriff» Kunde Bonität
«Begriff» Lieferant Liefertreue
«Begriff» Partner_Nr
1
«Begriff» Vorname
1
«Begriff» Zuname
«Begriff» Kunde
1
«Begriff» Bonität
«Begriff» Lieferant
1
«Begriff» Liefertreue
ȱ Abbildungȱ6:ȱGeneralisierungsȬȱundȱKompositionsbeziehungȱ
AufȱderȱlinkenȱSeiteȱderȱAbbildungȱ6ȱsindȱdieȱIntensionenȱalsȱAttributeȱdargestellt.ȱ AufȱderȱrechtenȱSeiteȱsindȱsieȱinȱeigenständigenȱUMLȬKlassenȱausgegliedertȱundȱ
10ȱ
2.1ȱȱERMȱ–ȱeinȱkurzerȱÜberblickȱ mittelsȱ Kompositionsbeziehungenȱ mitȱ denȱ durchȱ sieȱ definiertenȱ Begriffenȱ verȬ bunden.ȱ Auchȱ dieȱ neuȱ eingeführtenȱ Begriffeȱ Partner_Nr,ȱ Vornameȱ undȱ Zunameȱ könntenȱ Spezialisierungenȱ bereitsȱ deklarierterȱ Begriffeȱ sein.ȱ Beispielsweiseȱ könnteȱ derȱ BegriffȱPartner_NrȱdurchȱSpezialisierungȱvonȱNummerȱundȱVornameȱsowieȱZunameȱ durchȱ Spezialisierungȱ vonȱ Nameȱ zustandeȱ kommen.ȱ Dieȱ beidenȱ Begriffeȱ Bonitätȱ undȱLiefertreueȱkönntenȱSpezialisierungenȱdesȱbereitsȱdeklariertenȱBegriffsȱQualitätȱ sein.ȱDerȱskizzierteȱTeilausschnittȱdiesesȱBegriffsmodellsȱinȱUMLȱdargestelltȱzeigtȱ Abbildungȱ7.ȱ «Begriff» Nummer
«Begriff» Partner
1 1 1 «Begriff» Kunde «Begriff» Lieferant
1 1
«Begriff» Name
«Begriff» Qualität
«Begriff» Partner_Nr «Begriff» Vorname «Begriff» Zuname
«Begriff» Bonität «Begriff» Liefertreue
ȱ
ȱ
Abbildungȱ7:ȱNeueȱBegriffeȱsindȱSpezialisierungenȱbereitsȱdeklarierterȱBegriffeȱ
2.1 ERM – ein kurzer Überblick Datenarchitekturenȱ derȱ Miniweltȱ werdenȱ üblicherweiseȱ inȱ EntityȬRelationshipȱ Modelsȱ (EntitätsȬBeziehungsȬModellen,ȱ ERM)ȱ inȱ Anlehnungȱ anȱ PinȬShanȱ Chenȱ [CHE76]ȱ dargestellt.ȱ Inȱ diesemȱ Buchȱ wirdȱ hierzuȱ eineȱ erweiterteȱ undȱ moderneȱ FormȱderȱSinnbilderȱverwendet,ȱsoȱwieȱsieȱderzeitȱinȱUMLȱStandȱderȱTechnikȱsind.ȱ Dieȱ Architekturȱ derȱ Miniweltȱ undȱsomitȱ auchȱ derenȱ spiegelbildlicheȱ DatenarchiȬ tekturȱ wirdȱ inȱ einemȱ ERMȱ erfasstȱ undȱ diesesȱ inȱ einemȱ EntityȬRelationshipȱ DiaȬ gramȱ (EntitätsȬBeziehungsȬDiagramm,ȱ ERD)ȱ mitȱ denȱ Sprachmittelnȱ vonȱ UMLȱ dokumentiert.ȱHierbeiȱwerdenȱdieȱNamenȱvonȱEntitätstypenȱmitȱihrenȱAttributenȱ undȱ dieȱ Namenȱ vonȱ Beziehungstypenȱ mitȱ ihrenȱ Multiplizitätenȱ dargestellt.ȱ SoȬ wohlȱ dieȱ Entitätstypenȱ alsȱ auchȱ dieȱ Beziehungstypenȱ sindȱ wiederȱ Begriffeȱ überȱ
11ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ dieȱ Miniwelt.ȱ Meistensȱ entstehenȱ ERMsȱ inȱ derȱ Analysephaseȱ einesȱ SoftwareproȬ jektes.ȱ Inȱ denȱ folgendenȱ Ausführungenȱ verwendenȱ wirȱ Faktenȱ ausȱ derȱ Miniweltȱ RechȬ nungschreibungȱderȱKundenrechnungen.ȱÜberȱdieseȱMiniweltȱsollenȱdieȱfolgendenȱ vereinfachtenȱGeschäftsregelnȱgegebenȱsein.ȱ – EinȱKundeȱkannȱvieleȱRechnungenȱerhalten.ȱ – EineȱRechnungȱwirdȱgenauȱvonȱeinemȱKundenȱerhalten.ȱ – Eineȱ Rechnungȱ bestehtȱ ausȱ mindestensȱ einer,ȱ normalerweiseȱ ausȱ vielenȱ Rechnungspositionen.ȱ – Eineȱ Rechnungspositionȱ istȱ genauȱ inȱ einerȱ Rechnungȱ enthaltenȱ undȱ kannȱ ohneȱdieseȱnichtȱexistieren.ȱ – EineȱRechnungspositionȱbetrifftȱgenauȱeinenȱArtikel.ȱ – EinȱArtikelȱkannȱvonȱvielenȱRechnungspositionenȱbetroffenȱwerden.ȱ Dieȱ Übersetzungȱ dieserȱ Geschäftsregelnȱ führtȱ zuȱ folgendemȱ ERDȱ inȱ UMLȬ Darstellung.ȱ Inȱ ihmȱ sindȱ dieȱ maßgeblichenȱ Begriffeȱ überȱ unsereȱ Miniweltȱ undȱ derenȱZusammenhängeȱdargestellt.ȱEinȱBegriffȱistȱletztlichȱInformationȱüberȱetwas.ȱ DaȱwirȱDatenȱalsȱInformationenȱzumȱZweckeȱderȱVerarbeitungȱauffassenȱkönnenȱ [DIN44300],ȱrepräsentiertȱdasȱERDȱmitȱseinenȱBegriffenȱdieȱabstrakteȱDatenarchiȬ tektur,ȱ dieȱ ausȱ denȱ Angabenȱ derȱ EntitätsȬȱ undȱ Beziehungstypenȱ mitȱ derenȱ MulȬ tiplizitätenȱ besteht.ȱ Eineȱ ausführlicheȱ Darstellungȱ derȱ Miniweltȱ RechnungsschreiȬ bungȱundȱdesȱERMȬAnsatzes,ȱderȱauchȱinȱdiesemȱBuchȱverwendetȱwird,ȱfindenȱSieȱ inȱ[MOO04].ȱImȱERMȱbezeichnenȱwirȱdieȱBegriffeȱalsȱEntitätstypen.ȱ ȱ ȱ
«Entitätstyp» Kunde
1 erhalten *
ȱ ȱ ȱ
«Entitätstyp» Artikel
1
«Entitätstyp» Rechnung
1 enthalten 1..*
«Entitätstyp» Position
betreffen *
ȱ
Abbildungȱ8:ȱDatenarchitekturȱderȱMiniweltȱRechnungschreibungȱ
Imȱ nächstenȱ Arbeitsschrittȱ wirdȱ dieȱ Datenanalyseȱ durchgeführt.ȱ Hierbeiȱ wirdȱ unterȱ demȱ Gesichtspunktȱ desȱ Systemzwecksȱ herausgearbeitet,ȱ durchȱ welcheȱ AtȬ tributeȱ dieȱ einzelnenȱ Entitätstypenȱ definiertȱ sind.ȱ Hierbeiȱ wirdȱ dieȱ Intensionȱ derȱ aufgeführtenȱBegriffsbezeichnerȱdokumentiert.ȱ Zurȱ Erfüllungȱ desȱ Systemzwecksȱ unsererȱ Miniweltȱ sollenȱ inȱ denȱ einzelnenȱ EntiȬ tätstypenȱfolgendeȱAttributeȱerforderlichȱsein.ȱ ȱ ȱ
12ȱ
2.1ȱȱERMȱ–ȱeinȱkurzerȱÜberblickȱ Kundeȱ – – – – – – –
Rechnung
Kunde_Nrȱ Anredeȱ Vornameȱ Zunameȱ Strasseȱ PLZȱ Ortȱ
ȱ
Position
– Rechnung_Nrȱ – Datumȱ – Betragȱ
– Anzahlȱ
ȱ ȱ
Artikel – Artikel_Nrȱ – Nameȱ – Preisȱ
ȱ ȱ
ȱ
ȱ
Dieȱ mitȱ Attributenȱ angereichertenȱ undȱ somitȱ definiertenȱ Entitätstypenȱ undȱ dieȱ Beziehungstypenȱ mitȱ ihrenȱ Multiplizitätenȱ ergebenȱ sodannȱ dasȱ EntitätsȬ BeziehungsȬDiagrammȱderȱMiniweltȱRechnungsschreibung.ȱȱ Daȱ UMLȱ zunächstȱ alsȱ Modellierungsspracheȱ zurȱ Darstellungȱ derȱ Ergebnisseȱ derȱ objektorientiertenȱAnalyseȱundȱdesȱobjektorientiertenȱEntwurfsȱ(Design)ȱgeschafȬ fenȱ wurde,ȱ repräsentierenȱ dieȱ viereckigenȱ Kästenȱ Klassenȱ derȱ objektorientiertenȱ Welt.ȱ UMLȱ istȱ jedochȱ sehrȱ flexibel.ȱ Mitȱ demȱ bereitsȱ erwähntenȱ Konzeptȱ desȱ SteȬ reotypsȱkannȱmanȱdieȱBedeutungȱdesȱKlassensinnbildesȱauchȱERMȬadäquatȱabänȬ dern.ȱ Derȱ Nameȱ einesȱ Stereotypsȱ wirdȱ hierbeiȱ inȱ doppeltenȱ Spitzklammernȱ geȬ schrieben.ȱ Durchȱ denȱ Stereotypȱ ȱ wirdȱ deshalbȱ ausȱ derȱ Klasseȱ einȱ Entitätstyp.ȱȱ Einȱ einfacherȱ Beziehungstypȱ wirdȱ mitȱ demȱ Assoziationssinnbildȱvonȱ UML,ȱ d.ȱ h.ȱ mitȱ einerȱ einfachenȱ Linieȱ zwischenȱ denȱ inȱ Beziehungȱ stehendenȱ Entitätstypenȱ angegeben.ȱ Anȱ denȱ gegenüberliegendenȱ Endenȱ derȱ Beziehungstypenȱ stehenȱ dieȱ Multiplizitäten.ȱMitȱihnenȱwirdȱdokumentiert,ȱmitȱwieȱvielenȱEntitätenȱdesȱgegenȬ überliegendenȱ Entitätstypsȱ eineȱ betrachteteȱ Entitätȱ unterȱ demȱ Aspektȱ desȱ BezieȬ hungstypsȱprinzipiellȱverbundenȱseinȱkann.ȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
«Entitätstyp» Kunde
ȱ ȱ ȱ
*
+ Kunde_Nr + Anrede + Vorname + Zuname + Strasse + PLZ + Ort
ȱ ȱ
1 erhalten
«Entitätstyp» Artikel
«Entitätstyp» Rechnung + Rechnung_Nr + Datum + /Betrag
1
1 enthalten 1..*
«Entitätstyp» Position + Anzahl
*
betreffen
+ Artikel_Nr + Name + Preis
ȱ
Abbildungȱ9:ȱMitȱAttributenȱangereicherteȱDatenarchitekturȱderȱMiniweltȱ
13ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ Soȱ besagtȱ derȱ Sternȱ (*ȱ oderȱ genauerȱ 0..*)ȱ amȱ Eingangȱ desȱ Entitätstypsȱ Rechnung,ȱ dassȱeineȱbetrachteteȱKundenentitätȱmitȱnullȱbisȱvielenȱEntitätenȱdesȱEntitätstypsȱ RechnungȱunterȱdemȱAspektȱderȱBeziehungȱerhaltenȱverbundenȱseinȱkann.ȱInȱandeȬ renȱ Worten,ȱ einȱ Kundeȱ kannȱ nullȱ bisȱ vieleȱ Rechnungenȱ vomȱ betrachtetenȱ UnterȬ nehmenȱ erhalten.ȱ Dieȱ Multiplizitätȱ Einsȱ (1)ȱ amȱ Eingangȱ desȱ Entitätstypsȱ Kundeȱ besagt,ȱdassȱeineȱRechnungȱgenauȱvonȱeinemȱKundenȱerhaltenȱwird.ȱ Einȱ EntitätsȬBeziehungsȬDiagrammȱ dokumentiertȱ somitȱ inȱ übersichtlicherȱ Formȱ dieȱkonzeptionelleȱ(logische)ȱDatenstrukturȱderȱMiniweltȱundȱsomitȱauchȱdieȱZuȬ sammenhängeȱderȱhierinȱmaßgeblichenȱBegriffe.ȱȱ
2.2 RDBM – ein kurzer Überblick Wieȱ dieȱ implementierungsspezifischeȱ Datenarchitekturȱ ausȱ derȱ Perspektiveȱ desȱ Anwendersȱaussieht,ȱ hängtȱ davonȱ ab,ȱwelchesȱ Datenbankmodellȱ alsȱ Pateȱfürȱdieȱ Implementierungȱverwendetȱwird.ȱImȱFortgangȱderȱDarlegungenȱwerdenȱwirȱdasȱ relationaleȱ undȱ dasȱ dokumentenorientierte,ȱ hierarchischeȱ Datenbankmodellȱ alsȱ ImplementierungspatenȱinȱVerbindungȱmitȱXMLȱdarstellen.ȱBeideȱDatenbankmoȬ delleȱsindȱseitȱderȱVersionȱ9ȱimȱDatenbankverwaltungssystemȱDB2ȱabbildbar,ȱdaȱ DB2ȱnunȱauchȱdenȱDatentypȱXMLȱbeherrscht.ȱWeilȱDB2ȱseitȱlängererȱZeitȱauchȱdasȱ objektorientierteȱDatenbankmodellȱversteht,ȱistȱDB2ȱheuteȱeinȱuniversellesȱDatenȬ banksystemȱ (UDBMS).ȱ Mitȱ einerȱ weitgehendenȱ Implementierungȱ derȱ Vorgabenȱ vonȱ SQL3ȱ undȱ derȱ Implementierungȱ vielerȱ Sprachelementeȱ vonȱ XQueryȱ inȱ VerȬ bindungȱ mitȱXMLȱSchemaȱ istȱ DB2ȱ heuteȱeinȱ sehrȱ mächtigesȱundȱdadurchȱ natürȬ lichȱauchȱsehrȱumfangreichesȱDatenbankverwaltungssystem.ȱ Inȱ derȱ Entwurfsphaseȱ (Design)ȱ desȱ Softwareentwicklungsprozessesȱ wirdȱ dieȱ DaȬ tenarchitekturȱ desȱ erarbeitetenȱ EntitätsȬBeziehungsȬDiagrammsȱ unterȱ Beachtungȱ derȱ Erfordernisseȱ desȱ anzuwendendenȱ PatenȬDatenbankmodellsȱ inȱ einȱ anwenȬ dungsspezifischesȱ Datenbankmodellȱ überführtȱ undȱ inȱ einemȱ DatenbankȬ DiagrammȱmitȱderȱuniversellenȱModellierungsspracheȱUMLȱdargestellt.ȱȱ DieȱDatenȱüberȱdieȱMiniweltȱsollenȱimȱFortgangȱderȱAusführungenȱnachȱdenȱVorȬ gabenȱ desȱRelationalenȱDatenbankmodellsȱ vonȱ E.ȱF.ȱCoddȱ[COD70]ȱinȱDB2ȱimpȬ lementiertȱ werden.ȱ Deshalbȱ istȱ dasȱ ERMȱ Rechnungsschreibungȱ inȱ eineȱ relationaleȱ Datenarchitekturȱ zuȱ überführen.ȱ Dieseȱ wirdȱ inȱ einemȱ implementierungsspeziȬ fischenȱrelationalenȱDatenbankmodellȱundȱsinnvollerȱWeiseȱmitȱdemȱSprachvorratȱ vonȱ UMLȱ übersichtlichȱ dargestellt.ȱ Dasȱ Datenbankdiagrammȱ bezeichnenȱ wirȱ soȬ dannȱalsȱrelationalesȱDatenbankdiagrammȱ(RDBD)ȱRechnungsschreibung.ȱ Dieȱ Überführungȱ einesȱ ERMȱ inȱ einȱ RDBDȱ kannȱ inȱ zweiȱ Schrittenȱ erfolgen.ȱ Imȱ erstenȱSchrittȱtransformiertȱmanȱeinenȱEntitätstypȱinȱeinenȱRelationstyp.ȱDieserȱistȱ sodannȱdahingehendȱzuȱuntersuchen,ȱobȱerȱsichȱinȱderȱdrittenȱNormalformȱbefinȬ det.ȱDiesȱistȱdannȱderȱFall,ȱwennȱerȱnurȱskalareȱAttributeȱbesitzt,ȱkeineȱTeilschlüsȬ selabhängigkeitenȱundȱkeineȱtransitivenȱAbhängigkeitenȱaufweist.ȱEineȱdetaillierȬ
14ȱ
2.2ȱȱRDBMȱ–ȱeinȱkurzerȱÜberblickȱ teȱBeschreibungȱderȱModelltransformationȱundȱderȱNormalisierungȱfindenȱSieȱinȱ [MOO04].ȱ Imȱ zweitenȱ Schrittȱ werdenȱ dieȱ Beziehungstypenȱ desȱ ERMȱ inȱ FremdȬ schlüsselȱabgebildet.ȱDasȱFremdschlüsselattributȱistȱinȱdemȱRelationstypȱunterzuȬ bringen,ȱinȱdemȱesȱdasȱGebotȱderȱerstenȱNormalformȱnichtȱverletzt.ȱEsȱmussȱsomitȱ ebenfallsȱ skalarȱ sein.ȱ Eineȱ vieleȬzuȬvieleȬBeziehungȱ istȱ deshalbȱ inȱ einenȱ BezieȬ hungsrelationstypȱ zuȱ transformieren,ȱ derȱ überȱ zweiȱ vieleȬzuȬeinsȬBeziehungstyȬ penȱ dieȱ ursprünglichenȱ Relationstypenȱ miteinanderȱ verbindet.ȱ Inȱ demȱ neuȱ entȬ standenenȱBeziehungsrelationstypȱsindȱdieȱFremdschlüsselattributeȱzuȱimplemenȬ tieren.ȱAuchȱhierüberȱfindenȱSieȱNäheresȱinȱ[MOO04].ȱ DieseȱVorgehensweiseȱwendenȱwirȱnunȱaufȱdasȱERMȱinȱAbbildungȱ9ȱan.ȱSieȱführtȱ zuȱdemȱfolgendenȱrelationalenȱDatenbankdiagrammȱinȱAbbildungȱ10.ȱDieȱRelatiȬ onstypenȱ entsprechenȱ denȱ Entitätstypenȱ desȱ zugrundeȱ liegendenȱ ERM,ȱ weilȱ dieȱ RelationstypenȱnachȱderȱAbleitungȱsichȱbereitsȱinȱderȱdrittenȱNormalformȱbefunȬ denȱhaben.ȱDieȱBeziehungstypenȱdesȱERMȱhabenȱsichȱinȱdenȱFremdschlüsselattriȬ butenȱ derȱ Relationstypenȱ niedergeschlagen.ȱ Beispielsweiseȱ istȱ dasȱ FremdschlüsȬ selattributȱ Kunde_Nrȱ imȱ Relationstypȱ Rechnungȱ dieȱ Implementierungȱ desȱ BezieȬ hungstypsȱerhaltenȱimȱERDȱRechnungsschreibung.ȱZumȱbesserenȱVerständnisȱistȱdieȱ AssoziationȱerhaltenȱmitȱihrenȱMultiplizitätenȱimȱRDBDȱredundantȱaufgeführt.ȱImȱ Relationstypȱ Positionȱ bildenȱ dieȱ beidenȱ Attributeȱ Rechnung_Nrȱ undȱ Artikel_Nrȱ zusammenȱdenȱPrimärschlüssel.ȱSieȱerfüllenȱjedochȱeineȱDoppelrolle.ȱJedesȱdieserȱ Attributeȱ alleineȱ implementiertȱ zusätzlich,ȱ alsȱ Fremdschlüsselȱ genutzt,ȱ einenȱ BeȬ ziehungstyp.ȱDasȱAttributȱRechnung_NrȱinȱPositionȱimplementiertȱdenȱBeziehungsȬ typȱenthaltenȱundȱdasȱAttributȱArtikel_NrȱdenȱBeziehungstypȱbetreffenȱdesȱERM.ȱȱ ȱ
«table» Kunde
1 erhalten 0..*
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
«table» Artikel Artikel_Nr : CHAR(4) Name : CHAR(15) Preis : DECIMAL(11, 2)
«table» Rechnung
1 enthalten 1..*
Rechnung_Nr : CHAR(4) Kunde_Nr : CHAR(4) Datum : DATE
ȱ
«table» Position Rechnung_Nr : CHAR(4) Artikel_Nr : CHAR(4) Anzahl : DECIMAL(5, 0)
ȱ
*
ȱ 1
betreffen
ȱ
ȱ
ȱ
Abbildungȱ10:ȱRelationalesȱDatenbankdiagrammȱRechnungsschreibungȱ
ÜberȱdenȱNamenȱderȱRelationstypenȱstehtȱderȱStereotypȱ
.ȱHiermitȱwirdȱ festgehalten,ȱ dassȱ derȱ jeweiligeȱ Kastenȱ keineȱ Klasse,ȱ sondernȱ einenȱ Relationstypȱ
15ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ repräsentiert,ȱ derȱ anschließendȱ inȱ Gestaltȱ einerȱ Tabelleȱ (table)ȱ imȱ DatenbanksysȬ temȱimplementiertȱwird.ȱ Vorȱ denȱ Attributnamenȱ derȱ Relationstypenȱ stehenȱ nochȱ Markierungenȱ (engl.:ȱ tags)ȱinȱFormȱvonȱAbkürzungen.ȱDieȱAbkürzungȱPKȱstehtȱhierbeiȱfürȱPrimaryȱKeyȱ (Primärschlüssel)ȱ undȱ FKȱ fürȱ Foreignȱ Keyȱ (Fremdschlüssel).ȱ Dieȱ Abkürzungȱ Nȱ stehtȱfürȱNullȱundȱbedeutetȱunbekannt.ȱHiermitȱwirdȱausgedrückt,ȱdassȱinȱdieȱSpalȬ te,ȱdieȱdemȱjeweiligenȱAttributȱinȱderȱDatenbankȱentspricht,ȱderȱSpaltenwertȱnichtȱ eingegebenȱ werdenȱ muss,ȱ sondernȱ unbekanntȱ bleibenȱ darf.ȱ Schließlichȱ stehenȱ rechtsȱ vonȱ denȱ Attributnamenȱ nochȱ dieȱ SQLȬDatentypenȱ alsȱ Vorlageȱ fürȱ dieȱ anȬ schließendeȱImplementierungȱmittelsȱSQL.ȱ Nachȱ derȱ Erarbeitungȱ desȱ implementierungsspezifischenȱ Entwurfsmodellsȱ kannȱ mitȱ derȱ Implementierungȱ derȱ gefundenenȱ Relationstypenȱ begonnenȱ werden.ȱ HierzuȱdientȱderȱDatenbeschreibungsteilȱvonȱSQL,ȱhierȱvonȱDB2ȬSQL,ȱVersionȱ9.5.ȱ
2.3 SQL-DDL – eine vereinfachte Anwendung DieȱDatenbankspracheȱStructuredȱQueryȱLanguageȱ(SQLȱ–ȱStrukturierteȱAnfrageȬ sprache)ȱwurdeȱinȱihrerȱaktuellenȱFassungȱimȱJahreȱ2003ȱvonȱderȱInternationalȱOrȬ ganizationȱforȱStandardizationȱ(ISO)ȱundȱderȱInternationalȱElectrotechnicalȱCommissionȱ (IEC)ȱ unterȱ derȱ Bezeichnungȱ SQL:2003ȱ verabschiedetȱ [ISO03].ȱ Derzeitȱ wirdȱ dieȱ nächsteȱ SQLȬNormȱ entwickelt,ȱ dieȱ SQL:2007ȱ heißenȱ soll.ȱ Bereitsȱ dieȱ Normȱ SQL:2003ȱenthältȱdenȱDatentypȱXML.ȱSpeziellȱumȱDatenobjekteȱdiesesȱTyps,ȱihreȱ Erzeugungȱ undȱ Verarbeitung,ȱ gehtȱ esȱ inȱ diesemȱ Buch.ȱ Aufȱ denȱ Datentypȱ XMLȱ werdenȱwirȱinȱdenȱfolgendenȱKapitelnȱnochȱintensivȱeingehen.ȱ DieȱherkömmlicheȱSQLȬSpracheȱbestehtȱausȱdenȱdreiȱTeilenȱ – DDLȱ–ȱDataȱDescriptionȱLanguageȱ ȱ(Datendefinitionssprache)ȱ – DMLȱ–ȱDataȱManipulationȱLanguageȱ(Datenmanipulationssprache)ȱ – DCLȱ–ȱDataȱControlȱLanguageȱ(Datenberechtigungssprache)ȱ Mitȱ denȱ Sprachmittelnȱ derȱ Datendefinitionsspracheȱ werdenȱ demȱ DatenbankproȬ zessorȱdieȱMetadatenȱüberȱTabellenȱundȱvieleȱweitereȱDatenbankobjekteȱmitgeteiltȱ bzw.ȱdieȱMetadatenȱgepflegt.ȱDieȱzentralenȱSQLȬBefehleȱhierzuȱsind:ȱ – CREATEȱ–ȱschreibtȱMetadatenȱinȱdenȱDatenbankkatalogȱundȱerzeugtȱhierȬ mitȱDatenbankobjekteȱunterschiedlicherȱArtenȱ – DROPȱ–ȱlöschtȱMetadatenȱausȱdemȱDatenbankkatalogȱ – ALTERȱ–ȱverändertȱMetadatenȱimȱDatenbankkatalogȱ – SELECTȱ–ȱliestȱMetadatenȱimȱDatenbankkatalogȱ ZurȱManipulationȱderȱNutzdatenȱdienenȱdieȱBefehleȱ – INSERTȱ–ȱschreibtȱNutzdatenȱinȱeineȱTabelleȱ – DELETEȱ–ȱlöschtȱNutzdatenȱausȱeinerȱTabelleȱ – UPDATEȱ–ȱverändertȱNutzdatenȱinȱeinerȱTabelleȱ
16ȱ
2.3ȱȱSQLȬDDLȱ–ȱeineȱvereinfachteȱAnwendungȱ – SELECTȱ–ȱliestȱNutzdatenȱ ZurȱVergabeȱundȱzumȱEntzugȱvonȱZugriffsrechtenȱsindȱzuständigȱ – GRANTȱ–ȱvergibtȱRechteȱ – REVOKEȱ–ȱentziehtȱRechteȱ
2.3.1 Beispieltabellen vereinbaren MitȱdemȱDatendefinitionsbefehlȱCREATEȱTABLEȱwerdenȱnunȱdieȱMetadatenȱüberȱ dieȱvierȱRelationenȱunseresȱDatenbankentwurfsȱRechnungschreibungȱinȱAbbildungȱ 10ȱinȱGestaltȱvonȱTabellendeklarationenȱdemȱDatenbankprozessorȱmitgeteilt.ȱHierȬ beiȱ beschränkenȱ wirȱ unsȱ aufȱ einenȱ minimalenȱ Sprachumfang,ȱ umȱ unsȱ aufȱ dasȱ Wesentlicheȱ fürȱ diesesȱ Buchȱ zuȱ konzentrieren.ȱ Obgleichȱ dieȱ SQLȬBefehleȱ fundaȬ mentalesȱ SQLȱ sind,ȱ gebenȱ wirȱ sieȱ hierȱ an.ȱ Dadurchȱ kannȱ derȱ geneigteȱ Leserȱ dieȱ folgendenȱinnovativenȱBeispiele,ȱdieȱaufȱdenȱErgebnissenȱdieserȱBefehleȱaufbauen,ȱ mitȱminimalemȱArbeitsaufwandȱpraktischȱnachvollziehen.ȱ DaȱinȱdenȱTabellenȱderȱDatenbankȱspeziellȱauchȱSpaltenȱmitȱdemȱneuenȱDatentypȱ XMLȱ vereinbartȱ werden,ȱ mussȱ dieȱ Datenbankȱ inȱ derȱ Lageȱ sein,ȱ Unicodeȱ zuȱ verȬ stehen.ȱ Derȱ Grundȱ hierfürȱ ist,ȱ dassȱ XMLȬObjekteȱ internȱ inȱ Unicodeȱ gespeichertȱ werden.ȱȱ Zumȱ Fortgangȱ derȱ Arbeitȱ mussȱ deshalbȱ zunächstȱ eineȱ unicodefähigeȱ Datenbankȱ vereinbartȱwerden.ȱDieȱvereinfachteȱSyntaxȱdesȱhierzuȱgeeignetenȱBefehlsȱCREAȬ TEȱDATABASEȱinȱBackusȬNaurȬNotationsformȱzeigtȱdieȱfolgendeȱSyntax.ȱ ȱ ȱ
CREATE DATABASE datenbankname [USING CODESET zeichensatz TERRITORY gebiet]
Syntaxȱ1:ȱCREATEȱDATABASEȱ–ȱvereinfachteȱSyntaxȱ
Dieȱ unicodefähigeȱ Datenbankȱ sollȱ xmldbȱ heißen.ȱ Sieȱ wird,ȱ umȱ unicodefähigȱ zuȱ sein,ȱmitȱdemȱZeichensatzȱUTFȬ8ȱundȱdemȱGebietscodeȱDEȱvereinbart.ȱ CREATE DATABASE xmldb USING CODESET UTF-8 TERRITORY DE
(1)
Programmȱ1:ȱVereinbarungȱderȱunicodefähigenȱDatenbankȱxmldbȱ
InȱdieserȱDatenbankȱvereinbarenȱwirȱnunȱdieȱvierȱTabellen,ȱwelcheȱdieȱDatenȱüberȱ dieȱMiniweltȱRechnungsschreibungȱaufnehmenȱwerden.ȱ CREATE TABLE Kunde (Kunde_Nr CHAR ( 4) NOT NULL PRIMARY KEY, Anrede CHAR ( 4), Vorname CHAR (15),
(1) (2) (3) (4) (5) (6)
17ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ Zuname Strasse PLZ Ort );
CHAR CHAR CHAR CHAR
(15), (15), ( 5), (15)
(7) (8) (9) (10) (11)
Programmȱ2:ȱVereinbarungȱTabelleȱKunde CREATE TABLE Rechnung (Rechnung_Nr CHAR ( 4) NOT NULL PRIMARY KEY, Kunde_Nr CHAR ( 4) REFERENCES Kunde (Kunde_Nr) ON DELETE RESTRICT, Datum DATE, Betrag DEC (11, 2) );
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
Programmȱ3:ȱVereinbarungȱTabelleȱRechnung CREATE TABLE Artikel (Artikel_Nr CHAR ( 4) NOT NULL PRIMARY KEY, Name CHAR (15), Preis DEC (11, 2) ) ;
(1) (2) (3) (4) (5) (6) (7) (8)
Programmȱ4:ȱVereinbarungȱTabelleȱArtikel CREATE TABLE Position (Rechnung_Nr CHAR (4) NOT NULL REFERENCES Rechnung (Rechnung_Nr), Artikel_Nr CHAR (4) NOT NULL REFERENCES Artikel (Artikel_Nr), Anzahl DEC (5, 0), PRIMARY KEY (Rechnung_Nr, Artikel_Nr) ) ;
Programmȱ5:ȱVereinbarungȱTabelleȱPositionȱ
18ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
2.3ȱȱSQLȬDDLȱ–ȱeineȱvereinfachteȱAnwendungȱ
2.3.2 Beispieltabellen laden ZumȱSchlussȱladenȱwirȱdieȱTabellenȱmitȱdenȱDatenȱunsererȱMiniwelt.ȱEinzelheitenȱ hierüberȱkönnenȱinȱ[MOO04]ȱnachgelesenȱwerden.ȱDerȱUmfangȱderȱTabellenȱsollȱ möglichstȱ geringȱ sein.ȱ Jedochȱ soȱ groß,ȱ dassȱ hierausȱ sinnvolleȱ XMLȬDokumenteȱ erzeugbarȱsind.ȱ INSERT INTO Kunde VALUES ('K001', 'Herr', 'Hugo', 'Mueller', 'Gartenstr. 4a', '69123', 'Heidelberg'), ('K002', 'Herr', 'Georg', 'Mayer', 'Neckarstr. 1', '69123', 'Heidelberg'), ('K003', 'Frau', 'Eva', 'Schulze', 'Hauptstr. 7', '69502', 'Hemsbach' ) ;
(1) (2) (3) (4) (5) (6) (7)
Programmȱ6:ȱLadenȱTabelleȱKundeȱ INSERT INTO Rechnung VALUES ('R001', 'K001', '04.04.2008', 13000), ('R002', 'K001', '05.04.2008', 2000), ('R003', 'K002', '05.04.2008', 5000) ;
(1) (2) (3) (4) (5) (6) (7)
Programmȱ7:ȱLadenȱTabelleȱRechnungȱ INSERT INTO Artikel VALUES ('A001', ('A002', ('A003', ('A004', ;
'Computer', 'Drucker', 'Bildschirm', 'Kabel',
5000), 1000), 500) , 50)
(1) (2) (3) (4) (5) (6) (7) (8)
Programmȱ8:ȱLadenȱderȱTabelleȱArtikelȱ
19ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ ȱ
INSERT INTO Position VALUES ('R001', ('R001', ('R002', ('R002', ('R003', ;
'A001', 'A002', 'A002', 'A003', 'A001',
2), 3), 1), 2), 1)
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ9:ȱLadenȱderȱTabelleȱPositionȱ
2.3.3 Beispieltabellen lesen BeimȱModellierenȱmitȱderȱAnalysetechnikȱdesȱERM,ȱderȱhieraufȱfolgendenȱÜberȬ führungȱ derȱ gefundenenȱ Entitätstypenȱ inȱ Relationstypenȱ undȱ schließlichȱ derȱ NormalisierungȱderȱRelationstypenȱentstehenȱnormalerweiseȱmehrereȱredundanzȬ freieȱ Relationstypen.ȱ Dieȱ Relationstypenȱ werdenȱ anschließendȱ mittelsȱ SQLȱ inȱȱ GestaltȱvonȱTabellenȱinȱeinemȱDatenbanksystemȱimplementiert.ȱDieȱTabellenȱsteȬ henȱsodannȱuntereinanderȱinȱBeziehung.ȱDieȱDatenȱüberȱdieȱMiniweltȱwerdenȱinȱ diesenȱTabellenȱgespeichertȱundȱhierbeiȱüberȱdieȱTabellenȱverteilt.ȱ OftȱwerdenȱinȱAnwendungenȱDatenȱausȱmehrerenȱdieserȱTabellenȱinȱzusammenȬ gefügterȱ Formȱ benötigt.ȱ Derȱ Zusammenbauȱ derȱ anwendungsspezifischenȱ DatenȬ verbundeȱ wirdȱ inȱ SQLȱ mitȱ demȱ Verbundoperatorȱ imȱ Rahmenȱ einesȱ innerenȱ Gleichheitsverbundesȱ(engl.ȱinnerȱjoin)ȱerreicht.ȱȱ EinführendesȱBeispielȱ ImȱfolgendenȱBeispielȱwerdenȱZeilenȱderȱTabelleȱRechnungȱmitȱZeilenȱderȱTabelleȱ Positionȱ durchȱ eineȱ Verbundoperationȱ verbunden.ȱ Dieȱ Datenȱ derȱ Rechnungȱ mitȱ derȱRechnung_Nrȱ=ȱȇR001ȇȱwerdenȱhierbeiȱimȱRahmenȱeinerȱTotalprojektionȱinȱdieȱ Ergebnistabelleȱ projiziert.ȱ Dadurchȱ entstehtȱ gewolltȱ einȱ unnatürlicherȱ Verbund,ȱ weilȱdieselbenȱRechnungsnummernȱinȱzweiȱErgebnisspaltenȱvorkommen.ȱ DieȱfolgendeȱAbbildungȱ11ȱzeigt,ȱdassȱdieȱErgebnistabelleȱausȱdenȱSpaltenȱderȱTaȬ bellenȱ Rechnungȱ undȱ Positionȱ gebildetȱ wird.ȱ Zurȱ Angabeȱ diesesȱ AbhängigkeitsȬ zusammenhangsȱ kannȱ dieȱ Abhängigkeitsbeziehungȱ (engl.ȱ dependencyȱ relationȬ ship)ȱvonȱUMLȱverwendetȱwerden.ȱȱ Dieȱ Datenstrukturȱ einerȱ Tabelleȱ imȱ klassischenȱ relationalenȱ Datenbankmodellȱ istȱ eineȱflacheȱStruktur.ȱDasȱbedeutet,ȱdassȱesȱkeineȱhierarchischeȱGliederungȱinnerȬ halbȱ derȱ Datenstrukturȱ gibt.ȱ Eineȱ flacheȱ Strukturȱ liegtȱ somitȱ dannȱ vor,ȱ wennȱdieȱ Datenelementeȱ einerȱ Datenstrukturȱ allesamtȱ aufȱ derselbenȱ hierarchischenȱ Ebeneȱ liegen,ȱ wennȱ esȱ somitȱ keineȱ hierarchischeȱ Untergliederungȱ derȱ Datenelementeȱ gibt.ȱ ȱ ȱ
20ȱ
2.3ȱȱSQLȬDDLȱ–ȱeineȱvereinfachteȱAnwendungȱ ȱ
«table» Rechnung
ȱ
Rechnung_Nr : CHAR(4) Kunde_Nr : CHAR(4) Datum : DATE
ȱ ȱ ȱ
1 enthalten 1..*
«table» Position Rechnung_Nr : CHAR(4) Artikel_Nr : CHAR(4) Anzahl : DECIMAL(5, 0)
«table» Ergebnistabelle
ȱ
Rechnung_Nr Kunde_Nr Datum Rechnung_Nr Artikel_Nr Anzahl
ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ11:ȱAufbauȱderȱErgebnistabelleȱausȱdenȱbeidenȱTabellenȱRechnungȱundȱPosiȬ tionȱ
Dasȱ folgendeȱ Programmȱ zeigt,ȱ wieȱ mitȱAnwendungȱ desȱ Operatorsȱ INNERȱJOINȱ inȱ denȱ Zeilenȱ (9)ȱ undȱ (10)ȱ dieȱ Ergebnistabelleȱ ausȱ denȱ beidenȱ Ausgangstabellenȱ RechnungȱundȱPositionȱgebildetȱwird.ȱInȱderȱZeileȱ(11)ȱwirdȱdieȱAuswahlȱausȱdemȱ VerbundergebnisȱaufȱZeilenȱmitȱderȱRechnungsnummerȱȇR001ȇȱeingegrenzt.ȱ SELECT R.Rechnung_Nr AS R_NR, R.Kunde_Nr AS R_NR, R.Datum AS Datum, R.Betrag AS Betrag, P.Rechnung_Nr AS R_NR, P.Artikel_Nr AS A_NR, P.Anzahl AS ANZAHL FROM Rechnung R INNER JOIN Position P ON R.Rechnung_Nr = P.Rechnung_Nr WHERE R.Rechnung_Nr = 'R001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
Programmȱ10:ȱInnererȱGleichheitsverbundȱerzeugtȱRedundanz
Ergebnisȱ R_NR –––– R001 R001
R_NR –––– K001 K001
DATUM BETRAG R_NR A_NR ANZAHL –––––––––– ––––––––––––– –––– –––– ––––––– 2008-04-04 13000,00 R001 A001 2, 2008-04-04 13000,00 R001 A002 3,
Wieȱmanȱsieht,ȱsindȱdieȱgrauȱunterlegtenȱDatenȱredundant.ȱSieȱsindȱinȱderȱerstenȱ Zeileȱ bereitsȱ enthalten.ȱ Dieȱ Redundanzȱ entsteht,ȱ weilȱ jedeȱ Positionszeileȱ mitȱ derȱ Rechnungszeileȱ verbundenȱ wird,ȱ dieȱ mitȱ derȱ jeweiligenȱ Positionszeileȱ inȱ BezieȬ hungȱ steht.ȱ Daȱ inȱ unseremȱ Beispielȱ dieȱ Rechnungȱ mitȱ derȱ Rechnungsnummerȱ
21ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ ȇR001ȇȱausȱzweiȱPositionszeilenȱbesteht,ȱweistȱdieȱErgebnistabelleȱsomitȱauchȱzweiȱ Zeilenȱaus.ȱAllgemeinȱkannȱmanȱfeststellen,ȱdassȱesȱinȱderȱErgebnistabelleȱimmerȱ dannȱdieȱdargestellteȱArtȱanȱRedundanzȱgibt,ȱwennȱeineȱderȱMultiplizitätenȱeinerȱ BeziehungȱzwischenȱzweiȱTabellenȱderȱArtȱvieleȱistȱ(UML:ȱ*)ȱundȱinȱderȱTabelleȱmitȱ dieserȱMultiplizitätȱ(z.ȱB.ȱPosition)ȱmehrȱalsȱeineȱZeileȱmitȱeinerȱZeileȱderȱgegenüȬ berliegendenȱTabelleȱ(z.ȱB.ȱRechnung)ȱverbundenȱist.ȱ BeispielȱmitȱVIEWȱ UmȱdieȱDatenunabhängigkeitȱderȱAnwendungsprogrammeȱvonȱderȱStrukturȱundȱ denȱ Zugriffspfadenȱ derȱ Datenhaltungȱ zuȱ erreichen,ȱ istȱ esȱ sinnvoll,ȱ denȱ ZusamȬ menbauȱvonȱzuȱverbindendenȱZeilenȱinȱeineȱexterneȱSichtȱ(View)ȱzuȱverlagern.ȱDasȱ Ergebnisȱ einesȱ solchenȱ Verbundesȱ istȱ sodannȱ eineȱ virtuelleȱ Tabelle,ȱ dieȱ ausȱ denȱ gewünschtenȱSpaltenȱderȱBasistabellenȱbestehtȱundȱnurȱtemporärȱimȱZentralspeiȬ cherȱ existiert.ȱInȱdenȱZeilenȱdieserȱ Tabelleȱsindȱ dannȱ oftȱredundanteȱDatenwerteȱ enthalten.ȱ Diesȱ kann,ȱ wieȱ obenȱ ausgeführt,ȱ immerȱ dannȱ derȱ Fallȱ sein,ȱ wennȱ dieȱ einzelnenȱTabellenȱmitȱBeziehungȱderȱMultiplizitätȱvieleȱ(UML:ȱ*)ȱverbundenȱsind.ȱ UndȱesȱistȱdannȱtatsächlichȱderȱFall,ȱwennȱdieȱMultiplizitätȱvieleȱinȱeinerȱKardinaȬ litätȱgrößerȱalsȱeinsȱbeiȱderȱAnzahlȱderȱverbundenenȱZeilenȱsichȱniedergeschlagenȱ hat.ȱȱ InȱUMLȱverstehtȱmanȱunterȱdemȱBegriffȱMultiplizitätȱdieȱAnzahlȱprinzipiellȱmögliȬ cherȱVerbindungenȱundȱunterȱdemȱBegriffȱKardinalitätȱdieȱAnzahlȱderȱtatsächlichȱ gegebenenȱ Verbindungen.ȱ Derȱ Begriffȱ Multiplizitätȱ wirdȱ inȱ UMLȱ hauptsächlichȱ aufȱ derȱ Modellierungsebeneȱ undȱ derȱ Begriffȱ Kardinalitätȱ aufȱ derȱ AusprägungsȬ ebeneȱbenutzt,ȱumȱAussagenȱüberȱAnzahlenȱzuȱmachen.ȱ ImȱfolgendenȱrelationalenȱDatenbankdiagrammȱinȱAbbildungȱ12ȱistȱgezeigt,ȱdassȱ dieȱ externeȱ Sichtȱ (engl.ȱ view)ȱ RechnungViewȱ vonȱ denȱ vierȱ Basistabellenȱ Kunde,ȱ Rechnung,ȱ Positionȱ undȱ Artikelȱ abhängigȱ ist.ȱ Mitȱ demȱ Stereotypȱ ȱanȱdenȱgestricheltenȱAbhängigkeitsbeziehungenȱwirdȱdiesȱbesondersȱdeutlichȱ ausgedrückt.ȱAuchȱeineȱvirtuelleȱundȱnurȱtemporärȱimȱZentralspeicherȱvorhandeȬ neȱ ViewȬTabelleȱ hatȱ eineȱ flacheȱ Datenstruktur.ȱ Alleȱ Spaltenȱ liegenȱ aufȱ derselbenȱ hierarchischenȱEbene.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
22ȱ
2.3ȱȱSQLȬDDLȱ–ȱeineȱvereinfachteȱAnwendungȱ ȱ
«table» Kunde
ȱ
1 erhalten
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
ȱ ȱ ȱ
0..*
«table» Rechnung
1 enthalten
Rechnung_Nr : CHAR(4) Kunde_Nr : CHAR(4) Datum : DATE Betrag : DECIMAL(11, 2)
«table» Position Rechnung_Nr : CHAR(4) Artikel_Nr : CHAR(4) Anzahl : DECIMAL(5, 0)
«view dependency» Position
*
betreffen
ȱ ȱ
1..*
1 «view dependency» Kunde
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
«view dependency» Rechnung «database view» RechnungView
«view dependency» Artikel
«table» Artikel Artikel_Nr : CHAR(4) Name : CHAR(15) Preis : DECIMAL(11, 2)
/Kunde_Nr = "Kunde"."Kunde_Nr" /Anrede = "Kunde"."Anrede" /Vorname = "Kunde"."Vorname" /Zuname = "Kunde"."Zuname" /Strasse = "Kunde"."Strasse" /PLZ = "Kunde"."PLZ" /Ort = "Kunde"."Ort" /Rechnung_Nr = "Rechnung"."Rechnung_Nr" /Datum = "Rechnung"."Datum" /Betrag = "Rechnung.Betrag" /Anzahl = "Position"."Anzahl" /Artikel_Nr = "Artikel"."Artikel_Nr" /Name = "Artikel"."Name" /Preis = "Artikel"."Preis"
ȱ ȱ Abbildungȱ12:ȱDieȱvirtuelleȱTabelleȱRechnungViewȱundȱihreȱBasistabellenȱ
Dieȱ externeȱ Sichtȱ RechnungViewȱ wirdȱ nunȱ mitȱ SQLȱ implementiert.ȱ Anschließendȱ wirdȱuntersucht,ȱobȱdieȱMultiplizitätenȱderȱArtȱvieleȱ(UML:ȱ*)ȱanȱdenȱBeziehungsȬ typenȱerhalten,ȱenthaltenȱundȱbetreffenȱtatsächlichȱzuȱRedundanzȱführen,ȱwennȱdieȱ Viewȱangewendetȱwird.ȱ Dieȱ flacheȱ Datenstrukturȱ wirdȱ durchȱ dieȱ Projektionȱ derȱ Spaltenȱ ausȱ denȱ BasistaȬ bellenȱ inȱ dieȱ virtuelleȱ ViewȬTabelleȱ inȱ denȱ Programmzeilenȱ (2)ȱ bisȱ (15)ȱ erreicht.ȱ HierbeiȱwerdenȱdieȱSpaltennamenȱausȱdenȱBasistabellenȱimplizitȱauchȱalsȱSpaltenȬ namenȱ inȱ dieȱ virtuelleȱ ViewȬTabelleȱ übernommen.ȱ Eineȱ dynamischeȱ UmbenenȬ nungȱderȱSpaltennamenȱerfolgtȱnicht.ȱ
23ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ ȱ
CREATE VIEW RechnungView AS SELECT K.Kunde_Nr, K.Anrede, K.Vorname, K.Zuname, K.Strasse, K.PLZ, K.Ort, R.Rechnung_Nr, R.Datum, R.Betrag, P.Anzahl, A.Artikel_Nr, A.Name, A.Preis FROM Kunde INNER JOIN Rechnung ON K.Kunde_Nr INNER JOIN Position ON R.Rechnung_Nr INNER JOIN Artikel ON P.Artikel_Nr ;
AS K AS R = R.Kunde_Nr AS P = P.Rechnung_Nr AS A = A.Artikel_Nr
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23)
Programmȱ11:ȱVereinbarenȱvonȱRechnungViewȱ
NachdemȱdieȱViewȱRechnungViewȱvereinbartȱist,ȱwerdenȱdieȱDatenȱderȱvirtuellenȱ Tabelleȱausgegeben,ȱwelcheȱdurchȱAnwendungȱderȱViewȱvomȱDatenbankprozesȬ sorȱimȱZentralspeicherȱzusammengebautȱwird.ȱ DieȱgrauȱhinterlegtenȱDatenȱderȱErgebnistabelleȱinȱAbbildungȱ13ȱsindȱredundant.ȱ DieȱRedundanzȱverschwindet,ȱwennȱmanȱdieselbenȱDatenȱinȱeinerȱhierarchischenȱ Datenstruktur,ȱeinemȱDatenbaum,ȱdarstellt.ȱDerȱDatenbaumȱinȱderȱAbbildungȱ14ȱ zeigtȱdieselbenȱDatenȱaufȱderȱAusprägungsebene.ȱ ȱ
24ȱ
2.3ȱȱSQLȬDDLȱ–ȱeineȱvereinfachteȱAnwendungȱ DieȱRedundanzȱinȱdenȱgrauȱhinterlegtenȱZeilenteilenȱ ergibtȱ sichȱ ausȱ derȱ Fundamentaleigenschaftȱ einesȱ Verbundes.ȱDieseȱbewirktȱimȱBeispiel,ȱdassȱjedeȱPosiȬ tionszeileȱ mitȱ ihrerȱ Rechnungszeileȱ undȱ dieseȱ mitȱ ihrerȱKundenzeileȱzuȱeinerȱErgebniszeileȱzusammenȬ gefasstȱwerden.ȱSchließlichȱwirdȱauchȱnochȱdieȱjeweiȬ ligeȱ Artikelzeileȱ mitȱ demȱ Verbundergebnisȱ verbunȬ den.ȱ Betrachtetȱ manȱ diesenȱ Verbindungsvorgangȱ unterȱ Beachtungȱ derȱ Bedeutungȱ derȱ Multiplizitätenȱ imȱ RDBD,ȱ soȱ lautetȱ dieȱ Erkenntnis:ȱ Jedeȱ Positionszeileȱ wirdȱ mitȱ allȱ denȱ Zeilenȱ derȱ anderenȱ Tabellenȱ verȬ bunden,ȱ mitȱ denenȱ sieȱ aufgrundȱ derȱ einfachenȱ MulȬ tiplizitätȱ(UML:ȱ1)ȱdirektȱundȱindirektȱverbundenȱist.ȱ ȱ Sindȱ mehrereȱ Positionszeilenȱ mitȱ derselbenȱ RechȬ nungszeileȱ direktȱ undȱ indirektȱ mitȱ derselbenȱ KunȬ denzeileȱ verbunden,ȱ soȱ erscheinenȱ dieȱ Datenȱ dieserȱ RechnungsȬȱ undȱ Kundenzeilenȱ redundantȱ imȱ VerȬ bundergebnis.ȱ
ȱ ȱ ȱ ȱ
Eineȱ gänzlichȱ andereȱ Wirkungȱ hatȱ derȱ Einbauȱ derȱ PositionsdatenȱinȱeineȱBaumhierarchie.ȱDerȱBaumȱistȱ eineȱ hierarchischeȱ Struktur.ȱ Beiȱ ihrȱ sindȱ imȱ Beispielȱ dieȱRechnungsdatenȱdenȱPositionsdatenȱhierarchischȱ übergeordnet.ȱ Dieȱ Kundendatenȱ sindȱ ihrerseitsȱ denȱ Rechnungsdatenȱ hierarchischȱ übergeordnet.ȱ HierarȬ chischȱ übergeordneteȱ Datenȱ tretenȱ inȱ einemȱ Baumȱ prinzipiellȱ redundanzfreiȱ auf.ȱ Blätterȱ könnenȱ jedochȱ redundantȱsein.ȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Abbildungȱ13:ȱErgebnisdatenȱderȱRechnungȬViewȱenthalȬ tenȱredundanteȱDatenȱ
ȱ 25ȱ
2ȱȱUMLȱ–ȱgrafischeȱModellierungsspracheȱ
ȱ ȱ Abbildungȱ14:ȱBaumȱderȱKundenȬ,ȱRechnungsȬ,ȱPositionsȬȱundȱArtikeldatenȱ
26ȱ
2.4ȱȱÜbungenȱ
2.4 Übungen 1) UntersuchenȱSieȱ dieȱ Ausdrucksfähigkeitȱ vonȱ UMLȱ fürȱ dieȱBeschreibungȱ vonȱ Klassendiagrammen,ȱ EntitätsȬBeziehungsȬDiagrammen,ȱ relationalenȱ DatenȬ bankdiagrammen,ȱBegriffsdiagrammenȱundȱXMLȬDokumentȬDiagrammen.ȱ 2) UntersuchenȱSie,ȱ wasȱ manȱ unterȱ demȱ Begriffȱ ȈBegriffȈȱverstehtȱundȱ wieȱ manȱ Begriffssystemeȱmodellierenȱundȱimplementierenȱkönnte.ȱ 3) Untersuchenȱ Sieȱ dieȱ Evolutionȱ desȱ ERMȱ bisȱ zuȱ denȱ heutigenȱ AusdrucksȬ möglichkeitenȱmitȱUMLȱ 4) Untersuchenȱ Sieȱ dieȱ Evolutionȱ vonȱ SQLȱ undȱ derenȱNiederschlagȱ inȱ denȱ verȬ schiedenenȱSQLȬNormen.ȱ
27ȱ
3 XML und SQL – Vereinigung zweier Welten InȱdiesemȱKapitelȱlernenȱSie,ȱ – mitȱwelchenȱneuenȱSprachmittelnȱdieȱherkömmlicheȱrelationaleȱWeltȱundȱȱ – dieȱneueȱhierarchischeȱXMLȬDokumentenweltȱzusammengeführtȱwerden.ȱ Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ sodannȱ beurteilen,ȱ wieȱ Sieȱ dieȱ neuenȱ Möglichkeitenȱnutzenȱkönnen.ȱ
3.1 XML in SQL – SQL/XML Inȱ derȱ SQLȬNormȱ vomȱ Jahrȱ 2003ȱ (SQL:2003)ȱ wurdeȱ derȱ neueȱ Datentypȱ XMLȱ inȱ SQLȱeingeführt.ȱWirdȱeineȱrelationaleȱSpalteȱmitȱdiesemȱTypȱvereinbart,ȱsoȱenthältȱ sieȱ amȱ Kreuzungspunktȱ mitȱ einerȱ Zeileȱ einenȱ XMLȬWert.ȱ Einȱ solcherȱ XMLȬWertȱ istȱeinȱwohlgeformtesȱXMLȬDokumentȱinȱeinerȱinternenȱundȱnurȱdemȱDatenbankȬ prozessorȱ zugänglichenȱ Form.ȱ Sieȱ wirdȱ auchȱ alsȱ dieȱ internȱ codierteȱ Formȱ einesȱ XMLȬDokumentsȱ bezeichnet.ȱ Einȱ XMLȬWertȱ bestehtȱ hierbeiȱ ausȱ einerȱ BaumhieȬ rarchieȱ vonȱ miteinanderȱ verknüpftenȱ Knoten.ȱ Einȱ solcherȱ Wertȱ kannȱ praktischȱ beliebigȱgroßȱsein.ȱWeilȱaufȱdieȱeinzelnenȱDatenȱinȱeinemȱXMLȬWertȱmitȱderȱDaȬ tenmanipulationsspracheȱXQueryȱ(XMLȱQuery)ȱzugegriffenȱwird,ȱwirdȱerȱauchȱalsȱ XDMȬWertȱ bezeichnet.ȱ Hierbeiȱ istȱ XDMȱ dieȱ Abkürzungȱ fürȱ XQueryȱ Dataȱ Model.ȱ DasȱXDMȱberuhtȱaufȱseinenȱVorgängermodellenȱmitȱdenȱBezeichnungenȱ – XMLȱInformationȱSetȱ(Infoset)ȱ – PostȱSchemaȬValidationȱInfosetȱ(PSVI)ȱ Wennȱ einȱ XMLȬWertȱ inȱeineȱ zeichenartigeȱ externeȱFormȱ konvertiertȱ wird,ȱ seinerȱ externȱ codiertenȱ Form,ȱ erscheintȱ erȱ inȱ seinerȱ fürȱ menschlicheȱ Leserȱ geeignetenȱ GestaltȱundȱgewohntenȱSchreibweiseȱalsȱXMLȬDokument.ȱHierbeiȱdarfȱerȱdieȱmaȬ ximaleȱ Größeȱ einesȱ CLOBȬWertesȱ nichtȱ übersteigen.ȱ Dieserȱ istȱ derzeitȱ aufȱ zweiȱ Gigabyteȱbegrenzt.ȱ AllgemeinȱgesprochenȱwirdȱderȱXMLȬDatentypȱmitȱzweiȱMengenȱbeschrieben,ȱderȱ MengeȱderȱmöglichenȱXMLȬWerteȱundȱderȱMengeȱderȱOperationen,ȱdieȱmitȱdiesenȱ Wertenȱ ausgeführtȱ werdenȱ könnenȱ bzw.ȱ dieseȱ Werteȱ erzeugen.ȱ Dieȱ Mengeȱ derȱ möglichenȱXMLȬWerteȱistȱastronomischȱgroß,ȱwennȱmanȱbedenkt,ȱdassȱdieȱAnzahlȱ ihrerȱElementeȱdurchȱdieȱtextförmigeȱRepräsentationȱinȱFormȱeinesȱCLOBȬWertesȱ derȱGrößeȱvonȱzweiȱGBȱbegrenztȱwird.ȱDieȱMengeȱderȱXMLȬOperationenȱbestehtȱ hauptsächlichȱ ausȱ denȱ XMLȬspezifischenȱ eingebautenȱ Funktionenȱ vonȱ SQL/XMLȱ undȱ demȱ Sprachvorratȱ derȱ Spracheȱ XQuery.ȱ Dieȱ Funktionalitätȱ derȱ eingebautenȱ Funktionenȱ kannȱ durchȱ benutzerdefinierteȱ Funktionenȱ wieȱ üblichȱ erweitertȱ werȬ den.ȱ ȱ
ȱ 29
3ȱȱXMLȱundȱSQLȱ–ȱVereinigungȱzweierȱWeltenȱ ȱ ȱ ȱ
Mengeȱ derȱ mögliȬ chenȱXMLȬWerteȱ
ȱ
Mengeȱ derȱ XMLȬ Operationenȱ
ȱ ȱ Abbildungȱ15:ȱDatentypȱ–ȱspeziellȱXMLȬDatentypȱ
InȱDB2ȬSQLȱVersionȱ9.5ȱsindȱXMLȬspezifischeȱFunktionenȱimplementiert,ȱdieȱfolȬ gendenȱZweckenȱdienen:ȱ – publizierenȱvonȱherkömmlichenȱrelationalenȱDatenȱinȱXMLȬDokumentenȱ – zerlegenȱ vonȱ XMLȬDokumentenȱ undȱ speichernȱ derȱ hierbeiȱ gewonnenenȱ DatenȱinȱrelationalenȱTabellenȱ – ladenȱvonȱXMLȬWertenȱundȱmanipulierenȱvonȱDatenȱinȱXMLȬWertenȱ – überprüfenȱvonȱXMLȬDokumentenȱaufȱÜbereinstimmungȱmitȱeinemȱXMLȬ Schemaȱ – aufrufenȱderȱDatenmanipulationsspracheȱXQueryȱausȱSQLȱherausȱundȱ hierbeiȱgewinnenȱvonȱDatenȱausȱXMLȬWerten.ȱ MitȱdenȱPublikationsfunktionenȱvonȱSQL/XMLȱwerdenȱausȱherkömmlichenȱrelatiȬ onalenȱ Datenȱ XMLȬDokumenteȱ inȱ derenȱ datenbankinternenȱ Formȱ generiert,ȱ dieȱ auchȱalsȱXMLȬWerteȱbezeichnetȱwerden.ȱAnschließendȱkönnenȱdieȱXMLȬWerteȱinȱ ihreȱexterne,ȱzeichenförmigeȱGestaltȱkonvertiertȱwerden.ȱSieȱsindȱdieȱvonȱunsȱlesȬ barenȱ XMLȬDokumente.ȱ Denȱ Konvertierungsprozessȱ bezeichnetȱ manȱ alsȱ serialiȬ sieren.ȱ Inȱ derȱ folgendenȱ Tabelleȱ werdenȱ dieȱ Namenȱ derȱ SQL/XMLȬPublikationsȬ funktionenȱaufgeführtȱundȱihreȱVerwendungszweckeȱkurzȱbeschrieben.ȱDieȱPubliȬ kationsfunktionenȱwerdenȱoftȱauchȱalsȱKonstruktorfunktionenȱbezeichnet,ȱweilȱsieȱ datenbankinterneȱXMLȬKonstrukteȱerzeugen.ȱ ȱ Nameȱ
Verwendungszweckȱ
XMLAGGȱ
SieȱistȱeineȱSpaltenfunktionȱ(Mengenfunktion).ȱSieȱfasstȱalleȱ WerteȱeinerȱSpalteȱvomȱTypȱXMLȱzuȱeinemȱeinzigenȱXMLȬ Wertȱzusammen.ȱ
XMLATTRIBUTESȱ
SieȱerzeugtȱXMLȬAttributeȱeinesȱXMLȬElementesȱausȱrelatiȬ onalenȱDaten.ȱ
XMLCOMMENTȱ
SieȱerzeugtȱeinenȱXMLȬKommentarȱausȱrelationalenȱDaten.ȱ
XMLCONCATȱ
Sieȱ fasstȱ eineȱ Anzahlȱ vonȱ skalarenȱ XMLȬWertenȱ zuȱ einemȱ einzigenȱXMLȬWertȱzusammen.ȱ
30ȱ
3.1ȱȱXMLȱinȱSQLȱ–ȱSQL/XMLȱ XMLDOCUMENTȱ
SieȱerzeugtȱeinenȱDokumentknoten.ȱMitȱeinemȱKnotenȱdieȬ sesȱ Typsȱ mussȱ einȱ datenbankinternesȱ XMLȬDokumentȱ alsȱ Wurzelknotenȱ beginnen.ȱ Dasȱ Dokumentȱ hatȱ dieȱ Gestaltȱ einesȱBaumes.ȱ
XMLELEMENTȱ
SieȱerzeugtȱeinȱXMLȬElementȱausȱrelationalenȱDaten.ȱ
XMLFORESTȱ
SieȱerzeugtȱeineȱFolgeȱvonȱXMLȬElementenȱausȱrelationalenȱ Daten.ȱ
XMLNAMESPACESȱ SieȱerzeugtȱeineȱXMLȬNamensraumȬVereinbarung.ȱ XMLPIȱ
Sieȱ erzeugtȱ eineȱ XMLȬProcessingȬInstructionȱ (Hinweisȱ fürȱ einenȱParser,ȱderȱdasȱXMLȬDokumentȱverarbeitenȱsoll).ȱ
XMLSERIALIZEȱ
Sieȱ konvertiertȱ einȱ XMLȬDokumentȱ imȱ XMLȬTypȱ inȱ eineȱ zeichenartigeȱ externeȱ Repräsentationȱ oderȱ einenȱ BLOB.ȱ Hierdurchȱ entstehtȱ ausȱ derȱ datenbankinternenȱ RepräsentaȬ tionȱ einesȱ XMLȬWertesȱ dasȱ korrespondierendeȱ XMLȬ DokumentȱinȱderȱüblichenȱlesbarenȱForm.ȱ
XMLTEXTȱ
SieȱerzeugtȱeinenȱXMLȬTextwertȱausȱrelationalenȱDaten.ȱ
Tabelleȱ2:ȱPublikationsfunktionenȱvonȱSQL/XMLȱ
Nebenȱ denȱ Publikationsfunktionenȱ gibtȱ esȱ inȱ SQL/XMLȱ weitereȱ Funktionenȱ zurȱ DurchführungȱderȱuntenȱaufgeführtenȱOperationenȱmitȱXMLȬWerten.ȱ ȱ Nameȱ
Verwendungszweckȱ
XMLCASTȱ
SieȱkonvertiertȱeinenȱWertȱeinesȱgegebenenȱTypsȱinȱdenselȬ benȱ Wertȱ inȱ einemȱ anderenȱ Typ.ȱ Derȱ QuellȬȱ oderȱ derȱ ZielȬ typȱkannȱXMLȱsein.ȱ
XMLEXISTSȱ
Dasȱ Prädikatȱ prüft,ȱ obȱ einȱ XQueryȬAusdruckȱ einenȱ oderȱ keinenȱXMLȬWertȱzurückgibt.ȱ
XMLPARSEȱ
SieȱprüftȱeinȱXMLȬDokumentȱinȱZeichenform,ȱobȱesȱwohlgeȬ formtȱist,ȱundȱgibtȱeinenȱXMLȬWertȱinȱinternȱcodierterȱFormȱ zurück.ȱ
XMLQUERYȱ
SieȱführtȱeinenȱXQueryȬAusdruckȱimȱSQLȬKontextȱausȱundȱ gibtȱeinenȱXMLȬWertȱzurück.ȱ
XMLTABLEȱ
Sieȱ erzeugtȱ eineȱ relationaleȱ Tabelleȱ ausȱ einemȱ XMLȬDokuȬ ment.ȱȱ
31ȱ
3ȱȱXMLȱundȱSQLȱ–ȱVereinigungȱzweierȱWeltenȱ XMLVALIDATEȱ
Sieȱ gibtȱ einenȱ mitȱ einemȱ XMLȬSchemaȱ validierten,ȱ d.ȱ h.ȱ schemakonformenȱXMLȬWertȱzurück.ȱ
Tabelleȱ3:ȱSonstigeȱFunktionenȱaußerȱdenȱPublikationsfunktionenȱinȱSQL/XMLȱ
3.2 SQL in XML – XQuery AbȱDB2ȱVersionȱ9.1ȱenthältȱderȱDatenbankprozessorȱnebenȱdemȱSQLȬParserȱauchȱ denȱ XQueryȬParser.ȱ Wirdȱ überȱ dasȱ Eingabefensterȱ desȱ DB2ȬBefehlseditorsȱ eineȱ Eingabeȱ mitȱ demȱ Befehlsbezeichnerȱ XQUERYȱ eingegeben,ȱ soȱ wirdȱ dieȱ AnfordeȬ rungȱ anȱ denȱ XQueryȬParserȱ weitergeleitet.ȱ Istȱ dasȱ ersteȱ Wortȱ imȱ Eingabestromȱ nichtȱ XQUERY,ȱ soȱ wirdȱ dieȱ Anforderungȱ anȱ denȱ SQLȬParserȱ übermittelt.ȱ Nachȱ erfolgreicherȱSyntaxprüfungȱdurchȱdenȱjeweiligenȱParserȱwirdȱdieȱEingabeȱanȱdenȱ gemeinsamenȱ Compiliererȱ weitergeleitet.ȱ Dasȱ vonȱ ihmȱ erzeugte,ȱ optimierteȱ undȱ ausführbareȱProgrammȱwirdȱsodannȱvomȱhypridenȱProzessorȱausgeführt.ȱDieserȱ verwaltetȱdieȱDatenȱentwederȱimȱherkömmlichenȱrelationalenȱoderȱimȱneuȱhinzuȬ gekommenenȱ XMLȬSpeicher.ȱ Dieȱ Abbildungȱ 16ȱ veranschaulichtȱ diesenȱ SachverȬ haltȱ[IBM07].ȱ InȱXQueryȬAusdrückenȱkönnenȱzweiȱXQueryȬFunktionenȱaufgerufenȱwerden,ȱdieȱ einenȱZugriffȱaufȱSQLȬTabellenȱgestatten.ȱSieȱwerdenȱausführlichȱimȱKapitelȱüberȱ XQueryȱerläutert.ȱDieȱZugriffeȱmüssenȱeinenȱXMLȬWertȱzurückgeben.ȱ ȱ Nameȱ
Verwendungszweckȱ
db2-fn:xmlcolumnȱ SieȱgreiftȱaufȱeineȱXMLȬSpalteȱinȱeinerȱSQLȬTabelleȱzu.ȱInȱ ihremȱ Argumentȱ werdenȱ hierzuȱ derȱ Tabellennameȱ undȱ derȱNameȱeinerȱXMLȬSpalteȱinȱFormȱeinesȱqualifiziertenȱ Namensȱangegeben.ȱ db2-fn:sqlqueryȱ
Sieȱ enthältȱ alsȱ Argumentȱ einenȱ gewöhnlichenȱ SELECTȬ BefehlȱinȱSQL.ȱDadurchȱkönnenȱbeliebigeȱlesendeȱZugrifȬ feȱ aufȱ SQLȬDatenȱ erfolgen.ȱ Derȱ Ergebniswertȱ mussȱ alsȱ XMLȬTypȱcodiertȱsein.ȱ
Tabelleȱ4:ȱXQueryȬFunktionenȱfürȱdenȱZugriffȱaufȱSQLȬDatenȱ
ȱ ȱ ȱ ȱ
32ȱ
3.4ȱȱÜbungenȱ ȱ ȱ ȱ
Clientȱ SQLȱ
XQUERYȱ ȱ
ȱ
Serverȱ
ȱ ȱ
SQLȬParserȱ
XQueryȬParserȱ
ȱ
Compiliererȱ
ȱ
HypriderȱProzessorȱ
ȱ
Tabellenspeicherȱ
XMLȬSpeicherȱ
Abbildungȱ16:ȱStrukturȱdesȱDatenbanksystemsȱDB2ȱV9.5ȱ
3.3 XML Schema – DDL für XML-Dokumente Einȱ XMLȬSchemaȱ istȱ einȱ Bauplanȱ fürȱ schemakonformeȱ XMLȬDokumente.ȱ Unterȱ Beachtungȱ derȱ Vorgabenȱ einesȱ XMLȬSchemasȱ kannȱ einȱ XMLȬValidiererȱ (parser)ȱ prüfen,ȱobȱeinȱzuȱprüfendesȱXMLȬDokumentȱvalide,ȱd.ȱh.ȱkorrektȱist.ȱDB2ȱunterȬ stütztȱ dieȱ Validierungȱ zuȱ speichernderȱ XMLȬDokumenteȱ sowohlȱ mitȱ Schemata,ȱ dieȱ inȱ derȱ modernenȱ Spracheȱ XMLȱSchemaȱ alsȱ auchȱ inȱ derȱ älterenȱ Spracheȱ DTDȱ (DocumentȱTypeȱDefinition)ȱbeschriebenȱsind.ȱ Dieȱ XMLȬSchemaȬBeschreibungsspracheȱ XMLȱSchemaȱ istȱ eineȱ sehrȱ umfangreicheȱ Sprache.ȱSieȱenthältȱeinȱbreitesȱSortimentȱanȱDatentypenȱundȱSprachelementenȱzurȱ Beschreibungȱ beliebigȱ komplexerȱ hierarchischerȱ XMLȬDokumentstrukturen.ȱ Imȱ Kapitelȱ8ȱfindenȱSieȱeineȱkurzeȱEinführungȱinȱdieȱSpracheȱXMLȱSchema.ȱ
3.4 Übungen 1) StellenȱSieȱfest,ȱinȱwelchemȱJahrȱwelcheȱSQLȬNormȱverabschiedetȱwurde.ȱ 2) ErarbeitenȱSieȱsichȱdieȱEntstehungsgeschichteȱvonȱXML.ȱ 3) ErarbeitenȱSieȱsichȱdieȱEntstehungsgeschichteȱvonȱXQuery.ȱ 4) ErarbeitenȱSieȱsichȱdieȱEntstehungsgeschichtenȱvonȱXMLȱSchemaȱundȱDTD.ȱ ȱ
33ȱ
4 Publikation relationaler Daten InȱdiesemȱKapitelȱlernenȱSie,ȱ – welcheȱPublikationsfunktionenȱesȱinȱSQL/XMLȱgibtȱundȱȱ – wieȱ dieseȱ Funktionenȱ eingesetztȱ werden,ȱ umȱ komplexeȱ XMLȬDokumenteȱ zuȱgenerierenȱ – welchenȱ Nutzenȱ dieȱ architekturgetriebeneȱ Entwicklungȱ vonȱ XMLȬDokuȬ mentenȱbringtȱ – welcheȱBedeutungȱdieȱstrukturierteȱundȱästhetischeȱProgrammniederschriftȱ zurȱBeherrschungȱderȱKomplexitätȱleistet.ȱ MitȱIhremȱerworbenenȱWissenȱkönnenȱSieȱsodannȱbeliebigȱkomplexeȱXMLȬDokuȬ menteȱausȱrelationalenȱDatenȱerzeugen.ȱ
4.1 XML-Sprachkonstrukte – ein kurzer Überblick AnȱeinemȱkleinenȱBeispielȱeinesȱXMLȬDokumentesȱwerdenȱdieȱSprachkonstrukteȱ vonȱ XMLȱ gezeigt,ȱ sieheȱ XMLȬDokumentȱ 3.ȱ Fürȱ dieȱ Generierungȱ derȱ SprachȬ konstrukteȱwerdenȱdieȱhierfürȱbestimmtenȱSQL/XMLȬPublikationsfunktionen,ȱdieȱ inȱTabelleȱ2ȱkurzȱaufgeführtȱsind,ȱsodannȱdetailliertȱvorgestelltȱundȱanȱzahlreichenȱ Beispielenȱdemonstriert.ȱ EinȱXMLȬDokumentȱmussȱwohlgeformtȱsein.ȱHierzuȱmussȱesȱfolgendeȱBedingunȬ genȱerfüllen.ȱ – JederȱDatenwertȱeinesȱXMLȬElementesȱmussȱvonȱeinemȱStartȬȱundȱEndeȬtagȱ umschlossenȱsein.ȱ – EinȱXMLȬDokumentȱkannȱnurȱeinȱeinzigesȱWurzelelementȱhaben.ȱ – JedesȱXMLȬElementȱkannȱnurȱeinȱihmȱunmittelbarȱhierarchischȱübergeordȬ netesȱXMLȬElementȱhaben.ȱEinȱXMLȬDokumentȱbesitztȱsomitȱeineȱBaumȬ struktur.ȱ – XMLȬElementeȱ dürfenȱ sichȱ nichtȱ überlappen,ȱ indemȱ dasȱ EndeȬtagȱ einesȱȱ übergeordnetenȱElementesȱvorȱdemȱEndeȬtagȱeinesȱuntergeordnetenȱXMLȬ Elementesȱsteht.ȱ – Einemȱ Elementattributȱ mussȱ einȱ Wertȱ zugeordnetȱ werden.ȱ Dieserȱ mussȱ inȱ Hochkommataȱ(einzelneȱoderȱGänsefüße)ȱeingeschlossenȱsein.ȱ – Folgendeȱ Sonderzeichenȱ dürfenȱ nichtȱ inȱ denȱ Namenȱ undȱ inȱ denȱ Textenȱ verwendetȱwerden,ȱsondernȱmüssenȱdurchȱsoȱgenannteȱEntitiesȱersetztȱwerȬ den:ȱ – SpitzklammerȱaufȱȈȈȱ ȱ Entity:ȱ>ȱ
ȱ 35
4ȱȱPublikationȱrelationalerȱDatenȱ – UndȬZeichenȱȈ&Ȉȱ – GänsefußȱȈȱ ȱ – Apostrophȱȇȱ ȱ
ȱ ȱ ȱ
Entity:ȱ&ȱ Entity:ȱ"ȱ Entity:ȱ'ȱ
Wennȱ einȱ XMLȬDokumentȱ dannȱ nochȱ vonȱ einemȱ validierendenȱ Parserȱ unterȱ BeȬ achtungȱderȱVorgabenȱeinesȱXMLȬSchemasȱfürȱkorrektȱerachtetȱwurde,ȱsoȱwirdȱesȱ alsȱvalideȱbezeichnet.ȱWohlgeformtheitȱundȱValiditätȱsindȱsomitȱwesentlicheȱQuaȬ litätskriterienȱfürȱeinȱXMLȬDokument.ȱ Imȱ folgendenȱ einfachenȱ XMLȬDokumentȱ 3ȱ sindȱ dieȱ beispielhaftenȱ XMLȬ Sprachkonstrukteȱdargestellt.ȱDieȱzuȱihrerȱGenerierungȱinȱSQL/XMLȱverfügbarenȱ eingebautenȱ Funktionenȱ werdenȱ anschließendȱ kurzȱ angegeben.ȱ Inȱ denȱ sodannȱ folgendenȱKapitelnȱwerdenȱdieȱeingebautenȱSQL/XMLȬFunktionenȱausführlichȱinȱ ihremȱZusammenwirkenȱdargestellt.ȱ Elementwert Das ist ein Text
(1) (2) (3) (4) (5) (6) (7) (8) (9)
XMLȬDokumentȱ3:ȱBeispielȱfürȱXMLȬSprachkonstrukteȱ
Dieȱ folgendeȱ Tabelleȱ 5ȱ gibtȱ einenȱ Hinweisȱ aufȱ dieȱ Namenȱ derȱ eingebautenȱ SQL/XMLȬFunktionen,ȱwelcheȱdieȱXMLȬKonstrukteȱimȱobigenȱXMLȬDokumentȱ3ȱ erzeugten.ȱ ObigeȱZeileȱ
XMLȬKonstruktȱ NameȱderȱeingebautenȱSQL/XMLȬFunktionȱ
(1)ȱ
Funktion:ȱXMLSERIALIZEȱ
(2)ȱ
Funktion:ȱXMLPIȱȱ
(3),ȱ (7)ȱȱ undȱ (9)ȱ
)ȱrepräsentiertȱinternȱeinȱXMLȬElement.ȱȱ DieȱNachfolgerknotenȱkönnenȱvonȱfolgendenȱArtenȱsein:ȱ – – – –
Elementknotenȱ Textknotenȱ Verarbeitungshinweisknotenȱ(processingȱinstruction)ȱ Kommentarknoten.ȱ
AlsȱVorgängerknotenȱkommenȱinȱBetracht:ȱȱ – einȱElementknotenȱoderȱȱ – einȱDokumentknoten.ȱ DokumentȬȱ bzw.ȱAttributknotenȱkönnenȱkeineȱNachfolgerknotenȱvonȱeinemȱ EleȬ mentknotenȱ sein.ȱ Jedochȱ kannȱ einemȱ Elementknotenȱ einȱ oderȱ mehrereȱ AttributȬ knotenȱ zugeordnetȱ werden.ȱ Einȱ Attributknotenȱ istȱ seinemȱ Elementknotenȱ nurȱ zugeordnetȱ aberȱ nichtȱ hierarchischȱ untergeordnet.ȱ Imȱ Rahmenȱ derȱ Zuordnungȱ bezeichnetȱ manȱ denȱ Elementknotenȱ einesȱ Attributknotensȱ dennochȱ alsȱ dessenȱ ParentȬKnoten.ȱ
38ȱ
4.3ȱȱXMLELEMENTȱ–ȱerzeugtȱeinȱXMLȬElementȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Parent-ChildBeziehung
«Element» Elementknoten
1 *
«Element» Elementknoten
*
«Textk» Textknoten
*
«Processing instruction» Verarbeitungshinweisknoten
*
«Comment» Kommentarknoten
1 1 1 1 nur ParentBeziehung
ȱ
*
«Attributek» Attributknoten
ȱ
ȱ
Abbildungȱ18:ȱElementknotenȱundȱseineȱabhängigenȱKnotenartenȱ
EinȱElementknotenȱwirdȱmitȱderȱeingebautenȱFunktionȱXMLELEMENT()ȱerzeugt.ȱ Ihreȱ zunächstȱ vereinfachteȱ Syntaxȱ inȱ derȱ BackusȬNaurȬNotationsformȱ zeigtȱ dasȱ folgendeȱSyntaxdiagramm.ȱ ȱ
XMLELEMENT( NAME
ȱ
Elementname, Elementinhaltsausdruck [, Elementinhaltsausdruck] ... [OPTION {NULL ON NULL | EMPTY ON NULL}]
ȱ Syntaxȱ3:ȱVereinfachteȱSyntaxȱvonȱXMLELEMENT()ȱ
Denȱ Elementnamenȱ mussȱ manȱ inȱ doppeltenȱ Hochkommataȱ (Gänsefüßchen)ȱ schreiben.ȱ Derȱ Elementinhaltsausdruckȱ istȱ einȱ beliebigerȱ SQLȬAusdruck,ȱ dessenȱ Ergebnisȱ einȱ skalarerȱ Wertȱ seinȱ muss.ȱ Mitȱ denȱ Optionenȱ OPTIONȱ NULLȱ ONȱ NULLȱoderȱOPTIONȱEMPTYȱONȱNULLȱkannȱgesteuertȱwerden,ȱwasȱzuȱgenerieȬ renȱist,ȱwennȱderȱauszugebendeȱElementinhaltsausdruckȱderȱWertȱNULLȱist.ȱWirdȱ keineȱ Optionȱ angegeben,ȱ wirdȱ dieȱ unterstricheneȱ Optionȱ NULLȱ ONȱ NULLȱ alsȱ Defaultȱangenommen.ȱ Beispielȱ XMLELEMENT(ȱNAMEȱȈAnredeȈ,ȱȇFrauȇȱ)ȱ
39ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ
4.4 XMLSERIALIZE – erzeugt Zeichenform DieȱinterneȱRepräsentationȱeinesȱXMLȬDokumentesȱmussȱinȱihreȱexterneȱZeichenȬ formȱ konvertiertȱ werden,ȱ damitȱ manȱ dasȱ XMLȬDokumentȱ inȱ gewohnterȱ Weiseȱ lesenȱ kann.ȱ Dieȱ Umwandlungȱ einesȱ internenȱ XMLȬDokumentesȱ inȱ seineȱ externeȱ Formȱ bezeichnetȱ manȱ auchȱ alsȱ serialisieren.ȱ Durchȱ denȱ Einsatzȱ derȱ SQL/XMLȬ Funktionȱ XMLSERIALIZE()ȱ wirdȱ dieȱ Serialisierungȱ durchgeführt.ȱ Dasȱ folgendeȱ SyntaxdiagrammȱzeigtȱvereinfachtȱdenȱAufbauȱderȱFunktion.ȱ ȱ ȱ ȱ ȱ ȱ
XMLSERIALIZE( XML-Ausdruck AS { CLOB [(Ganzzahl)] | CHAR [(Ganzzahl)] | VARCHAR (Ganzzahl) | BLOB [(Ganzzahl)] } Version '1.0' [INCLUDING XMLDECLARATION] o [EXCLUDING XMLDECLARATION]
ȱ Syntaxȱ4:ȱVereinfachteȱSyntaxȱderȱFunktionȱXMLSERIALIZE()ȱ
Dasȱ Zusammenwirkenȱ derȱ bisȱ jetztȱ dargestelltenȱ eingebautenȱ SQL/XMLȬ Funktionenȱ – XMLSERIALIZE()ȱ – XMLDOCUMENT()ȱ – XMLELEMENT()ȱ wirdȱ imȱ nächstenȱ Schrittȱ anȱ einemȱ einführendenȱ undȱ einfachenȱ Beispielȱ gezeigt.ȱ HierbeiȱsollȱdasȱfolgendeȱXMLȬDokumentȱerzeugtȱwerden.ȱȱ Frau
Mitȱ derȱ Anwendungȱ derȱ SQLȬKlauselȱ VALUESȱ wirdȱ eineȱ minimaleȱ AusfühȬ rungsumgebungȱfürȱDB2ȬSQLȱgeschaffen.ȱ VALUES (XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Anrede", 'Frau' ) ) AS CLOB ) ) ;
Programmȱ12:ȱEinführendesȱBeispielȱinȱdieȱPublikationsfunktionenȱvonȱSQL/XML
Ergebnisȱ Frauȱ
40ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9)
4.4ȱȱXMLSERIALIZEȱ–ȱerzeugtȱZeichenformȱ DieȱFunktionȱXMLSERIALIZE()ȱinȱderȱZeileȱ(1)ȱerhältȱdenȱXMLȬWert,ȱderȱvonȱderȱ FunktionȱXMLDOCUMENT()ȱerzeugtȱwurde.ȱDieseȱerhältȱalsȱWertȱdenȱElementȬ knoten,ȱ welcherȱ durchȱ dieȱ Funktionȱ XMLELEMENT()ȱ ausgeprägtȱ wurde.ȱ Dieȱ Funktionȱ XMLSERIALIZE()ȱ konvertiertȱ dieȱ interneȱ Repräsentationȱ desȱ XMLȬ Dokumentesȱ inȱ eineȱ zeichenartigeȱ externeȱ Repräsentationȱ imȱ Datentypȱ CLOB,ȱ sieheȱZeileȱ(6).ȱ SQL/XMLȬProgramme,ȱ welcheȱ dieȱ Publikationsfunktionenȱ enthalten,ȱ zeichnenȱ sichȱ durchȱ eineȱ verhältnismäßigȱ tiefeȱ Ineinanderschachtelungȱ dieserȱ Funktionenȱ aus.ȱ Diesȱ führtȱ dazu,ȱ dassȱ auchȱ derȱ versierteȱ SQLȬFachmannȱ rechtȱ schnellȱ dieȱȱ Übersichtȱ verliertȱ undȱ nichtȱ mehrȱ übersieht,ȱ wohinȱdieȱ schließendeȱ Klammerȱ eiȬ nesȱFunktionsaufrufesȱzuȱplatzierenȱist.ȱDieseȱArtȱderȱglobalenȱKomplexitätȱkannȱ nurȱ durchȱ eineȱ systematischeȱ Platzierungȱ derȱ schließendenȱ Funktionsklammernȱ reduziertȱ werden.ȱ Wirȱ empfehlenȱ eindrücklich,ȱ unseremȱ Vorschlagȱ fürȱ dieȱ ProȬ grammniederschriftȱzuȱfolgen.ȱ Damitȱ dasȱ generierteȱ XMLȬDokumentȱ vonȱ einemȱ validierendenȱ XMLȬParserȱ alsȱ einȱDokumentȱerkanntȱwird,ȱinȱdemȱdieȱXMLȬSpracheȱderȱVersionȱ1.0ȱangewandtȱ ist,ȱistȱnochȱderȱHinweisȱVERSIONȱȇ1.0ȇȱerforderlich.ȱMitȱderȱweiterenȱoptionalenȱ Klauselȱ INCLUDINGȱ XMLDECLARATIONȱ wirdȱ dieȱ Funktionȱ XMLSERIALIZE()ȱ beauftragt,ȱ inȱ dieȱ ersteȱ Zeileȱ desȱ XMLȬDokumentesȱ denȱ Verarbeitungshinweisȱ ȱ hineinzugenerieren.ȱ Inȱ derȱ Zeileȱ (6)ȱ desȱ folgendenȱProgrammsȱistȱdieȱAnwendungȱdieserȱweiterenȱKlauselnȱderȱFunktionȱ XMLSERIALIZE()ȱdargestellt.ȱ VALUES (XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Anrede", 'Frau' ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ13:ȱXMLSERIALIZE()ȱmitȱdenȱKlauselnȱVERSIONȱȇ1.0ȇȱundȱINCLUDINGȱ XMLDECLARATIONȱ
Ergebnisȱ ȱȱ ȱFrauȱȱ InȱderȱZeileȱ(3)ȱvonȱProgrammȱ13ȱistȱalsȱElementinhaltsausdruckȱdasȱZeichenliteȬ ralȱȇFrauȇȱangegeben.ȱDieseȱeinführendeȱVereinfachungȱwirdȱjetztȱaufgehoben.ȱAlsȱ neuerȱ Elementinhaltsausdruckȱ wirdȱ nunȱ derȱ Spaltennameȱ Anredeȱ derȱ Tabelleȱ Kundeȱ verwendet,ȱ sieheȱ Programmȱ 14.ȱ Inȱ derȱ WHEREȬKlauselȱ desȱ SELECTȬ
41ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ BefehlsȱwirdȱdasȱPrädikatȱKunde_Nrȱ=ȱȇK001ȇȱangegeben,ȱdamitȱnurȱdieȱZeileȱdesȱ KundenȱHugoȱMüllerȱgelesenȱwird.ȱ Imȱ Zugeȱ derȱ architekturgetriebenenȱ Softwareentwicklung,ȱ dieȱ wirȱ imȱ Fortgangȱ weiterhinȱpraktizierenȱwollen,ȱentwickelnȱwirȱzunächstȱinȱUMLȱdasȱModellȱdesȱzuȱ generierendenȱ XMLȬDokumentesȱ aufȱ derȱ TypȬȱ undȱ aufȱ derȱ Ausprägungsebene.ȱ Anschließendȱ verwendenȱ wirȱ denȱ Modellentwurfȱ (design)ȱ desȱ zuȱ generierendenȱ XMLȬDokumentesȱ alsȱ abstrakteȱ Vorlageȱ fürȱ dasȱ zuȱ schreibendeȱ SQL/XMLȬ Programm.ȱ Dieseȱ Vorgehensweiseȱ istȱ hilfreich,ȱ umȱ dieȱ Übersichtȱ beiȱ derȱ ImpleȬ mentierungȱnichtȱzuȱverlieren.ȱ ȱ Relationales Datenbankmodell
ȱ ȱ ȱ
«table» Kunde
ȱ
XML Schemamodell Typebene «Element» Anrede
«instantiate»
Exemplarebene «Element» K001:Anrede
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ19:ȱEinfachesȱXMLȱSchemamodellȱinȱUMLȱ
Dieȱ Informationenȱ ausȱ demȱ relationalenȱ Datenbankmodellȱ undȱ demȱ XMLȬ SchemamodellȱwerdenȱnunȱimȱfolgendenȱSQLȬProgrammȱverfeinertȱundȱmitȱdemȱ Sprachvorratȱ vonȱ SQL/XMLȱ formuliert.ȱ Diesesȱ generiertȱ dasȱ gewünschteȱ XMLȬ DokumentȱinȱseinerȱexternenȱForm.ȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Anrede", K.Anrede ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
Programmȱ14:ȱElementinhaltswertȱistȱnunȱdieȱSpalteȱAnredeȱderȱTabelleȱKunde
42ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
4.4ȱȱXMLSERIALIZEȱ–ȱerzeugtȱZeichenformȱ Ergebnis Herr
ȱ ImȱnunȱfolgendenȱXMLȬDokumentȱsollenȱalleȱDatenȱdesȱKundenȱHugoȱMüllerȱmitȱ derȱ Kundennummerȱ K001ȱ ausgegebenȱ werden.ȱ Dieȱ Begriffsbezeichner,ȱ d.ȱ h.ȱ dieȱ NamenȱderȱXMLȬElemente,ȱsollenȱdieselbenȱsein,ȱdieȱauchȱfürȱdieȱBenennungȱderȱ AttributeȱdesȱEntitätstypsȱKundeȱundȱhiervonȱabgeleitetȱfürȱdieȱAttributnamenȱdesȱ Relationstypsȱ Kundeȱ undȱ auchȱ hiervonȱ abgeleitetȱ fürȱ dieȱ Implementierungȱ derȱ TabelleȱKundeȱverwendetȱwurden.ȱDieȱKonsistenzȱbeiȱderȱVerwendungȱdesȱVokaȬ bularsȱ istȱ wichtig.ȱ Sieȱ gewährleistetȱ dasȱ Verständnisȱ desȱSystemzusammenhangsȱ überȱdieȱverschiedenenȱStufenȱderȱSoftwareentwicklung.ȱ Imȱ folgendenȱXMLȬSchemamodellȱwirdȱ auchȱ derȱDokumentknotenȱ inȱ dieȱArchiȬ tekturȱ mitȱ aufgenommen.ȱ Wieȱ bereitsȱ erwähnt,ȱ trittȱ erȱ imȱ publiziertenȱ externenȱ XMLȬDokumentȱnichtȱinȱErscheinung.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
«table» Kunde
Relationales Datenbankmodell links
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
XML-Schema-Modell unten
ȱ ȱ ȱ ȱ ȱ ȱ
«Document» Dokument
1 1
«Processing instruction» XML Deklaration «Element» Kunde
1
«Element» Kunde_Nr
1
«Element» Anrede
1
«Element» Vorname
1
«Element» Zuname
ȱ ȱ ȱ ȱ
1 1 1
«Element» Strasse
Abbildungȱ20:ȱXMLȬ SchemaȬModellȱKundeȱ
«Element» PLZ «Element» Ort
ȱ 43ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ Dasȱ folgendeȱ SQL/XMLȬProgrammȱ setztȱ dasȱ XMLȬSchemaȬModellȱ umȱ undȱ erȬ zeugtȱdasȱgewünschteȱXMLȬDokument.ȱDerȱElementinhaltsausdruckȱderȱäußerenȱ Funktionȱ XMLELEMENT()ȱ inȱ Zeileȱ (3),ȱ derȱ dasȱ Wurzelelementȱ Kundeȱ erzeugt,ȱ bestehtȱausȱeinerȱFolgeȱvonȱXMLELEMENT()ȬFunktionsaufrufen.ȱDieseȱstehenȱinȱ Zeileȱ(4)ȱbisȱ(17).ȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLELEMENT( NAME "Kunde_Nr", ), XMLELEMENT( NAME "Anrede", ), XMLELEMENT( NAME "Vorname", ), XMLELEMENT( NAME "Zuname", ), XMLELEMENT( NAME "Strasse", ), XMLELEMENT( NAME "PLZ", ), XMLELEMENT( NAME "Ort", ) ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
K.Kunde_Nr K.Anrede K.Vorname K.Zuname K.Strasse K.PLZ K.Ort
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25)
Programmȱ15ȱ:ȱProgrammȱKundeȱmitȱderȱFunktionȱXMLELEMENTȱ
Zurȱ aufbereitetenȱ Ausgabeȱ desȱ vonȱ DB2ȱ erzeugtenȱ undȱ serialisiertenȱ DatenstroȬ mesȱ kannȱ derȱ InternetȬExplorerȱ derȱ Firmaȱ Microsoftȱ verwendetȱ werden.ȱ Hierzuȱ kopiertȱmanȱdieȱAusgabedatenȱinȱeineȱTextdateiȱmitȱdemȱSuffixȱXMLȱundȱöffnetȱ dieseȱDateiȱmitȱdemȱInternetȬExplorer.ȱ Ergebnis - K001 Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg
Mitȱ denȱ Optionenȱ OPTIONȱ NULLȱ ONȱ NULLȱ oderȱ OPTIONȱ EMPTYȱ ONȱ NULLȱ kannȱgesteuertȱwerden,ȱwasȱzuȱgenerierenȱist,ȱwennȱderȱauszugebendeȱElementȬ
44ȱ
4.5ȱȱXMLFORESTȱ–ȱerzeugtȱvieleȱXMLȬElementeȱ inhaltsausdruckȱ derȱ Wertȱ NULLȱ ist.ȱ Imȱ folgendenȱ Programmȱ 16ȱ wirdȱ einȱ leeresȱ XMLȬElementȱaufgrundȱderȱOptionȱEMPTYȱONȱNULLȱerzeugt,ȱsieheȱZeileȱ(8).ȱ WITH Temp (Spalte_1, Spalte_2) AS (VALUES ('hallo', 'Freunde'), ('unbekannt', NULL ) ) SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Spalte_2", T.Spalte_2 OPTION EMPTY ON NULL ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) AS Ergebnis FROM Temp AS T WHERE Spalte_1 = 'unbekannt' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15)
Programmȱ16:ȱBeispielhafteȱUntersuchungȱderȱOptionȱEMPTYȱONȱNULLȱ Ergebnis
DasȱErgebnisȱistȱdasȱleereȱXMLȬElementȱ.ȱ DieȱOptionȱOPTIONȱNULLȱONȱNULLȱführtȱzurȱAusgabeȱdesȱNULLȬWertes.ȱ ERGEBNIS ––––––––––– –
4.5 XMLFOREST – erzeugt viele XML-Elemente DieȱeingebauteȱFunktionȱXMLFOREST()ȱersetztȱeineȱFolgeȱvonȱXMLELEMENT()Ȭ Funktionenȱ undȱ vereinfachtȱ dieȱ Schreibweiseȱ derȱ Problemlösungȱ undȱ verbessertȱ dieȱLesbarkeitȱundȱVerstehbarkeitȱeinesȱSQL/XMLȬProgramms.ȱ DieȱfolgendeȱSyntaxbeschreibungȱzeigtȱvereinfachtȱdenȱAufbauȱderȱFunktion.ȱ ȱ ȱ ȱ
XMLFOREST )
( Elementinhaltsausdruck [AS Elementname] [, Elementinhaltsausdruck [AS Elementname]] ... [OPTION {NULL ON NULL | EMPTY ON NULL}]
Syntaxȱ5ȱ:ȱVereinfachteȱSyntaxȱderȱFunktionȱXMLFOREST()ȱ
WieȱausȱdemȱSyntaxdiagrammȱersichtlichȱist,ȱkönnenȱvieleȱElementinhaltsausdrüȬ ckeȱ durchȱ Kommataȱ getrenntȱ aufgeführtȱ werden.ȱ Wennȱ derȱ ElementinhaltsausȬ druckȱnurȱderȱNameȱeinerȱSpalteȱist,ȱkannȱdieȱfolgendeȱASȬKlauselȱmitȱdemȱEleȬ
45ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ mentnamenȱwegfallen.ȱSQLȱverwendetȱinȱdiesemȱFallȱdenȱSpaltennamenȱinȱGroßȬ buchstabenȱalsȱXMLȬElementname.ȱ MitȱdemȱEinsatzȱderȱFunktionȱXMLFOREST()ȱinȱZeileȱ(4)ȱbisȱ(11)ȱkannȱdasȱXMLȬ SchemaȬModellȱ inȱ Abbildungȱ 20ȱ nunȱ übersichtlicherȱ inȱ SQL/XMLȱ implementiertȱ werden.ȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLFOREST( K.Kunde_Nr AS K.Anrede AS K.Vorname AS K.Zuname AS K.Strasse AS K.PLZ AS K.Ort AS ) ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
"Kunde_Nr", "Anrede" , "Vorname" , "Zuname" , "Strasse" , "PLZ" , "Ort"
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19)
Programmȱ17:ȱProgrammȱKundeȱmitȱderȱFunktionȱXMLFOREST()ȱ
Ergebnisȱ - K001 Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg
Eineȱ nochȱ kürzereȱ Schreibweiseȱ erhältȱ man,ȱ wennȱ manȱ dieȱ ASȬKlauselnȱ zurȱ BeȬ nennungȱderȱXMLȬElementeȱweglässt,ȱsieheȱZeileȱ(4)ȱbisȱ(11).ȱSQLȱsetztȱdannȱdieȱ Spaltennamenȱ derȱ Tabelleȱ Kundeȱ inȱ Großbuchstabenȱ alsȱ Bezeichnerȱ derȱ XMLȬ Elementeȱein.ȱ ȱ ȱ
SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLFOREST( K.Kunde_Nr, K.Anrede , K.Vorname ,
46ȱ
(1) (2) (3) (4) (5) (6)
4.6ȱȱXMLATTRIBUTESȱ–ȱerzeugtȱvieleȱXMLȬAttributeȱ
)
K.Zuname , K.Strasse , K.PLZ , K.Ort
)
) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION
) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
(7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19)
Programmȱ18:ȱXMLFOREST()ȱohneȱdieȱASȬKlauselnȱ
Ergebnisȱ - K001 Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg
4.6 XMLATTRIBUTES – erzeugt viele XML-Attribute Einȱ XMLȬElementȱ bestehtȱ inȱ seinerȱ externenȱ Codierungȱ imȱ einfachstenȱ Fallȱ ausȱ seinenȱ beidenȱ Tags,ȱ demȱ StartȬȱ undȱ demȱ EndeȬTagȱ undȱ seinemȱ Wert.ȱ Derȱ Wertȱ einesȱ XMLȬElementesȱ kannȱ ausȱ einemȱ Textȱ alleineȱ und/oderȱ ausȱ einerȱ Anzahlȱ weitererȱ XMLȬElementeȱ bestehen.ȱ Dieseȱ weiterenȱ XMLȬElementeȱ sindȱ demȱ sieȱ enthaltendenȱ XMLȬElementȱ hierarchischȱ untergeordnet.ȱ Beiȱ einemȱ leerenȱ XMLȬ ElementȱgibtȱesȱdenȱWertȱnicht.ȱBestehtȱderȱXMLȬElementȬWertȱausschließlichȱausȱ Textȱ undȱ nichtȱ auchȱ ausȱ untergeordnetenȱ XMLȬElementen,ȱ dannȱ liegtȱ einȱ einfaȬ chesȱ XMLȬElementȱ vor.ȱ Vonȱ einemȱ komplexenȱ XMLȬElementȱ wirdȱ dannȱ gesproȬ chen,ȱ wennȱ esȱ weitereȱ XMLȬElementeȱ enthält.ȱ Bestehtȱ einȱ XMLȬDokumentȱ ausȬ schließlichȱ ausȱ hierarchischȱ ineinanderȱ geschachteltenȱ XMLȬElementen,ȱ soȱ beȬ zeichnetȱmanȱesȱalsȱeinȱelementzentriertesȱXMLȬDokument.ȱDenȱhierzuȱverfolgtenȱ EntwicklungsansatzȱanalogȱalsȱdenȱelementzentriertenȱEntwicklungsansatz.ȱ EinȱXMLȬElementȱkannȱdurchȱvieleȱAttributeȱbeschriebenȱwerden.ȱEinȱAttributȱistȱ einȱMetadatum,ȱdasȱeinȱanderesȱDatumȱnäherȱbeschreibt.ȱMithinȱistȱesȱderȱIntensiȬ onȱ desȱ Begriffsȱ zuzuordnen,ȱ dessenȱ Bezeichnerȱ derȱ XMLȬElementȬTagȱ ist,ȱ derȱ durchȱdasȱAttributȱdefiniertȱwird.ȱȱ
47ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ InȱXMLȬElementenȱwerdenȱdieȱintensionalenȱBegriffeȱoftȱalsȱuntergeordneteȱXMLȬ Elementeȱ angegeben,ȱ dieȱ dasȱ betrachteteȱ XMLȬElementȱ beschreiben.ȱ Besitztȱ einȱ solchermaßenȱ untergeordnetesȱ XMLȬElementȱ keineȱ ihmȱ selbstȱ untergeordnetenȱ XMLȬElemente,ȱ istȱ esȱ somitȱ BlattȬElementȱ inȱ derȱ Elementhierarchie,ȱ soȱ kannȱ anȱ seinerȱ Stelleȱ auchȱ einȱ Attributȱ imȱ betrachtetenȱ XMLȬElementȱ verwendetȱ werden,ȱ umȱ dieȱ intensionaleȱ Informationȱ demȱ betrachtetenȱ XMLȬElementȱ zuzuordnen.ȱ Wirdȱ einȱ beschreibendesȱ undȱ somitȱ untergeordnetesȱ XMLȬElementȱ selbstȱ durchȱ ihmȱuntergeordneteȱXMLȬElementeȱoderȱdurchȱeigeneȱAttributeȱdefiniert,ȱsoȱkannȱ esȱnichtȱalsȱAttributȱseinesȱXMLȬElementesȱmodelliertȱbzw.ȱimplementiertȱwerden.ȱ SomitȱkönnenȱnurȱbeschreibendeȱAngaben,ȱdieȱselbstȱnichtȱauchȱbeschriebenȱwerȬ den,ȱalsȱAttributeȱeinesȱXMLȬElementesȱmodelliertȱwerden.ȱ Werdenȱ alleȱ einȱ XMLȬElementȱ beschreibendeȱ Datenȱ alsȱ Attributeȱ modelliert,ȱ soȱ liegtȱderȱattributzentrierteȱEntwicklungsansatzȱeinesȱXMLȬDokumentesȱvor.ȱInȱderȱ Praxisȱ findetȱ manȱ meistȱ Mischformenȱ derȱ elementȬȱ undȱ attributzentriertenȱ EntȬ wicklungȱvonȱXMLȬDokumentenȱ(hybriderȱAnsatz).ȱ Imȱ folgendenȱ Beispielȱ wirdȱ dasȱ XMLȬDokumentȱattributzentriertȱentwickelt.ȱDasȱ XMLȬElementȱ Kundeȱ wirdȱ hierbeiȱ durchȱ seineȱ Attributeȱ bestimmt.ȱ Dasȱ folgendeȱ UMLȬDiagrammȱzeigtȱdieȱArchitekturȱdesȱXMLȬDokumentes.ȱWieȱmanȱsieht,ȱsindȱ dasȱrelationaleȱDatenmodellȱundȱdasȱXMLȬSchemaȱModellȱstrukturellȱsehrȱähnlich.ȱ
48ȱ
4.6ȱȱXMLATTRIBUTESȱ–ȱerzeugtȱvieleȱXMLȬAttributeȱ «table» Kunde
Relationales Datenmodell
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
XML-Schema Modell
«Document» Dokument
1
«Processing instruction» XML Deklaration «Element» Kunde
1
Kunde_Nr Anrede Vorname Zuname Strasse PLZ Ort
ȱ
ȱ Abbildungȱ21:ȱAttributzentriertesȱXMLȬSchemaȬModellȱ
DieȱbisherȱbekannteȱSyntaxȱderȱeingebautenȱSQL/XMLȬFunktionȱXMLELEMENT()ȱ wirdȱnunȱumȱdieȱsyntaktischeȱEinbettungȱderȱeingebautenȱFunktionȱXMLATTRIȬ BUTES()ȱerweitert.ȱ ȱ ȱ ȱ ȱ
XMLELEMENT( NAME Elementname [, XML-Attributsfunktion] [, Elementinhaltsausdruck] ... [OPTION {NULL ON NULL | EMPTY ON NULL}] )
Syntaxȱ6:ȱFunktionȱXMLELEMENT()ȱmitȱXMLȬAttributsfunktionȱ
49ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ Inȱ derȱ Syntaxbeschreibungȱ vonȱ XMLELEMENT()ȱ istȱ ersichtlich,ȱ dassȱ dieȱ XMLȬ Attributsfunktionȱ unmittelbarȱ aufȱ dieȱ Angabeȱ desȱ XMLȬElementnamensȱ folgt.ȱ WirdȱdieȱXMLȬAttributsfunktionȱnichtȱeingesetztȱundȱnurȱderȱElementinhaltsausȬ druckȱ verwendet,ȱ soȱ liegtȱ derȱ elementzentrierteȱ Entwicklungsansatzȱ vor.ȱ Wirdȱ nurȱ dieȱ XMLȬAttributsfunktionȱ eingesetztȱ undȱ derȱ Elementinhaltsausdruckȱ wegȬ gelassen,ȱ soȱ liegtȱ derȱ attributzentrierteȱ Entwicklungsansatzȱ vor.ȱ Werdenȱ beideȱ optionalenȱ Spracheinrichtungenȱ genutzt,ȱ soȱ liegtȱ derȱ gemischteȱ EntwicklungsanȬ satzȱvor.ȱ Denȱ grammatikalischenȱ Aufbauȱ derȱ SQL/XMLȬFunktionȱ XMLATTRIBUTES()ȱ zeigtȱdieȱfolgendeȱSyntaxbeschreibung.ȱ ȱ ȱ ȱ
XMLATTRIBUTES( Attributwertausdruck [AS Attributname] [,Attributwertausdruck [AS Attributname]] ... )
Syntaxȱ7:ȱAufbauȱderȱeingebautenȱFunktionȱXMLATTRIBUTES()ȱ
Derȱ strukturelleȱ Aufbauȱ derȱ eingebautenȱ Funktionȱ XMLATTRIBUTES()ȱ istȱ sehrȱ ähnlichȱdemȱderȱFunktionȱXMLFOREST(),ȱsieheȱSyntaxȱ5.ȱBeideȱFunktionenȱsindȱ inȱderȱLage,ȱmehrereȱihrerȱjeweiligenȱInformationseinheitenȱzuȱgenerieren.ȱȱ DieȱeingebauteȱSQL/XMLȬFunktionȱXMLATTRIBUES()ȱerzeugtȱeinenȱoderȱmehreȬ reȱAttributknotenȱimȱXDMȬBaumȱdesȱinternenȱXMLȬDokuments.ȱEinȱAttributknoȬ tenȱistȱhierbeiȱseinemȱXMLȬElementȬKnotenȱzugeordnet,ȱnichtȱuntergeordnet.ȱ Imȱ folgendenȱ SQL/XMLȬProgrammȱ wirdȱ derȱ attributzentrierteȱ EntwicklungsanȬ satzȱ umgesetztȱ undȱ dieȱ Architekturvorgabenȱ vonȱ Abbildungȱ 21ȱ implementiert.ȱ Dieȱ Funktionȱ XMLATTRIBUTES()ȱerstrecktȱ sichȱ vonȱ Zeileȱ(4)ȱ bisȱ (12).ȱVergleichtȱ manȱ dasȱuntenȱstehendeȱProgrammȱmitȱProgrammȱ17:ȱProgrammȱKundeȱmitȱderȱ Funktionȱ XMLFOREST(),ȱ soȱ erkenntȱ manȱ dieȱ strukturelleȱ Identitätȱ derȱ beidenȱ FunktionenȱXMLFOREST()ȱundȱXMLATTRIBUTES().ȱ
50ȱ
4.6ȱȱXMLATTRIBUTESȱ–ȱerzeugtȱvieleȱXMLȬAttributeȱ ȱ
SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLATTRIBUTES( K.Kunde_Nr AS "Kunde_Nr", K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ) ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20)
Programmȱ19:ȱXMLATTRIBUTES()ȱundȱattributzentrierterȱEntwicklungsansatz
DasȱProgrammȱgeneriertȱdasȱfolgendeȱXMLȬDokument.ȱ Ergebnis
Amȱ nächstenȱ Beispielȱ wirdȱ derȱ gemischteȱ Entwicklungsansatzȱ vonȱ XMLȬ Dokumentenȱdargestellt.ȱHierbeiȱwirdȱdieȱKundennummerȱalsȱAttributȱdesȱXMLȬ Elementesȱ Kundeȱ modelliert.ȱ Dieȱ restlichenȱ denȱ Kundenȱ beschreibendenȱ Datenȱ werdenȱalsȱuntergeordneteȱXMLȬElementeȱvomȱWurzelelementȱKundeȱdargestellt.ȱ Dasȱ XMLȬSchemaȬModellȱ fürȱ denȱ gemischtenȱ Entwicklungsansatzȱ siehtȱ sodannȱ wieȱinȱfolgenderȱAbbildungȱ22ȱaus.ȱ
51ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ ȱ ȱ ȱ ȱ ȱ ȱ
«table» Kunde
Relationales Modell
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
ȱ ȱ ȱ ȱ ȱ ȱ ȱ
XML-Schema-Modell - gemischter Entwicklungsansatz
«Document» Dokument
1...
«Element» Kunde
1
«Element» Anrede
1
«Element» Vorname
Kunde_Nr
ȱ ȱ ȱ
1 1
ȱ ȱ
1
ȱ ȱ
1
«Element» Zuname «Element» Strasse «Element» PLZ «Element» Ort
ȱ
ȱ Abbildungȱ22:ȱGemischtesȱXMLȬSchemaȬModellȱ
Dasȱ folgendeȱ Programmȱ 20ȱ zeigtȱ dasȱ Zusammenwirkenȱ derȱ passendenȱ SprachȬ mittelȱ vonȱ SQL,ȱ derenȱ Ausführungȱ dasȱ imȱ Modellȱ konzipierteȱ XMLȬDokumentȱ generiert.ȱ
52ȱ
4.6ȱȱXMLATTRIBUTESȱ–ȱerzeugtȱvieleȱXMLȬAttributeȱ ȱ
SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLATTRIBUTES( K.Kunde_Nr AS "Kunde_Nr" ), XMLFOREST( K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ) ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22)
Programmȱ20:ȱImplementierungȱdesȱgemischtenȱModells
Nachdemȱ inȱ Zeileȱ (4)ȱ bisȱ (6)ȱ dasȱ Attributȱ Kunde_Nrȱ desȱ XMLȬElementesȱ Kundeȱ erzeugtȱwurde,ȱwerdenȱabȱZeileȱ(7)ȱbisȱ(14)ȱdieȱrestlichenȱDatenȱalsȱXMLȬElementeȱ generiertȱundȱdemȱWurzelelementȱKundeȱhierarchischȱuntergeordnet.ȱ Ergebnis Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg
ȱ ȱ ȱ ȱ ȱ ȱ ȱ
53ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ
4.7 XMLCOMMENT – erzeugt einen XML-Kommentar DieȱeingebauteȱSQL/XMLȬFunktionȱXMLCOMMENT()ȱerzeugtȱeinenȱKommenȬ tarknotenȱimȱXDMȬBaumȱdesȱinternenȱXMLȬDokuments.ȱHierbeiȱkapseltȱderȱKnoȬ tenȱeinenȱXMLȬKommentar.ȱEinȱKommentarknotenȱkannȱnullȱoderȱeinenȱVorgänȬ gerknotenȱhaben,ȱfürȱdenȱerȱalsȱKommentarȱfungiert.ȱ Dieȱ imȱ Kommentarknotenȱ gekapselteȱ Informationȱ erscheintȱ imȱ serialisiertenȱ exȬ ternenȱ XMLȬDokumentȱinȱihrerȱlesbarenȱForm.ȱSieȱunterstütztȱdenȱmenschlichenȱ Leserȱdabei,ȱdasȱXMLȬDokumentȱzuȱverstehen.ȱ DieȱGrammatikȱvonȱXMLCOMMENT()ȱzeigtȱdieȱfolgendeȱSyntaxbeschreibung.ȱ ȱ
XMLCOMMENT( Zeichenkettenausdruck )
ȱ Syntaxȱ8:ȱAufbauȱderȱeingebautenȱFunktionȱXMLCOMMENT()ȱ
Anȱ einemȱ einfachenȱ Beispielȱ wirdȱ derȱ Einsatzȱ derȱ Funktionȱ XMLCOMMENT()ȱ gezeigt.ȱ VALUES (XMLSERIALIZE( XMLDOCUMENT( XMLCOMMENT( 'Das ist ein XML-Kommentar' ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ21:ȱEinfachesȱBeispielȱderȱFunktionȱXMLCOMMENT()ȱ Ergebnis ȱ
DerȱinȱderȱSyntaxbeschreibungȱSyntaxȱ8ȱaufgeführteȱZeichenkettenausdruckȱkannȱ einȱbeliebigerȱZeichenkettenausdruckȱinȱSQLȱsein.ȱ Imȱ folgendenȱ Beispielȱ sollȱimȱ XMLȬElementȱ Kundeȱderȱ folgendeȱ Kommentarȱ steȬ hen:ȱ ȱ Alsȱ UnterelementeȱdesȱXMLȬElementsȱKundeȱ sollenȱsodannȱinȱ elementzentrierterȱ FormȱdieȱKundendatenȱfolgen.ȱ
54ȱ
4.7ȱȱXMLCOMMENTȱ–ȱerzeugtȱeinenȱXMLȬKommentarȱ ȱ ȱ ȱ ȱ ȱ ȱ
«table» Kunde
Relationales Datenbankmodell links
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
XML-Schema-Modell unten
ȱ ȱ ȱ
«Document» Dokument
1...
ȱ ȱ
1...
«Processing instruction» XML Deklaration «Element» Kunde
1
ȱ ȱ
1
ȱ
«Element» Anrede
1
«Element» Vorname
1
«Element» Zuname
1
«Element» Strasse
ȱ ȱ ȱ ȱ
«Element» PLZ
ȱ ȱ ȱ
«Element» Kunde_Nr
1
ȱ ȱ
«Comment» Kommentar
1 1
«Element» Ort
ȱ
ȱ
Abbildungȱ23:ȱXMLȬSchemaȬModellȱmitȱKommentarȱ
Dieȱ Implementierungȱ derȱ SchemaȬVorgabenȱ mitȱ Anwendungȱ derȱ eingebautenȱ FunktionȱXMLCOMMENT()ȱzeigtȱdasȱfolgendeȱProgramm.ȱ ȱ ȱ ȱ ȱ ȱ
55ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLCOMMENT( 'Kunde ' || K.Kunde_Nr || ', ' || TRIM( K.Vorname ) || ', ' || TRIM( K.Zuname ) ), XMLFOREST( K.Kunde_Nr, K.Anrede , K.Vorname , K.Zuname , K.Strasse , K.PLZ , K.Ort ) ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24)
Programmȱ22:ȱXMLCOMMENT()ȱmitȱkomplexeremȱZeichenkettenausdruck
Dieȱ eingebauteȱ SQL/XMLȬFunktionȱ XMLCOMMENT()ȱ inȱ denȱ Zeilenȱ (4)ȱ bisȱ (8)ȱ enthältȱeinenȱkomplexerenȱZeichenkettenausdruck.ȱSeinȱErgebnisȱistȱderȱgeforderȬ teȱXMLȬKommentar.ȱ Ergebnis K001 Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg
ȱ ȱ ȱ ȱ ȱ ȱ
56ȱ
4.8ȱȱXMLTEXTȱ–ȱerzeugtȱeinenȱXMLȬTextȱ
4.8 XMLTEXT – erzeugt einen XML-Text NebenȱseinenȱuntergeordnetenȱXMLȬElementenȱkannȱeinȱXMLȬElementȱauchȱTextȱ enthalten.ȱEnthältȱeinȱXMLȬElementȱaußerȱseinenȱuntergeordnetenȱXMLȬElemenȬ tenȱnochȱText,ȱsoȱwirdȱesȱalsȱgemischtesȱXMLȬElementȱȱbezeichnet.ȱEnthältȱesȱnurȱ Textȱ alsȱ seinenȱ Inhaltȱ undȱ keineȱ ihmȱ untergeordnetenȱ XMLȬElemente,ȱ soȱ nenntȱ manȱesȱeinȱeinfachesȱXMLȬElement.ȱ Dieȱ Syntaxȱ derȱ eingebautenȱ SQL/XMLȬFunktionȱ XMLTEXT(),ȱ mitȱ derȱ manȱ denȱ Textȱ erzeugenȱ kann,ȱ istȱ vergleichbarȱ mitȱ derȱ eingebautenȱ Funktionȱ XMLCOMȬ MENT().ȱ ȱ
XMLTEXT( Zeichenkettenausdruck )
ȱ Syntaxȱ9:ȱAufbauȱderȱeingebautenȱFunktionȱXMLTEXT()ȱ
ImȱfolgendenȱBeispielȱsollȱdasȱXMLȬElementȱKundeȱeinȱgemischtesȱXMLȬElementȱ sein,ȱ dasȱ ausȱ demȱ Textȱ K001,ȱMuellerȱ undȱ denȱ untergeordnetenȱ XMLȬElementenȱ Kunde_NrȱundȱZunameȱbesteht.ȱ ȱ ȱ ȱ ȱ ȱ ȱ
«table» Kunde
Relationales Datenbankmodell links
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
XML-Schema-Modell unten
ȱ ȱ ȱ ȱ
«Document» Dokument
1
«Processing instruction» XML Deklaration
1
«Element» Kunde
1
«Textk» Text
1
«Element» Kunde_Nr
1
«Element» Zuname
ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ24:ȱXMLȬSchemaȬModellȱmitȱTextȱ–ȱgemischterȱInhaltȱ
57ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ DieȱImplementierungȱderȱVorgabenȱdesȱXMLȬSchemaȬModellsȱzeigtȱdasȱfolgendeȱ Programmȱ23,ȱ inȱdemȱdieȱeingebauteȱSQL/XMLȬFunktionȱXMLTEXT()ȱeingesetztȱ ist.ȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLTEXT( K.Kunde_Nr || ', ' || TRIM( K.Zuname ) ), XMLFOREST( K.Kunde_Nr AS "Kunde_Nr", K.Zuname AS "Zuname" ) ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Kunde AS K WHERE Kunde_Nr = 'K001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18)
Programmȱ23:ȱXMLTEXT()ȱerzeugtȱXMLȬElementȱmitȱgemischtemȱInhaltȱ
Inȱ denȱ Zeilenȱ (4)ȱ bisȱ (7)ȱ desȱ obigenȱ Programmsȱ istȱ dieȱ eingebauteȱ SQL/XMLȬ Funktionȱ XMLTEXT()ȱ eingesetzt.ȱ Sieȱ erzeugtȱ denȱ Textȱ imȱ XMLȬElementȱ Kunde.ȱ WeilȱdurchȱdieȱFunktionȱXMLFOREST()ȱnochȱzweiȱuntergeordneteȱXMLȬElementeȱ generiertȱwerden,ȱistȱdasȱXMLȬElementȱKundeȱeinȱgemischtesȱXMLȬElement.ȱ Ergebnis K001, Mueller K001 Mueller
4.9 XMLNAMESPACES – erzeugt XML-Namensräume Inȱ einemȱ XMLȬDokumentȱ könnenȱ mehrereȱ Vokabularienȱ zurȱ Bildungȱ vonȱ XMLȬ Elementnamenȱ undȱ derenȱ Attributnamenȱ verwendetȱ werden.ȱ Hierbeiȱ kannȱ esȱ vorkommen,ȱdassȱdieselbeȱVokabelȱverwendetȱwird,ȱumȱmehrereȱBegriffsintensiȬ onenȱzuȱbenennen.ȱEinȱsolcherȱNameȱistȱsodannȱmehrdeutig.ȱErȱwirdȱauchȱalsȱeinȱ Homonymȱbezeichnet.ȱȱ Damitȱ einȱ homonymerȱ Bezeichnerȱ wiederȱ eindeutigȱ verwendetȱ wird,ȱ mussȱ beiȱ seinerȱAnwendungȱnochȱangegebenȱwerden,ȱausȱwelchemȱVokabularȱerȱstammt.ȱȱ Einȱ Vokabularȱwirdȱimȱ XMLȬKontextȱauchȱalsȱNamensraumȱ bezeichnet.ȱInȱXMLȱ wirdȱ einȱ homonymerȱ Bezeichnerȱ durchȱ dieȱ Anwendungȱ desȱ Konzeptesȱ qualifiȬ
58ȱ
4.9ȱȱXMLNAMESPACESȱ–ȱerzeugtȱXMLȬNamensräumeȱ zierterȱ Namenȱ eindeutigȱ gemacht.ȱ Hierbeiȱ wirdȱ vorȱ demȱ homonymenȱ Namen,ȱ durchȱeinenȱDoppelpunktȱgetrennt,ȱderȱBezeichnerȱdesȱNamensraumesȱangegeben.ȱ DerȱDoppelpunktȱistȱderȱQualifikationsoperatorȱbzw.ȱSelektorȱinȱderȱTerminologieȱ derȱObjektorientierung.ȱ WirdȱbeispielsweiseȱdieȱhomonymeȱVokabelȱPreisȱsowohlȱimȱNamensraumȱArtikelȱ alsȱauchȱimȱNamensraumȱSportȱverwendet,ȱundȱdieȱBezeichnerȱbeiderȱVokabulaȬ rienȱ werdenȱ inȱ einȱ undȱ demselbenȱ XMLȬDokumentȱ zurȱ Benennungȱ derȱ XMLȬ Elementeȱeingesetzt,ȱsoȱwirdȱdurchȱfolgendeȱSchreibweiseȱderȱGebrauchȱvonȱPreisȱ wiederȱeindeutig:ȱ ȱ5000.00ȱ ȱersterȱ Dieȱ bekannteȱSyntaxȱderȱSQL/XMLȬFunktionȱ XMLELEMENT()ȱ wirdȱnunȱumȱdieȱ syntaktischeȱEinbettungȱderȱXMLNAMESPACES()ȬFunktionȱerweitert.ȱ ȱ ȱ ȱ ȱ
XMLELEMENT( NAME Elementname [, XML-Namensraum-Vereinbarung] [, XML-Attributsfunktion] [, Elementinhaltsausdruck] ... [OPTION {NULL ON NULL | EMPTY ON NULL}] )
Syntaxȱ10:ȱEingebauteȱFunktionȱXMLELEMENT()ȱmitȱNamensraumvereinbarungȱ
DieȱXMLȬNamensraumȬVereinbarungȱfolgtȱunmittelbarȱaufȱdieȱVereinbarungȱdesȱ XMLȬElementȬNamens.ȱ Beideȱ werdenȱ durchȱ einȱ Kommaȱ voneinanderȱ getrennt.ȱ Dieȱ Vereinbarungȱ derȱ Namensräumeȱ wirdȱ durchȱ dieȱ eingebauteȱ SQL/XMLȬ FunktionȱXMLNAMESPACES()ȱbewerkstelligt.ȱ DieȱSyntaxȱderȱFunktionȱXMLNAMESPACES()ȱlautetȱfolgendermaßen.ȱ ȱ ȱ ȱ
XMLNAMESPACES( Namensraum-URI AS Namensraum-Präfix [,Namensraum-URI AS Namensraum-Präfix] ... [[,]{DEFAULT Namensraum-URI | NO DEFAULT}] )
Syntaxȱ11:ȱAufbauȱderȱFunktionȱXMLNAMESPACES()ȱ
Ausȱ derȱ Grammatikȱ derȱ eingebautenȱ SQL/XMLȬFunktionȱ XMLNAMESPACES()ȱ istȱ ersichtlich,ȱ dassȱ mehrereȱ Namensräumeȱ mitȱ ihrenȱ jeweiligenȱ Präfixenȱ vereinȬ bartȱwerdenȱkönnen.ȱWeiterhinȱistȱnochȱangebbar,ȱwelcherȱNamensraumȱalsȱDeȬ faultȬNamensraumȱverwendetȱwerdenȱsoll.ȱAlternativȱhierzuȱkannȱbestimmtȱwerȬ den,ȱ dassȱ keinȱ DefaultȬNamensraumȱ verwendetȱ wird.ȱ Einȱ DefaultȬNamensraumȱ istȱderȱNamensraum,ȱderȱvomȱSystemȱautomatischȱundȱimplizitȱinternȱverwendetȱ wird.ȱ
59ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ EinȱNamensraumȬURIȱ(URI:ȱUniversalȱResourceȱIdentifier)ȱistȱeinȱweltweitȱeinmaliȬ gerȱ Name.ȱ Erȱ istȱ derȱ Systemnameȱ fürȱ dieȱ Benennungȱ desȱ durchȱ ihnȱ benanntenȱ Vokabulars.ȱDaȱeinȱsolcherȱNamensraumȬURIȱüblicherweiseȱrechtȱlangȱist,ȱwirdȱerȱ inȱderȱASȬKlauselȱmitȱeinemȱkürzerenȱundȱimȱProgrammtextȱeffizienterȱundȱverȬ ständlicherȱ verwendbarenȱ Zweitnamenȱ verbunden.ȱ Dieserȱ Zweitnameȱ wirdȱ alsȱ Präfixȱ beiȱ derȱ Namensqualifizierungȱ verwendet.ȱ Hinterȱ ihmȱ stecktȱ jedochȱ derȱ langeȱ NamensraumȬURI.ȱ Internȱ wirdȱ dieserȱ langeȱ Nameȱ alsȱ Qualifikationspräfixȱ verwendet.ȱ Manȱ kannȱ sichȱ näherungsweiseȱ dasȱ NamensraumȬPräfixȱ alsȱ einenȱ VariablennamenȱundȱdenȱNamensraumȬURIȱalsȱdenȱVariablenwertȱvorstellen.ȱ ObwohlȱüblicherweiseȱeinȱURIȱalsȱNamensraumbezeichnerȱverwendetȱwird,ȱmussȱ esȱdiesenȱimȱInternetȱnichtȱunbedingtȱgeben.ȱZurȱNamensqualifikationȱwirdȱnämȬ lichȱ nichtȱ aufȱ dasȱ hinterȱ demȱ URIȱ stehendeȱ Objektȱ imȱ Internetȱ zugegriffen.ȱ Esȱ mussȱsomitȱkeineȱVerbindungȱmitȱdemȱInternetȱbestehen,ȱwennȱmitȱNamensräuȬ menȱgearbeitetȱwird.ȱDerȱURIȬWertȱdientȱlediglichȱalsȱeinmaligerȱPräfixwert,ȱmitȱ demȱderȱhomonymeȱXMLȬElementnameȱeindeutigȱverwendbarȱgemachtȱwird.ȱ Wirdȱ dasȱ XMLȬDokumentȱ vonȱ einemȱ validierendenȱ Parserȱ geprüft,ȱ obȱ esȱ denȱ Vorgabenȱ einesȱ oderȱ mehrererȱ XMLȬSchemataȱ entspricht,ȱ soȱ mussȱ derȱ NamensȬ raumȬURIȱderȱNameȱdesȱjeweiligenȱXMLȬSchemasȱsein,ȱaufȱdasȱderȱParserȱlesendȱ zugreifenȱmuss.ȱ EineȱNamensraumȬVereinbarungȱgiltȱfürȱdieȱXMLELEMENT()ȬFunktionȱinȱderȱdieȱ NamensraumȬVereinbarungȱerfolgtȱundȱfürȱalleȱXMLELEMENT()ȬFunktionen,ȱdieȱ derȱ vereinbarendenȱ XMLELEMENT()ȬFunktionȱ hierarchischȱ untergeordnetȱ sind.ȱ Sieȱ kannȱ inȱ denȱ untergeordnetenȱ XMLELEMENT()ȬFunktionenȱ überschriebenȱ werden.ȱGleichesȱgiltȱfürȱdieȱSQL/XMLȬFunktionȱXMLFOREST().ȱ Imȱ folgendenȱ Programmȱ 24ȱ werdenȱ inȱ denȱ Zeilenȱ (5)ȱ bisȱ (10)ȱ fürȱ denȱ NamensȬ raumȱȇhttp://www.AlfredȬMoos.de/SportȇȱderȱNamensraumȬPräfixȱSportȱundȱfürȱdenȱ Namensraumȱ ȇhttp://www.AlfredȬMoos.de/Artikelȇȱ derȱ NamensraumȬPräfixȱ Artikelȱ festgelegt.ȱ Inȱ denȱ Zeilenȱ (11)ȱ undȱ (12)ȱ werdenȱ dieȱ beidenȱ Präfixeȱ zurȱ QualifizieȬ rungȱdesȱhomonymenȱXMLȬElementȬNamensȱPreisȱverwendet.ȱ VALUES ( XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Kunde", XMLNAMESPACES( 'http://www.Alfred-Moos.de/Sport' AS "Sport", 'http://www.Alfred-Moos.de/Artikel' AS "Artikel" ), XMLFOREST( '5000.00' AS "Artikel:Preis", 'erster' AS "Sport:Preis" ) ) ) AS CLOB VERSION '1.0'
60ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16)
4.10ȱȱXMLCONCATȱ–ȱerzeugtȱeinenȱXMLȬWertȱ )
INCLUDING XMLDECLARATION
) ;
(17) (18) (19) (20)
Programmȱ24:ȱXMLNAMESPACES()ȱzurȱNamensraumvereinbarung Ergebnis 5000.00 erster
4.10 XMLCONCAT – erzeugt einen XML-Wert MitȱderȱeingebautenȱSQL/XMLȬFunktionȱXMLCONCAT()ȱwerdenȱmehrereȱWerteȱ vomȱDatentypȱXMLȱzuȱeinemȱeinzigenȱXMLȬWertȱzusammengefasst.ȱ DieȱSyntaxȱderȱFunktionȱXMLCONCAT()ȱlautetȱfolgendermaßen.ȱ ȱ
XMLCONCAT( XML-Ausdruck [, XML-Ausdruck] ... )
ȱ Syntaxȱ12:ȱSyntaxȱderȱeingebautenȱFunktionȱXMLCONCAT()ȱ
ImȱfolgendenȱProgrammȱ25ȱbestehtȱdieȱtemporäreȱTabelleȱTempȱausȱzweiȱSpaltenȱ XML_Spalte_1ȱundȱXML_Spalte_2.ȱInȱdenȱZeilenȱ(2)ȱundȱ(3)ȱwerdenȱmitȱHilfeȱderȱ Konvertierungsfunktionȱ XMLCAST()ȱ zweiȱ Zeichenkettenwerteȱ inȱ zweiȱ XMLȬ WerteȱumgewandeltȱundȱalsȱeineȱZeileȱinȱdieȱTabelleȱTempȱgeladen.ȱHierbeiȱerhalȬ tenȱ dieȱ beidenȱ Spaltenȱ auchȱ implizitȱ denȱ Datentypȱ XML,ȱ weilȱ dieȱ beidenȱ Werteȱ durchȱdieȱDatentypumwandlungȱnunȱvomȱTypȱXMLȱsind.ȱInȱderȱZeileȱ(10)ȱwerȬ denȱ dieseȱ beidenȱ XMLȬWerteȱ zuȱ einemȱ einzigenȱ XMLȬWertȱ zusammengefasst.ȱ Dieserȱ wirdȱ inȱ denȱ Zeilenȱ (9)ȱ bisȱ (11)ȱ vonȱ derȱ Funktionȱ XMLELEMENT()ȱ demȱ XMLȬElementȱWurzelȱalsȱWertȱeingefügt.ȱ DieȱSyntaxȱderȱFunktionȱXMLCAST()ȱlautetȱwieȱfolgt:ȱ ȱ
XMLCAST( Ausdruck AS Datentyp )
ȱ Syntaxȱ13:ȱSyntaxȱderȱeingebautenȱFunktionȱXMLCAST()ȱ ȱ ȱ ȱ ȱ
61ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ WITH Temp (XML_Spalte_1, XML_Spalte_2) AS (VALUES (XMLCAST('hallo' AS XML), XMLCAST('Freunde' AS XML) ) ) SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Wurzel", XMLCONCAT( XML_Spalte_1, XML_Spalte_2 ) ) ) AS CLOB VERSION '1.0' INCLUDING XMLDECLARATION ) FROM Temp ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18)
Programmȱ25:ȱAnwendungȱderȱFunktionȱXMLCONCAT() Ergebnis hallo Freunde
ȱ Imȱ folgendenȱ Programmȱ 26ȱ werdenȱ durchȱ dieȱ unterschiedlichenȱ SQL/XMLȬ Funktionenȱ einzelneȱ XMLȬWerteȱ (XDMȬKnoten)ȱ unterschiedlicherȱ Artenȱ ausgeȬ prägt.ȱDaȱdieȱFunktionȱXMLDOCUMENT()ȱnurȱeinenȱeinzigenȱXMLȬWertȱalsȱihrȱ Argumentȱ zulässt,ȱ müssenȱ dieȱ einzelnenȱ Werteȱ mitȱ Anwendungȱ derȱ Funktionȱ XMLCONCAT()ȱ zuȱ einemȱ XMLȬWertȱ zusammengefügtȱ werden.ȱ Esȱ handeltȱ sichȱ hierbeiȱ umȱ einenȱ XMLȬWert,ȱ derȱ durchȱ dieȱ Funktionȱ XMLPI()ȱerzeugtȱ wirdȱ undȱ einenȱ XMLȬWert,ȱ denȱ dieȱ Funktionȱ XMLELEMENT()ȱ zurückgibt.ȱ Derȱ Wertȱ vonȱ XMLELEMENT()ȱ bestehtȱ genauȱ genommenȱ ausȱ fünfȱ einzelnenȱ XMLȬWerten,ȱ dieȱ bereitsȱ vonȱ derȱ Funktionȱ XMLELEMENT()ȱ implizitȱ zuȱ einemȱ einzigenȱ Wertȱ zuȬ sammengebautȱwerden.ȱDieȱfünfȱTeilwerteȱwerdenȱdurchȱdieȱFunktionenȱ – – – – –
XMLELEMENT()ȱȱ XMLNAMESPACES()ȱȱ XMLATTRIBUTES()ȱȱ XMLCOMMENT()ȱȱ XMLTEXT()ȱ ȱ
inȱZeileȱ(9)ȱbisȱ(22)ȱ inȱZeileȱ(11)ȱbisȱ(13)ȱ inȱZeileȱ(14)ȱbisȱ(16)ȱ inȱZeileȱ(17)ȱbisȱ(18)ȱundȱ inȱZeileȱ(20)ȱbisȱ(21)ȱ
erzeugt.ȱ Nachdemȱ derȱ XDMȬBaumȱ zusammengebautȱ ist,ȱ wirdȱ erȱ inȱ derȱ Zeileȱ (2)ȱ vonȱ derȱ FunktionȱXMLSERIALIZE()ȱinȱseineȱZeichenformȱalsȱCLOBȬWertȱkonvertiert.ȱDieȱ KlauselȱCONTENTȱistȱwahlfreiȱundȱdientȱderȱbesserenȱLesbarkeit.ȱ
62ȱ
4.10ȱȱXMLCONCATȱ–ȱerzeugtȱeinenȱXMLȬWertȱ VALUES (XMLSERIALIZE( CONTENT XMLDOCUMENT( XMLCONCAT( XMLPI( NAME "Verarbeitungshinweis", 'irgend etwas' ), XMLELEMENT( NAME "mo:Elementname", XMLNAMESPACES( 'http://Alfred-Moos.de' AS "mo" ), XMLATTRIBUTES( 'Attributwert' AS "mo:Attributname" ), XMLCOMMENT( 'Kommentar' ), 'Elementwert', XMLTEXT( ' Das ist ein Text' ) ) ) ) AS CLOB INCLUDING XMLDECLARATION ) ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28)
Programmȱ26:ȱXMLCONCAT()ȱinȱeinemȱumfänglicherenȱBeispielȱ Ergebnis Elementwert Das ist ein Text
ȱ ȱ ȱ ȱ ȱ ȱ
63ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ
4.11 XMLAGG – erzeugt einen XML-Wert Dieȱ eingebauteȱ SQL/XMLȬFunktionȱ XMLCONCAT()ȱ dientȱ hauptsächlichȱ dazu,ȱ mehrereȱXMLȬWerteȱeinerȱTabellenzeileȱzuȱeinemȱeinzigenȱXMLȬWertȱzusammenȬ zubauen.ȱDieȱeingebauteȱSQL/XMLȬFunktionȱXMLAGG()ȱistȱinȱderȱLage,ȱmehrereȱ XMLȬWerteȱ einerȱ Tabellenspalteȱ zuȱ einemȱ einzigenȱ XMLȬWertȱ zusammenzusetȬ zen.ȱ Sieȱ zähltȱ deshalbȱ zuȱ denȱ Spaltenfunktionenȱ vonȱ SQLȱ vergleichbarȱ mitȱ denȱ SpaltenfunktionenȱCOUNT(),ȱSUM()ȱusw.ȱ Merkeȱ XMLCONCATȱȱbildetȱausȱXMLȬWertenȱeinerȱZeileȱeinenȱXMLȬWert.ȱ XMLAGGȱȱ
bildetȱausȱXMLȬWertenȱeinerȱSpalteȱeinenȱXMLȬWert.ȱ
Beispielȱ XML_Tabelleȱ ȱ
ȱ
XMLAGGȱ
ȱ
Spaltennameȱ
Spalte_1ȱ
Spalte_2ȱ
Spalte_3ȱ
ȱ
ȱ
XMLȬWertȱA1ȱ
ȱ
XMLCONCATȱ
XMLȬWertȱC1ȱ
XMLȬWertȱC2/A2ȱ
XMLȬWertȱC3ȱ
ȱ
ȱ
XMLȬWertȱA3ȱ
ȱ
Tabelleȱ6:ȱBeispieltabelleȱzurȱErklärungȱvonȱXMLCONCAT()ȱundȱXMLAGG()ȱ
DieȱFunktionȱXMLCONCATȱbautȱdieȱdreiȱWerteȱȱ – XMLȬWertȱC1ȱ – XMLȬWertȱC2/A2ȱ – XMLȬWertȱC3ȱ zuȱeinemȱXMLȬWertȱzusammen.ȱ DieȱFunktionȱXMLAGGȱbautȱdieȱdreiȱWerteȱ – XMLȬWertȱA1ȱ – XMLȬWertȱC2/A2ȱ – XMLȬWertȱA3ȱ zuȱeinemȱXMLȬWertȱzusammen.ȱ Dieȱ Wirkungsweiseȱ derȱ beidenȱ SQL/XMLȬFunktionenȱ wirdȱ nunȱ anȱ einemȱ einfaȬ chenȱBeispielȱdemonstriert.ȱDiesesȱimplementiertȱzunächstȱdieȱTabelleȱ6:ȱBeispielȬ tabelleȱzurȱErklärungȱvonȱXMLCONCAT()ȱundȱXMLAGG().ȱAnschließendȱwerdenȱ dieȱbeidenȱeingebautenȱFunktionenȱaufȱdieȱBeispieldatenȱangewendet.ȱȱ DieȱfolgendeȱBeispieltabelleȱbestehtȱausȱdreiȱSpaltenȱjeweilsȱimȱDatentypȱXML.ȱ
64ȱ
4.11ȱȱXMLAGGȱ–ȱerzeugtȱeinenȱXMLȬWertȱ CREATE TABLE XML_Tabelle (Spalte_1 XML, Spalte_2 XML, Spalte_3 XML ) ;
(1) (2) (3) (4) (5) (6)
Programmȱ27:ȱVereinbarungȱderȱBeispieltabelleȱXML_Tabelleȱ
DieȱBeispieltabelleȱwirdȱnunȱmitȱdenȱDemonstrationsdatenȱgeladen.ȱWeilȱdieȱSpalȬ tenȱderȱTabelleȱvomȱDatentypȱXMLȱsind,ȱfindetȱbeimȱLadeprozessȱeineȱimpliziteȱ DatentypumwandlungȱinȱdenȱTypȱXMLȱstatt.ȱ INSERT INTO XML_Tabelle (Spalte_1, Spalte_2, Spalte_3) VALUES (null, 'XML_Wert A1', null), ('XML_Wert C1' , 'XML_Wert C2/A2', 'XML_Wert C3' ), (null, 'XML_Wert A3', null) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
Programmȱ28:ȱLadenȱderȱTabelleȱmitȱBeispieldatenȱ
MitȱderȱFunktionȱXMLCONCAT()ȱinȱderȱProgrammzeileȱ(4)ȱbisȱ(7)ȱwerdenȱdieȱdreiȱ XMLȬWerteȱ derȱ Tabellenzeileȱ mitȱ demȱ Wertȱ XML_WertȱC1ȱ inȱ Spalte_1ȱ zuȱ einemȱ XMLȬWertȱzusammengebaut.ȱ ȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Wurzel", XMLCONCAT( Spalte_1, Spalte_2, Spalte_3 ) ) ) AS CLOB INCLUDING XMLDECLARATION ) FROM XML_Tabelle WHERE XMLCAST(Spalte_1 AS CHAR (11)) = 'XML_Wert C1' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ29:ȱZeilenweiseȱZusammenfassungȱvonȱXMLȬWertenȱmitȱXMLCONCAT()ȱ
ȱ ȱ
65ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ Ergebnis xml version="1.0" encoding="UTF-8" ?> XML_Wert C1 XML_Wert C2/A2 XML_Wert C3
ImȱProgrammȱ30ȱwerdenȱmitȱderȱFunktionȱXMLAGG()ȱinȱderȱProgrammzeileȱ(4)ȱ bisȱ (5)ȱ dieȱ dreiȱ XMLȬWerteȱ derȱ Tabellenspalteȱ Spalte_2ȱ zuȱ einemȱ XMLȬWertȱ zuȬ sammengebaut.ȱ ȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Wurzel", XMLAGG( Spalte_2 ) ) ) AS CLOB INCLUDING XMLDECLARATION ) FROM XML_Tabelle ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
Programmȱ30:ȱSpaltenweiseȱZusammenfassungȱvonȱXMLȬWertenȱmitȱXMLAGG()ȱ Ergebnis A1 C2/A2 A3
DieȱSyntaxȱderȱFunktionȱXMLAGG()ȱlautetȱfolgendermaßen.ȱ ȱ ȱ ȱ
XMLAGG( XML-Ausdruck [ORDER BY Sortierausdruck [ASC | DESC] [, Sortierausdruck [ASC | DESC]]...] )
Syntaxȱ14:ȱAufbauȱderȱFunktionȱXMLAGG()ȱ
Wieȱ ausȱ derȱ Syntaxȱ derȱ Funktionȱ XMLAGG()ȱ ersichtlichȱ ist,ȱ könnenȱ dieȱ XMLȬ Werteȱ einerȱSpalteȱ vorȱ ihremȱ Zusammenbauȱ zuȱ einemȱ einzigenȱWertȱ inȱ eineȱ geȬ wünschteȱSortierfolgeȱgebrachtȱwerden.ȱ
66ȱ
4.11ȱȱXMLAGGȱ–ȱerzeugtȱeinenȱXMLȬWertȱ Imȱ folgendenȱ Programmȱ31ȱ werdenȱ dieȱ XMLȬWerteȱderȱ Spalte_2ȱzunächstȱinȱabȬ steigenderȱFolgeȱsortiert,ȱbevorȱsieȱsodannȱzuȱeinemȱeinzigenȱWertȱvonȱderȱFunkȬ tionȱXMLAGG()ȱzusammengefasstȱwerden.ȱDaȱXMLȬWerteȱdirektȱnichtȱsortierbarȱ sind,ȱ werdenȱ sieȱ zunächstȱ inȱ einenȱ temporärenȱ Sortierbegriffȱ inȱ ZeichenkettenȬ formȱ derȱ Längeȱ 15ȱ Zeichenȱ konvertiert.ȱ Nachȱ diesemȱ Sortierbegriffȱ wirdȱ sodannȱ dieȱSortierungȱvorgenommen,ȱsieheȱZeileȱ(5)ȱbisȱ(7).ȱ ȱ SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT( NAME "Wurzel", XMLAGG( Spalte_2 ORDER BY XMLCAST (Spalte_2 AS CHAR (15)) DESC ) ) ) AS CLOB INCLUDING XMLDECLARATION ) FROM XML_Tabelle ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ31:ȱFunktionȱXMLAGG()ȱmitȱderȱORDERȱBYȬKlauselȱ Ergebnis C2/A2 A3 A1
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
67ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ
4.12 Publikation der Kunden und ihren Rechnungen NachdemȱwirȱdieȱPublikationsfunktionenȱvonȱSQL/XMLȱinȱihrenȱgrundsätzlichenȱ Wirkungsweisenȱ nunȱ kennen,ȱ könnenȱ wirȱ unsȱ weiterenȱ Beispielenȱ zuwenden.ȱ Dieseȱ erfordernȱ denȱkombiniertenȱ EinsatzȱderȱSQL/XMLȬFunktionenȱzurȱLösungȱ komplexererȱAnforderungenȱanȱdieȱGenerierungȱvonȱXMLȬDokumenten.ȱ Daȱ dieȱ zuȱ generierendenȱ XMLȬDokumenteȱ üblicherweiseȱ hierarchischȱ tiefȱ geȬ schachtelteȱ Baumstrukturenȱ sind,ȱ müssenȱ auchȱ dieȱ sieȱ generierendenȱ SQL/XMLȬ Funktionenȱ hierarchischȱ tiefȱ ineinanderȱ geschachteltȱ werden.ȱ Zwischenȱ derȱ DaȬ tenarchitekturȱ desȱzuȱgenerierendenȱ XMLȬDokumentesȱ undȱderȱ ProgrammarchiȬ tekturȱ desȱ SQLȬProgramms,ȱ dasȱ diesesȱ XMLȬDokumentȱ erzeugt,ȱ bestehtȱ eineȱ spiegelbildlicheȱundȱwechselseitigeȱIdentität.ȱ ProgrammeȱmitȱtiefȱgeschachteltenȱFunktionenȱsindȱnichtȱeinfachȱzuȱüberblicken.ȱ SieȱentfaltenȱsehrȱschnellȱeineȱhoheȱKomplexität.ȱUmȱdieseȱKomplexitätȱbestmögȬ lichȱzuȱbeherrschen,ȱsindȱeineȱgrafischeȱDarstellungȱihresȱBauplansȱundȱeineȱhoheȱ DisziplinȱbeiȱderȱProgrammniederschriftȱerforderlich.ȱȱ Speziellȱ dieȱ schließendenȱ Klammernȱ derȱ ineinanderȱ geschachteltenȱ SQL/XMLȬ Funktionenȱ müssenȱ mitȱ hoherȱ darstellerischerȱ Disziplinȱ immerȱanȱ ihremȱ erwartȬ barenȱPlatzȱniedergeschriebenȱwerden.ȱBereitsȱgeringeȱVerstößeȱgegenȱdiesesȱeinȬ facheȱ Gebotȱ führenȱ zuȱ einerȱ kaumȱ nochȱ beherrschbarenȱ Komplexitätȱ bereitsȱ beiȱ kleinenȱSQLȬProgrammen.ȱ InȱdenȱfolgendenȱKapitelnȱwirdȱdieȱGenerierungȱdesȱhierarchischȱtiefȱgegliedertenȱ XMLȬDokumentesȱ Kundenrechnungenȱ erläutert.ȱ Esȱ wirdȱ hierbeiȱ dieȱ Technikȱ desȱ evolutionärenȱPrototypingȱsowohlȱimȱModellentwurfȱalsȱauchȱbeiȱderȱImplemenȬ tierungȱangewendet.ȱDabeiȱwirdȱderȱaktuelleȱPrototypȱaufȱseinemȱVorgängerȱaufȬ bauendȱentwickelt.ȱȱ Weiterhinȱ wirdȱ derȱ architekturgetriebeneȱ Programmentwicklungsansatzȱ konseȬ quentȱ beibehalten.ȱ Hierbeiȱ wirdȱ zunächstȱ derȱ Bauplanȱ desȱ zuȱ entwickelndenȱ XMLȬDokumentesȱ entworfen.ȱ Weilȱ derȱ Bauplanȱ desȱ XMLȬDokumentesȱ undȱ derȱ BauplanȱdesȱProgrammsȱspiegelbildlichȱzueinanderȱpassen,ȱgehtȱausȱdemȱBauplanȱ desȱXMLȬDokumentesȱhervor,ȱanȱwelcherȱStelleȱdesȱhieraufȱfolgendenȱSQL/XMLȬ ProgrammsȱwelcheȱeingebauteȱFunktionȱvonȱSQL/XMLȱzuȱverwendenȱist.ȱ ȱ ȱ ȱ ȱ ȱ
68ȱ
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ ȱ
Ausgangspunktȱ derȱ weiterenȱ Untersuchungenȱ istȱ dasȱ bekannteȱ relationaleȱ Datenbankdiagrammȱ (RDBD).ȱ Seineȱ Strukturȱ ergibtȱ sichȱ einsȬzuȬeinsȱ ausȱ demȱ ihmȱ zugrundeȱ liegendenȱ EntitätsȬBeziehungsȬDiagrammȱ (ERD),ȱ weilȱdieȱausȱ denȱEntitätstypenȱabgeleitetenȱReȬ lationstypenȱ allesamtȱ sichȱ inȱ derȱ drittenȱ Normalformȱ befinden.ȱ
ȱ ȱ ȱ ȱ ȱ
DasȱRDBDȱkenntȱkeineȱhierarchischenȱAbhängigkeitenȱ zwischenȱ denȱ Relationen.ȱ Ganzȱ andersȱ sindȱ dieȱ VerȬ hältnisseȱ beimȱ zuȱ generierendenȱ XMLȬDokument.ȱ SeiȬ neȱStrukturȱistȱhierarchisch.ȱ
ȱ ȱ ȱ
Derȱ erforderlicheȱ Transformationsprozessȱ zwischenȱ derȱ relationalenȱ Datenhaltungȱ inȱ denȱ DatenbanktabelȬ lenȱ undȱ derȱ hierarchischenȱ Repräsentationȱ dieserȱ relaȬ tionalenȱ Datenȱ inȱ denȱ XMLȬDokumentenȱ mussȱ mitȱ demȱ geeignetenȱ Einsatzȱ derȱ eingebautenȱ Funktionenȱ vonȱ SQL/XMLȱ undȱ weitererȱ SQLȬSprachmittelȱ erfolȬ gen.ȱ
ȱ ȱ ȱ ȱ ȱ ȱ
Dieȱ Strukturȱ desȱ letztendlichȱ zuȱ generierendenȱ XMLȬ Dokumentesȱ zeigtȱ dieȱ Abbildungȱ 26.ȱ Sieȱ drücktȱ aus,ȱ dassȱ dasȱ XMLȬDokumentȱ elementzentriertȱ zuȱ entwiȬ ckelnȱist.ȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ25:ȱRelationalesȱDatenbankdiagrammȱ
ȱ Rechnungsschreibungȱ
69ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ
ȱ Abbildungȱ26:ȱArchitekturȱdesȱXMLȬDokumentesȱKundenrechnungenȱ
70ȱ
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ
4.12.1 XML-Dokument Alle Kunden Imȱ erstenȱ Entwicklungsschrittȱ wirdȱ dasȱ XMLȬDokumentȱ Alleȱ Kundenȱ inȱ derȱ eleȬ mentzentriertenȱ Formȱ erzeugt.ȱ Beiȱ ihmȱ istȱ dieȱ bisherigeȱ Einschränkungȱ aufgehoȬ ben,ȱdieȱdarinȱbestandenȱhat,ȱdassȱnurȱdieȱDatenȱdesȱeinenȱKundenȱmitȱderȱKunȬ dennummerȱK001ȱimȱXMLȬDokumentȱausgegebenȱwurden.ȱ Dieȱ beidenȱ Baupläne,ȱ dieȱ desȱ relationalenȱ Datenbankmodellsȱ undȱ desȱ hierarchiȬ schenȱXMLȬDokumentenmodells,ȱsehenȱwieȱfolgtȱaus.ȱ ȱ ȱ ȱ ȱ ȱ ȱ
«table» Kunde
Relationales Datenbankmodell
Kunde_Nr : CHAR(4) Anrede : CHAR(4) Vorname : CHAR(15) Zuname : CHAR(15) Strasse : CHAR(15) PLZ : CHAR(5) Ort : CHAR(15)
ȱ ȱ
XML-Schema-Modell
ȱ ȱ ȱ ȱ ȱ
«Document» Dokument
1
«Processing instruction» XML Deklaration
1
«Element» Alle_Kunden
*
«Element» Kunde
ȱ ȱ ȱ
Die Multiplizität viele (*) erfordert den Einsatz der SQL/XML-Funktion XMLAGG
ȱ
1
«Element» Kunde_Nr
1
«Element» Anrede
1
«Element» Vorname
1
«Element» Zuname
1
«Element» Strasse
1
«Element» PLZ
ȱ ȱ ȱ ȱ ȱ ȱ
1
«Element» Ort
ȱ
Abbildungȱ27:ȱXMLȬDokumentȱAlle_Kundenȱ
71ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ Vergleichtȱ manȱ dasȱ obigeȱ XMLȬSchemaȬModellȱ mitȱ seinerȱ Vorgängerversionȱ inȱ Abbildungȱ20,ȱbeiȱderȱdieȱEinschränkungȱaufȱnurȱeinenȱKundenȱgilt,ȱdannȱerkenntȱ man,ȱdassȱdasȱneueȱXMLȬWurzelelementȱAlle_Kundenȱnunȱvorhandenȱist.ȱWeiterȬ hin,ȱdassȱdieȱKompositionsbeziehung,ȱwelcheȱAlle_KundenȱmitȱdemȱXMLȬElementȱ Kundeȱverbindet,ȱmitȱderȱMultiplizitätȱvieleȱ(UML:ȱ*)ȱausgezeichnetȱist.ȱ Dieȱ Multiplizitätȱ vieleȱ bedeutet,ȱ dassȱ vieleȱ XMLȬWerteȱ derȱ Artȱ Kundeȱ zuȱ einemȱ einzigenȱ XMLȬWertȱ zusammenzufassenȱ sind.ȱ Dieserȱ istȱ demȱ XMLȬElementȱ AlȬ le_Kundenȱ alsȱ Elementwertȱ einzufügen,ȱ sieheȱ Programmzeilenȱ (3)ȱ undȱ (4).ȱ Dieȱ ZusammenfassungȱvielerȱgleichartigerȱXMLȬElementwerteȱ inȱ einerȱ Spalteȱzuȱnurȱ einemȱ Wertȱ leistetȱ dieȱ SQL/XMLȬFunktionȱ XMLAGG(),ȱ sieheȱ Zeilenȱ (4)ȱ bisȱ (16).ȱ Dieȱ demȱ XMLȬElementȱ Kundeȱ hierarchischȱuntergeordnetenȱ XMLȬElementeȱ KunȬ de_Nr,ȱ Anredeȱ usw.ȱ werdenȱ sinnvollȱ weilȱ übersichtlichȱ mitȱ derȱ eingebautenȱ SQL/XMLȬFunktionȱXMLFOREST()ȱerzeugt,ȱsieheȱZeilenȱ(6)ȱbisȱ(14).ȱ DasȱfolgendeȱSQL/XMLȬProgrammȱgeneriertȱdasȱgeforderteȱXMLȬDokument.ȱ ȱ SELECT XMLSERIALIZE( CONTENT XMLDOCUMENT( XMLELEMENT( NAME "Alle_Kunden", XMLAGG( XMLELEMENT( NAME "Kunde", XMLFOREST( K.Kunde_Nr AS "Kunde_Nr", K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ) ) ) ) ) AS CLOB INCLUDING XMLDECLARATION ) AS Ergebnis FROM Kunde K ;
Programmȱ32:ȱXMLȬDokumentȱAlle_Kundenȱ
72ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21)
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ Ergebnis K001 Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg K002 Herr Georg Mayer Neckarstr. 1 69123 Heidelberg K003 Frau Eva Schulze Hauptstr. 7 69502 Hemsbach
Eineȱ etwasȱ übersichtlichereȱ Lösungȱ derselbenȱ Aufgabenstellungȱ enthältȱ dasȱ folȬ gendeȱProgrammȱ33.ȱInȱihmȱistȱdieȱErzeugungȱderȱXMLȬElementeȱKundeȱundȱihrerȱ ihnenȱhierarchischȱuntergeordnetenȱXMLȬElementeȱKunde_Nr,ȱAnredeȱusw.ȱinȱderȱ FROMȬKlauselȱinȱeineȱtemporäreȱNebentabelleȱ(SQL:ȱLATERAL)ȱmitȱdemȱNamenȱ XML_KundeȱundȱderȱSpalteȱXML_Spalte_Kundeȱausgelagert,ȱsieheȱZeileȱ(9)ȱbisȱ(23).ȱ DieseȱLateralȬTabelleȱwirdȱmitȱderȱUnteranfrageȱaufȱdieȱTabelleȱKundeȱaufgebaut.ȱ Dieȱ XMLȬWerteȱ inȱderȱSpalteȱXML_Spalte_KundeȱderȱLateralȬTabelleȱXML_Kundeȱ werdenȱ inȱ derȱ Hauptanfrageȱ vonȱ derȱ SQL/XMLȬFunktionȱ XMLAGG()ȱ zuȱ einemȱ einzigenȱ Wertȱ zusammengefasst,ȱ sieheȱ Zeileȱ (4).ȱ Derȱ Ergebniswertȱ wirdȱ sodannȱ derȱ Funktionȱ XMLELEMENT()ȱ zurȱVerfügungȱ gestellt,ȱ dieȱ dasȱ XMLȬElementȱ AlȬ le_Kundenȱgeneriert,ȱsieheȱZeileȱ(3).ȱ ȱ ȱ ȱ
73ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ ȱ
SELECT XMLSERIALIZE( CONTENT XMLDOCUMENT( XMLELEMENT( NAME "Alle_Kunden", XMLAGG(XML_Kunde.XML_Spalte_Kunde ) ) ) AS CLOB INCLUDING XMLDECLARATION ) AS Ergebnis FROM LATERAL (SELECT XMLELEMENT( NAME "Kunde", XMLFOREST( K.Kunde_Nr AS "Kunde_Nr", K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ) ) FROM Kunde K ) AS XML_Kunde (XML_Spalte_Kunde) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24)
Programmȱ33:ȱXMLȬDokumentȱAlle_KundenȱmitȱtemporärerȱLateralȬTabelleȱ
4.12.2 XML-Dokument Alle Kunden mit ihren Rechnungen Inȱ dasȱ XMLȬDokumentȱ Alle_Kundenȱ werdenȱ nunȱ imȱ anstehendenȱ ErweiterungsȬ schrittȱnochȱderenȱRechnungenȱmitȱaufgenommen.ȱ Dieȱ beidenȱ Baupläne,ȱ dieȱ desȱ relationalenȱ Datenbankmodellsȱ undȱ desȱ hierarchiȬ schenȱ XMLȬDokumentenmodellsȱ sindȱ inȱ Abbildungȱ 28ȱ dargestellt.ȱ Imȱ Vergleichȱ zuȱAbbildungȱ27:ȱXMLȬDokumentȱAlle_KundenȱsindȱjetztȱnochȱdasȱXMLȬElementȱ Rechnungenȱ undȱ dasȱ XMLȬElementeȱ Rechnungȱ mitȱ seinenȱ abhängigenȱ XMLȬ Elementenȱ Rechnung_Nr,ȱ Kunde_Nrȱ usw.ȱ hinzugekommen.ȱ Dieȱ XMLȬElementeȱ Rechnungenȱ undȱ Rechnungȱ sindȱ überȱ eineȱ Kompositionsbeziehungȱ mitȱ derȱ MulȬ tiplizitätȱvieleȱ(UML:ȱ*)ȱmiteinanderȱverbunden.ȱ Zwischenȱ denȱ XMLȬElementenȱ Alle_Kundenȱ undȱ Kundeȱ sowieȱ Rechnungenȱ undȱ RechnungȱbestehtȱsomitȱjeȱeineȱKompositionsbeziehungȱmitȱderȱMultiplizitätȱvieleȱ (*).ȱ Programmtechnischȱ erfordertȱ eineȱ Multiplizitätȱ derȱ Artȱ vieleȱ denȱ Einsatzȱ derȱ Spaltenfunktionȱ XMLAGG().ȱ Spaltenfunktionenȱ sindȱ inȱ SQLȱ jedochȱ direktȱ nichtȱ ineinanderȱschachtelbar.ȱBeziehenȱsichȱdieȱjeweiligenȱFunktionenȱXMLAGG()ȱaufȱ eineȱ Spalteȱ einerȱ temporärenȱ LateralȬTabelle,ȱ soȱ kannȱ überȱ diesenȱ Umwegȱ eineȱ hierarchischeȱ Schachtelungȱ auchȱ derȱ SQL/XMLȬFunktionȱ XMLAGG()ȱ programmȬ technischȱumgesetztȱwerden.ȱȱ
74ȱ
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ ȱ Abbildungȱ28:ȱXMLȬDokumentȱAlleȱKundenȱmitȱihrenȱRechnungenȱ
DiesenȱLösungswegȱdesȱEinsatzesȱvonȱtemporärenȱNebentabellenȱ(SQL:ȱLATERALȱ früherȱauchȱTABLE)ȱwerdenȱwirȱinȱdenȱfolgendenȱProgrammenȱeinschlagen.ȱ DasȱfolgendeȱProgrammȱ34ȱimplementiertȱdieȱobigeȱArchitekturȱundȱgeneriertȱdasȱ geforderteȱXMLȬDokument.ȱ ȱ
75ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
SELECT XMLSERIALIZE( CONTENT XMLDOCUMENT( XMLELEMENT( NAME "Alle_Kunden", XMLAGG(XML_Kunde.XML_Spalte_Kunde ) ) ) AS CLOB INCLUDING XMLDECLARATION ) AS Ergebnis FROM LATERAL (SELECT XMLELEMENT( NAME "Kunde", XMLFOREST( K.Kunde_Nr AS "Kunde_Nr", K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ), XMLELEMENT( NAME "Rechnungen", (SELECT XMLAGG(XML_Rechnung.XML_Spalte_Rechnung) FROM LATERAL (SELECT XMLELEMENT( NAME "Rechnung", XMLFOREST( R.Rechnung_Nr AS "Rechnung_Nr", R.Kunde_Nr AS "Kunde_Nr" , R.Datum AS "Datum" , R.Betrag AS "Betrag" ) ) FROM Rechnung AS R WHERE R.Kunde_Nr = K.Kunde_Nr ) AS XML_Rechnung (XML_Spalte_Rechnung) ) OPTION EMPTY ON NULL ) ) FROM Kunde AS K ) AS XML_Kunde (XML_Spalte_Kunde) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43)
ȱ Programmȱ34:ȱXMLȬDokumentȱAlleȱKundenȱmitȱihrenȱRechnungenȱ
Abȱ derȱ Programmzeileȱ (21)ȱ bisȱ (39)ȱ wirdȱ derȱ Zwischenknotenȱ vomȱ Typȱ XMLȬ Elementȱ mitȱ demȱ Namenȱ Rechnungenȱ mitȱ seinenȱ abhängigenȱ Knotenȱ erzeugt.ȱ Inȱ derȱZeileȱ(22)ȱwirdȱdieȱFunktionȱXMLAGG()ȱaufȱXMLȬWerteȱderȱSpalteȱXML_SpalȬ te_Rechnungȱ derȱ LateralȬTabelleȱ XML_Rechnungȱ angewendet.ȱ Dieseȱ Schachtelungȱ derȱFunktionȱXMLAGG()ȱinȱdieȱgleichnamigeȱFunktionȱinȱZeileȱ(4)ȱistȱnurȱdeshalbȱ SQLȬkonform,ȱ weilȱ beideȱ Funktionenȱ ihreȱ zuȱ aggregierendenȱ Datenȱ ausȱ Spaltenȱ
76ȱ
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ temporärerȱNebentabellenȱ(LATERAL)ȱbeziehen.ȱEineȱdirekteȱSchachtelungȱohneȱ eineȱTrennungȱüberȱtemporäreȱZwischentabellenȱführtȱzuȱeinemȱSQLȬFehler.ȱ Damitȱ dieȱ Unteranfrageȱ inȱ Zeileȱ (22)ȱ aufȱ Datenȱ derȱ Tabelleȱ Rechnungȱ nurȱ RechȬ nungsdatenȱ desȱ aktuellenȱ Kundenȱ derȱ Hauptanfrageȱ erhältȱ undȱ inȱ XMLȬKnotenȱ konvertiert,ȱistȱeineȱKoppelungȱderȱHauptanfrageȱmitȱderȱUnteranfrageȱerforderȬ lich.ȱ Eineȱ solcheȱ Unteranfrage,ȱ dieȱ jeȱ Zeileȱ derȱ Hauptanfrageȱ ausgeführtȱ wird,ȱ bezeichnetȱ manȱ inȱ SQLȱ auchȱ alsȱ eineȱ korrelierteȱUnteranfrage.ȱ Dieȱ Korrelationȱ erȬ folgtȱ inȱ derȱ WHEREȬKlauselȱ derȱ Programmzeileȱ (35).ȱ Imȱ Gleichheitsprädikatȱ R.Kunde_Nrȱ=ȱK.Kunde_NrȱsindȱdieȱbeidenȱKorrelationsnamenȱRȱfürȱRechnungȱundȱ Kȱ fürȱ Kundeȱ zurȱ Qualifizierungȱ derȱ beidenȱ Spaltenȱmitȱ jeȱ demȱ Namenȱ Kunde_Nrȱ verwendetȱworden.ȱDurchȱdenȱKorrelationsnamenȱKȱwirdȱderȱBezugȱderȱUnteranȬ frageȱzurȱaktuellenȱZeileȱderȱHauptanfrageȱhergestellt.ȱInȱZeileȱ(38)ȱstehtȱdieȱKlauȬ selȱ OPTIONȱ EMPTYȱ ONȱ NULL.ȱ Mitȱ ihrȱ wirdȱ festgelegt,ȱ dassȱ einȱ leeresȱ XMLȬ ElementȱRechnungenȱerzeugtȱwerdenȱsoll,ȱfallsȱeinȱKundeȱkeineȱRechnungenȱhat.ȱ DasȱgenerierteȱXMLȬDokumentȱistȱbereitsȱrechtȱumfangreich.ȱDeshalbȱsindȱeinigeȱ Dokumententeileȱkollabiert.ȱVorȱihrenȱStartȬTagsȱstehtȱeinȱPluszeichenȱ(+).ȱEsȱbeȬ sagt,ȱ dassȱ dasȱ Teildokumentȱ durchȱ eineȱ Expansionȱ sichtbarȱ gemachtȱ werdenȱ könnte.ȱMitȱdemȱMinuszeichenȱwirdȱangezeigt,ȱdassȱeineȱKollabierungȱmöglichȱist.ȱ DieseȱSteuereinrichtungenȱwerdenȱvomȱInternetexplorerȱderȱFirmaȱMicrosoftȱzurȱ Verfügungȱgestellt.ȱ Ergebnis - - K001 Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg R001 K001 2008-04-04 000013000.00 + + - K003 Frau Eva Schulze Hauptstr. 7
77ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ 69502 Hemsbach
4.12.3 XML-Dokument Kundenrechnungen Inȱ dasȱ XMLȬDokumentȱ AlleȱKundenȱmitȱihrenȱRechnungenȱ werdenȱ nunȱ imȱ letztenȱ ErweiterungsschrittȱnochȱderenȱRechnungspositionenȱundȱdieȱmitȱdiesenȱverbunȬ denenȱArtikelȱaufgenommen.ȱ Dieȱ beidenȱ Baupläne,ȱ dieȱ desȱ relationalenȱ Datenbankmodellsȱ undȱ desȱ hierarchiȬ schenȱXMLȬDokumentmodellsȱsindȱinȱAbbildungȱ29ȱdargestellt.ȱȱ Imȱ Vergleichȱ zuȱ Abbildungȱ 28ȱ sindȱ jetztȱ nochȱ dasȱ XMLȬElementȱ Positionenȱ undȱ dasȱ XMLȬElementȱ Positionȱ mitȱ seinenȱ abhängigenȱ XMLȬElementenȱ Rechnung_Nr,ȱ Artikel_Nr,ȱAnzahlȱundȱArtikelȱhinzugekommen.ȱDesȱWeiterenȱsindȱnochȱdieȱvomȱ XMLȬElementȱArtikelȱabhängigenȱXMLȬElementeȱArtikel_Nr,ȱNameȱundȱPreisȱinȱdasȱ Modellȱ mitȱ aufgenommen.ȱ Dieȱ XMLȬElementeȱ Positionenȱ undȱ Positionȱ sindȱ überȱ eineȱKompositionsbeziehungȱmitȱderȱMultiplizitätȱvieleȱ(UML:ȱ*)ȱmiteinanderȱverȬ bunden.ȱ ImȱGesamtmodellȱsindȱsomitȱjetztȱdreiȱKompositionsbeziehungenȱmitȱjeȱderȱMulȬ tiplizitätȱ vieleȱ (UML:ȱ *)ȱ aufȱ demȱ hierarchischenȱ Pfadȱ zwischenȱ denȱ XMLȬEleȬ mentenȱ Alle_Kundenȱ undȱ Kunde,ȱ Rechnungenȱ undȱ Rechnungȱ sowieȱ Positionenȱ undȱ Positionȱvorhanden.ȱWieȱwirȱschonȱkennenȱgelerntȱhaben,ȱerfordertȱeineȱMultipliȬ zitätȱ derȱ Artȱ vieleȱ programmtechnischȱ denȱ Einsatzȱ derȱ Spaltenfunktionȱ XMLȬ AGG().ȱ Somitȱ mussȱ letztlichȱ dieȱ Spaltenfunktionenȱ XMLAGG()ȱ dreimalȱ ineinanȬ derȱgeschachteltȱangewendetȱwerden.ȱDaȱdiesȱinȱSQLȱjedochȱdirektȱnichtȱmöglichȱ ist,ȱwerdenȱnunȱdreiȱtemporäreȱLateralȬTabellenȱbenötigt.ȱDieseȱwerdenȱmitȱkorreȬ liertenȱ Unteranfragenȱ aufgebautȱ undȱ mitȱ denȱ erforderlichenȱ Datenȱ imȱ XMLȬTypȱ gefüllt.ȱ Inȱ derȱ folgendenȱ Abbildungȱ 29:ȱ XMLȬDokumentȱ undȱ RDBDȱ Kundenrechnungenȱ sindȱdieȱbeidenȱModelle,ȱdasȱrelationaleȱDatenbankmodellȱundȱdasȱhierausȱabgeȬ leiteteȱXMLȬSchemaȬModellȱdargestellt.ȱ
78ȱ
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ29:ȱXMLȬDokumentȱundȱRDBDȱKundenrechnungenȱ
79ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ DieȱprogrammtechnischeȱUmsetzungȱdesȱXMLȬSchemaȬModellsȱKundenrechnunȬ genȱ demonstriertȱdasȱ folgendeȱ Programmȱ35.ȱHinzugekommenȱzuȱProgrammȱ34ȱ istȱderȱProgrammteilȱabȱZeileȱ(33)ȱbisȱ(71).ȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
SELECT XMLSERIALIZE( CONTENT XMLDOCUMENT( XMLELEMENT( NAME "Alle_Kunden", XMLAGG(XML_Kunde.XML_Spalte_Kunde ) ) ) AS CLOB INCLUDING XMLDECLARATION ) AS Ergebnis FROM LATERAL (SELECT XMLELEMENT( NAME "Kunde", XMLFOREST( K.Kunde_Nr AS "Kunde_Nr", K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ), XMLELEMENT( NAME "Rechnungen", (SELECT XMLAGG(XML_Rechnung.XML_Spalte_Rechnung) FROM LATERAL (SELECT XMLELEMENT( NAME "Rechnung", XMLFOREST( R.Rechnung_Nr AS "Rechnung_Nr", R.Kunde_Nr AS "Kunde_Nr" , R.Datum AS "Datum" , R.Betrag AS "Betrag" ), (SELECT XMLELEMENT( NAME "Positionen", XMLAGG( XML_Position.XML_Spalte_Position) ) FROM LATERAL (SELECT XMLELEMENT( NAME "Position", XMLFOREST ( P.Rechnung_Nr AS "Rechnung_Nr", P.Artikel_Nr AS "Artikel_Nr" , P.Anzahl AS "Anzahl" ),
ȱ
ȱ
80ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49)
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ ȱ ȱ
XMLELEMENT( NAME "Artikel", XMLFOREST( A.Artikel_Nr AS "Artikel_Nr", A.Name AS "Name" , A.Preis AS "Preis" ) )
ȱ ȱ ȱ ȱ ȱ
) FROM
ȱ
Position P INNER JOIN Artikel A ON P.Artikel_Nr = A.Artikel_Nr WHERE P.Rechnung_Nr = R.Rechnung_Nr ) AS XML_Position (XML_Spalte_Position)
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ;
) ) FROM Rechnung AS R WHERE R.Kunde_Nr = K.Kunde_Nr ) AS XML_Rechnung (XML_Spalte_Rechnung) ) OPTION EMPTY ON NULL ) ) FROM Kunde AS K ) AS XML_Kunde (XML_Spalte_Kunde)
(50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81)
ȱ Programmȱ35:ȱKundenrechnungenȱ
Inȱ Programmzeileȱ (33)ȱ bisȱ (71)ȱ wirdȱ derȱ Teilȱ desȱ XMLȬDokumentsȱ generiert,ȱ derȱ mitȱ demȱ XMLȬElementȱ Positionenȱ beginntȱ undȱ alleȱ XMLȬElementeȱ enthält,ȱ dieȱ diesemȱXMLȬElementȱhierarchischȱuntergeordnetȱsind.ȱDieȱneuȱhinzukommendenȱ PositionsȬȱ undȱ ArtikeldatenȱwerdenȱinȱderȱLateralȬTabelleȱ XML_PositionȱundȱdeȬ renȱSpalteȱXML_Spalte_PositionȱmitȱAnwendungȱeinerȱkorreliertenȱUnteranfrageȱinȱ FormȱvonȱXMLȬWertenȱgesammelt.ȱȱ DaȱdieȱMultiplizitätȱderȱBeziehungȱnamensȱbetreffenȱzwischenȱPositionȱundȱArtikelȱ vonȱderȱArtȱeinfachȱ(UML:ȱ1)ȱist,ȱgibtȱesȱfürȱeineȱPositionszeileȱgenauȱeineȱArtikelȬ zeile.ȱMitȱHilfeȱdesȱINNERȱJOINȬOperatorsȱinȱZeileȱ(63)ȱwirdȱdeshalbȱeineȱPositiȬ onszeileȱmitȱihrerȱArtikelzeileȱzuȱeinerȱErgebniszeileȱverbunden.ȱDieȱrelationalenȱ Datenȱ einerȱ solchenȱ Ergebniszeileȱ werdenȱ sodannȱ inȱ denȱ Zeilenȱ (42)ȱ bisȱ (59)ȱ inȱ ihreȱkorrespondierendenȱXMLȬElementeȱumgewandelt.ȱAnschließendȱwerdenȱsieȱ inȱderȱLateralȬTabelleȱXML_Positionȱgespeichert.ȱ
81ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ SchließlichȱfasstȱdieȱFunktionȱXMLAGG()ȱinȱZeileȱ(35)ȱdieȱgesammeltenȱXMLȬspeȬ zifischenȱPositionsȬȱundȱArtikeldatenȱzuȱeinemȱXMLȬWertȱzusammenȱundȱordnetȱ diesenȱdemȱXMLȬElementȱPositionenȱinȱZeileȱ(34)ȱzu.ȱ WieȱmanȱimȱProgrammbeispielȱersieht,ȱerfordertȱdieȱHerstellungȱdesȱbereitsȱrechtȱ komplexenȱ XMLȬDokumentesȱ einȱ analogȱ komplexesȱ SQL/XMLȬProgramm.ȱ Esȱ mussȱ nochmalsȱ ausdrücklichȱ empfohlenȱ werden,ȱ beiȱ derȱ Programmniederschriftȱ höchsteȱ Schreibdisziplinȱ waltenȱ zuȱ lassen.ȱ Dieȱ schließendeȱ Argumentklammerȱ sollteȱ sofortȱ zeitlichȱ nachȱ ihrerȱ öffnendenȱ Klammerȱ aufȱ dieȱ Folgezeileȱ unterȱ denȱ Namenȱ derȱ SQL/XMLȬFunktionȱ geschriebenȱ werden.ȱ Dieseȱ einfacheȱ SchreibtechȬ nikȱ bewahrtȱ erfahrungsgemäßȱ vorȱ vielȱ Kummerȱ undȱ unnötigȱ langerȱ EntwickȬ lungszeit.ȱ Ohneȱ dieseȱ Darstellungstechnikȱ desȱ SQLȬCodesȱ istȱ auchȱ eineȱ Pflegeȱ desselbenȱnurȱnochȱunterȱerschwertenȱBedingungenȱmöglich.ȱ Ergebnis + -
-
-
-
+
82ȱ
K002 Herr Georg Mayer Neckarstr. 1 69123 Heidelberg R003 K002 2008-04-05 000005000.00 R003 A001 00001. A001 Computer 000005000.00
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ
4.12.4 XML-Dokument Kundenrechnungen attributzentriert Imȱ folgendenȱ Beispielȱ wirdȱ dargestellt,ȱ wieȱ dasȱ XMLȬDokumentȱ KundenrechnunȬ genȱ inȱ attributzentrierterȱ Formȱ zunächstȱ inȱ derȱ Architekturȱ seinesȱ XMLȬSchemasȱ aussieht,ȱ sieheȱ Abbildungȱ 30.ȱ Anschließendȱ wirdȱ dieserȱ Bauplanȱ inȱ seinȱ korresȬ pondierendesȱ SQL/XMLȬProgrammȱ umgesetzt,ȱ sieheȱ Programmȱ 36:ȱ XMLȬDokuȬ mentȱ undȱ RDBDȱ Kundenrechnungenȱ attributzentriert.ȱ Anȱ beidenȱ SoftwaredokuȬ mentenȱ werdenȱ dieȱ Gemeinsamkeitenȱ undȱ Unterschiedeȱ desȱ elementzentriertenȱ undȱ desȱ attributzentriertenȱ Entwicklungsansatzesȱ inȱ einemȱ komplexerenȱ Umfeldȱ sichtbar.ȱ VergleichtȱmanȱdieȱbeidenȱProgramme,ȱdieȱdenȱelementzentriertenȱundȱdenȱattriȬ butzentriertenȱDokumentenentwurfȱimplementieren,ȱsoȱerkenntȱmanȱderenȱstrukȬ turelleȱ Identität.ȱ Lediglichȱ dieȱ SQL/XMLȬFunktionȱ XMLFOREST()ȱ inȱ Programmȱ 35:ȱKundenrechnungenȱistȱdurchȱdieȱFunktionȱXMLATTRIBUTES()ȱinȱProgrammȱ36:ȱ XMLȬDokumentȱundȱRDBDȱKundenrechnungenȱattributzentriertȱersetztȱworden.ȱ Dasȱ Ergebnisȱ desȱattributzentriertenȱ Programmsȱ istȱ untenȱ dargestellt.ȱ Hierbeiȱistȱ wiederȱderȱKundeȱK002ȱmitȱallȱseinenȱDatenȱexpandiert.ȱDieȱbeidenȱKundenȱK001ȱ undȱK003ȱsindȱkollabiertȱdargestellt.ȱ Ergebnis - + - +
ȱ
83ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Abbildungȱ30:ȱXMLȬDokumentȱundȱRDBDȱKundenrechnungenȱattributzentriertȱ
84ȱ
4.12ȱȱPublikationȱderȱKundenȱundȱihrenȱRechnungenȱ DasȱfolgendeȱProgrammȱ36ȱimplementiertȱdieȱobigeȱArchitektur.ȱ SELECT XMLSERIALIZE( CONTENT XMLDOCUMENT( XMLELEMENT( NAME "Alle_Kunden", XMLAGG(XML_Kunde.XML_Spalte_Kunde ) ) ) AS CLOB INCLUDING XMLDECLARATION ) AS Ergebnis FROM LATERAL (SELECT XMLELEMENT( NAME "Kunde", XMLATTRIBUTES( K.Kunde_Nr AS "Kunde_Nr", K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ), XMLELEMENT( NAME "Rechnungen", (SELECT XMLAGG(XML_Rechnung.XML_Spalte_Rechnung) FROM LATERAL (SELECT XMLELEMENT( NAME "Rechnung", XMLATTRIBUTES( R.Rechnung_Nr AS "Rechnung_Nr", R.Kunde_Nr AS "Kunde_Nr" , R.Datum AS "Datum" , R.Betrag AS "Betrag" ), (SELECT XMLELEMENT( NAME "Positionen", XMLAGG( XML_Position.XML_Spalte_Position ) ) FROM LATERAL (SELECT XMLELEMENT( NAME "Position", XMLATTRIBUTES ( P.Rechnung_Nr AS "Rechnung_Nr", P.Artikel_Nr AS "Artikel_Nr" , P.Anzahl AS "Anzahl" ),
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50)
ȱ
85ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ ȱ
XMLELEMENT( NAME "Artikel", XMLATTRIBUTES( A.Artikel_Nr AS "Artikel_Nr", A.Name AS "Name" , A.Preis AS "Preis" ) )
ȱ ȱ ȱ ȱ ȱ ȱ
) FROM
Position P INNER JOIN Artikel A ON P.Artikel_Nr = A.Artikel_Nr WHERE P.Rechnung_Nr = R.Rechnung_Nr ) AS XML_Position (XML_Spalte_Position)
ȱ ȱ ȱ ȱ ȱ
) ) FROM Rechnung AS R WHERE R.Kunde_Nr = K.Kunde_Nr ) AS XML_Rechnung (XML_Spalte_Rechnung)
ȱ ȱ ȱ
) OPTION EMPTY ON NULL
ȱ
) ) FROM Kunde AS K ) AS XML_Kunde (XML_Spalte_Kunde)
ȱ ȱ ȱ
;
Programmȱ36:ȱXMLȬDokumentȱundȱRDBDȱKundenrechnungenȱattributzentriertȱ
86ȱ
(51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81) (82)
4.13ȱȱPublikationȱRechnungenȱihreȱKundenȱundȱArtikelȱ
4.13 Publikation Rechnungen ihre Kunden und Artikel ImȱfolgendenȱBeispielȱwirdȱdasȱZusammenwirkenȱderȱSQL/XMLȬSprachmittelȱanȱ einerȱ weiterenȱ Aufgabenstellungȱ untersuchtȱ undȱ demonstriert.ȱ Dieȱ Aufgabeȱ beȬ stehtȱdarin,ȱdassȱalleȱRechnungenȱmitȱderenȱKundenȱundȱdenȱhiervonȱbetroffenenȱ Artikelnȱ inȱ einemȱ XMLȬDokumentȱ ausgegebenȱ werden.ȱ Inȱ jedemȱ RechnungsȬ,ȱ KundenȬ,ȱPositionsȬȱundȱArtikelȬXMLȬElementȱsollȱzunächstȱeinȱXMLȬKommentarȱ stehen.ȱDieserȱsollȱdieȱimȱXMLȬElementȱenthaltenenȱInformationenȱkurzȱundȱeinȬ fachȱ lesbarȱ zusammenfassen.ȱ Weiterhinȱ sollȱ esȱ dreiȱ Namensräumeȱ geben,ȱ denȱ NamensraumȱdesȱKundenvokabulars,ȱdenȱdesȱRechnungsvokabularsȱundȱdenȱdesȱ Artikelvokabulars.ȱ Dasȱ zuȱ erzeugendeȱ XMLȬDokumentȱ sollȱ imȱ gemischtenȱ EntȬ wicklungsansatzȱentworfenȱundȱimplementiertȱwerden.ȱHierbeiȱsollenȱdieȱPrimärȬ schlüsselȱ alsȱ XMLȬAttributeȱ undȱ dieȱ Nichtschlüsselȱ alsȱ XMLȬElementeȱ imȱ DokuȬ mentȱerscheinen.ȱ Dieȱ Architekturȱ desȱ zuȱ erzeugendenȱ XMLȬDokumentesȱ istȱ inȱ derȱ folgendenȱ Abbildungȱ31:ȱXMLȬSchemaȬModellȱRechnungenȱihreȱKundenȱundȱArtikelȱdargestellt.ȱ BeiȱderȱDarstellungȱmussteȱderȱbeschränkteȱPlatzȱaufȱeinerȱBuchseiteȱberücksichȬ tigtȱwerden.ȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
87ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ Abbildungȱ31:ȱXMLȬSchemaȬModellȱRechnungenȱihreȱKundenȱundȱArtikelȱ
88ȱ
4.13ȱȱPublikationȱRechnungenȱihreȱKundenȱundȱArtikelȱ DieȱImplementierungȱdesȱXMLȬSchemaȬModellsȱmitȱSprachmittelnȱvonȱSQL/XMLȱ zeigtȱdasȱfolgendeȱProgrammȱ37.ȱ ȱ SELECT ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
XMLSERIALIZE( CONTENT XMLDOCUMENT( XMLELEMENT( NAME "Rechnungen", XMLNAMESPACES( 'http://www.Alfred-Moos.de/Kunde' AS "Ku", 'http://www.Alfred-Moos.de/Artikel' AS "Ar", DEFAULT 'http://www.Alfred-Moos.de/Rechnung' ), XMLAGG(XML_Rechnung.XML_Spalte_Rechnung ) ) ) AS CLOB INCLUDING XMLDECLARATION ) AS Ergebnis FROM LATERAL (SELECT XMLELEMENT( NAME "Rechnung", XMLNAMESPACES( 'http://www.Alfred-Moos.de/Kunde' AS "Ku", 'http://www.Alfred-Moos.de/Artikel' AS "Ar", DEFAULT 'http://www.Alfred-Moos.de/Rechnung' ), XMLATTRIBUTES(R.Rechnung_Nr AS "Rechnung_Nr" ), XMLCOMMENT( 'Daten von Rechnung ' || R.Rechnung_Nr || ': ' || R.Kunde_Nr || ', ' || CHAR(R.Datum, EUR) || ', ' || CHAR(R.Betrag) ), XMLFOREST(R.Kunde_Nr AS "Ku:Kunde_Nr", R.Datum AS "Datum" , R.Betrag AS "Betrag" ), (SELECT XMLELEMENT( NAME "Ku:Kunde", XMLATTRIBUTES( K.Kunde_Nr AS "Ku:Kunde_Nr" ), XMLCOMMENT( 'Daten von Kunde ' || K.Kunde_Nr || ': ' || K.Anrede || ', ' || TRIM(K.Vorname) || ', ' || TRIM(K.Zuname) || ', ' || TRIM(K.Strasse) || ', ' || K.PLZ || ', ' || TRIM(K.Ort) ),
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47)
ȱ ȱ ȱ
89ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
90ȱ
XMLFOREST( K.Anrede K.Vorname K.Zuname K.Strasse K.PLZ K.Ort )
AS AS AS AS AS AS
"Ku:Anrede" , "Ku:Vorname", "Ku:Zuname" , "Ku:Strasse", "Ku:PLZ" , "Ku:Ort"
) FROM Kunde K WHERE K.Kunde_Nr = R.Kunde_Nr
), XMLELEMENT( NAME "Positionen", (SELECT XMLAGG( XML_Position.XML_Spalte_Position ) FROM LATERAL (SELECT XMLELEMENT( NAME "Position", XMLATTRIBUTES( P.Rechnung_Nr AS "Rechnung_Nr", P.Artikel_Nr AS "Ar:Artikel_Nr" ), XMLCOMMENT( 'Daten von Position ' || P.Rechnung_Nr || ' ' || P.Artikel_Nr || ': ' || CHAR(P.Anzahl) ), XMLFOREST( P.Anzahl AS "Anzahl" ), (SELECT XMLELEMENT( NAME "Ar:Artikel", XMLATTRIBUTES( A.Artikel_Nr AS "Ar:Artikel_Nr" ), XMLCOMMENT( 'Daten von Artikel ' || A.Artikel_Nr || ': ' || TRIM(A.Name) || ', ' || CHAR(A.Preis) ),
(48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81) (82) (83) (84) (85) (86) (87) (88) (89) (90) (91) (92) (93) (94) (95) (96)
4.13ȱȱPublikationȱRechnungenȱihreȱKundenȱundȱArtikelȱ
)
XMLFOREST( A.Name AS "Ar:Name", A.Preis AS "Ar:Preis" ) FROM Artikel A WHERE A.Artikel_Nr = P.Artikel_Nr
)
) ) FROM Position P WHERE P.Rechnung_Nr = R.Rechnung_Nr ) AS XML_Position (XML_Spalte_Position)
)
;
) FROM Rechnung R ) AS XML_Rechnung (XML_Spalte_Rechnung)
(97) (98) (99) (100) (101) (102) (103) (104) (105) (106) (107) (108) (109) (110) (111) (112) (113) (114) (115)
Programmȱ37:ȱRechnungenȱihreȱKundenȱundȱArtikelȱ
Dieȱ Deklarationȱ derȱ Namensräumeȱ mussȱ zweimalȱ erfolgen.ȱ Dasȱ eineȱ Mal,ȱ damitȱ inȱ dasȱ XMLȬElementȱ Rechnungenȱ dieȱ Namensraumdeklarationenȱ XMLȬkonformȱ eingefügtȱwerden,ȱsieheȱProgrammzeileȱ(4)ȱbisȱ(8).ȱDasȱzweiteȱMal,ȱdamitȱdieȱNaȬ mensraumpräfixeȱ imȱ Sichtbarkeitsbereichȱ derȱ weiterenȱ SQL/XMLȬFunktionsaufȬ rufeȱliegen,ȱsieheȱProgrammzeileȱ(16)ȱbisȱ(20).ȱ Dasȱ schemakonformeȱ XMLȬDokument,ȱ dasȱ vonȱ obigemȱ Programmȱ generiertȱ wurde,ȱsiehtȱdannȱwieȱfolgtȱaus.ȱLediglichȱdieȱRechnungȱR003ȱwirdȱuntenȱaufgeȬ listetȱumȱdieȱLängeȱdesȱDokumentesȱzuȱreduzieren.ȱDieȱanderenȱRechnungenȱsindȱ kollabiert.ȱ Ergebnis - + + K002 2008-04-05 000005000.00 Herr Georg Mayer
91ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ Neckarstr. 1 69123 Heidelberg 00001. Computer 000005000.00
4.14 Übungen GehenȱSieȱbeiȱderȱLösungȱderȱfolgendenȱÜbungenȱarchitekturgetriebenȱvor,ȱindemȱ SieȱzuerstȱdasȱModellȱdesȱzuȱgenerierendenȱXMLȬDokumentesȱerstellenȱundȱerstȱ dannȱdieȱImplementierungȱmitȱSQL/XMLȱvornehmen.ȱ JedesȱXMLȬDokumentȱmussȱmitȱeinerȱXMLȬDeklarationsanweisungȱbeginnen.ȱ 1) GebenȱSieȱdenȱArtikelȱA001ȱinȱelementzentrierterȱDarstellungȱaus.ȱȱ 2) GebenȱSieȱalleȱArtikelȱinȱelementzentrierterȱDarstellungȱaus.ȱ 3) GebenȱSieȱdenȱArtikelȱA001ȱinȱattributzentrierterȱDarstellungȱaus.ȱ 4) GebenȱSieȱalleȱArtikelȱinȱattributzentrierterȱDarstellungȱaus.ȱ 5) Gebenȱ Sieȱ alleȱ Artikelȱ inȱ gemischterȱ Darstellungȱ aus.ȱ Dieȱ Artikelnummerȱ istȱ Attribut.ȱ 6) Gebenȱ Sieȱ denȱ Artikelȱ A001ȱ undȱ dieȱ vonȱ ihmȱ abhängigenȱ Positionenȱ inȱ eleȬ mentzentrierterȱDarstellungȱaus.ȱ 7) GebenȱSieȱalleȱArtikelȱundȱdieȱvomȱjeweiligenȱArtikelȱabhängigenȱPositionenȱ inȱelementzentrierterȱDarstellungȱaus.ȱ 8) GebenȱSieȱdenȱArtikelȱA001,ȱdieȱvonȱihmȱabhängigenȱPositionenȱundȱdieȱvonȱ derȱjeweiligenȱPositionȱabhängigeȱRechnungȱinȱelementzentrierterȱDarstellungȱ aus.ȱ 9) GebenȱSieȱalleȱArtikel,ȱdieȱvonȱdiesenȱabhängigenȱPositionenȱundȱdieȱvonȱderȱ jeweiligenȱPositionȱabhängigeȱRechnungȱinȱelementzentrierterȱDarstellungȱaus.ȱ 10) GebenȱSieȱdenȱArtikelȱA001,ȱdieȱvonȱihmȱabhängigenȱPositionenȱundȱdieȱvonȱ derȱ jeweiligenȱ Positionȱ abhängigeȱ Rechnungȱ undȱ denȱ vonȱ derȱ jeweiligenȱ RechnungȱabhängigenȱKundenȱinȱelementzentrierterȱDarstellungȱaus.ȱ
92ȱ
4.14ȱȱÜbungenȱ 11) GebenȱSieȱalleȱArtikel,ȱdieȱvonȱihnenȱabhängigenȱPositionenȱundȱdieȱvonȱderȱ jeweiligenȱ Positionȱ abhängigeȱ Rechnungȱ undȱ denȱ vonȱ derȱ jeweiligenȱ RechȬ nungȱabhängigenȱKundenȱinȱelementzentrierterȱDarstellungȱaus.ȱ 12) GebenȱSieȱdieȱRechnungȱR001,ȱihrenȱKunden,ȱihreȱPositionenȱundȱderenȱArtiȬ kelȱinȱelementzentrierterȱFormȱaus.ȱ 13) GebenȱSieȱdieȱRechnungȱR001,ȱihrenȱKunden,ȱihreȱPositionenȱundȱderenȱArtiȬ kelȱinȱattributzentrierterȱFormȱaus.ȱ 14) GebenȱSieȱdieȱRechnungȱR001,ȱihrenȱKunden,ȱihreȱPositionenȱundȱderenȱArtiȬ kelȱ inȱ gemischterȱ Formȱ aus.ȱ Dieȱ jeweiligenȱ Schlüsselȱ –ȱ PrimärȬȱ undȱ FremdȬ schlüsselȱ–ȱsollenȱAttributeȱsein.ȱ 15) Gebenȱ Sieȱ denȱ Kundenȱ K001ȱ mitȱ seinenȱ Rechnungen,ȱ derenȱ Positionenȱ undȱ denȱbetroffenenȱArtikelnȱinȱelementzentrierterȱFormȱaus.ȱZuȱBeginnȱeinesȱjeȬ denȱElementesȱistȱeinȱKommentarȱeinzufügen,ȱderȱdenȱElementwertȱzusätzlichȱ alsȱKommentarȱangibt.ȱ 16) Gebenȱ Sieȱ denȱ Kundenȱ K001ȱ mitȱ seinenȱ Rechnungen,ȱ derenȱ Positionenȱ undȱ denȱ betroffenenȱ Artikelnȱ inȱ elementzentrierterȱ Formȱ aus.ȱ Dieȱ XMLȬ spezifischenȱ Vokabelnȱ derȱ Kundendatenȱ stammenȱ ausȱ demȱ Namensraumȱ http://www.AlfredȬMoos.de/Kunde.ȱ Dieȱ Vokabelnȱ derȱ Rechnungsdatenȱ sindȱ imȱ Namensraumȱ http://www.AlfredȬMoos.de/Rechnungȱ definiert.ȱ Dieȱ VokaȬ belnȱ derȱ PositionsȬȱ undȱ Artikeldatenȱ stammenȱ ausȱ denȱ Namensräumenȱ http://www.AlfredȬMoos.de/Positionȱundȱhttp://www.AlfredȬMoos.de/Artikel.ȱ 17) GebenȱSieȱalleȱKundenȱmitȱihrenȱRechnungen,ȱderenȱPositionenȱundȱdenȱ beȬ troffenenȱArtikelnȱinȱelementzentrierterȱFormȱaus.ȱDieȱXMLȬspezifischenȱVoȬ kabelnȱderȱKundendatenȱstammenȱausȱdemȱNamensraumȱhttp://www.AlfredȬ Moos.de/Kunde.ȱ Dieȱ Vokabelnȱ derȱ Rechnungsdatenȱ sindȱ imȱ Namensraumȱ http://www.AlfredȬMoos.de/Rechnungȱ definiert.ȱ Dieȱ Vokabelnȱderȱ PositionsȬȱ undȱ Artikeldatenȱ stammenȱ ausȱ denȱ Namensräumenȱ http://www.AlfredȬ Moos.de/Positionȱundȱhttp://www.AlfredȬMoos.de/Artikel.ȱ 18) GebenȱSieȱalleȱKundenȱmitȱihrenȱRechnungen,ȱderenȱPositionenȱundȱdenȱbeȬ troffenenȱ Artikelnȱ inȱ gemischterȱ Formȱ aus.ȱ Dieȱ XMLȬspezifischenȱ Vokabelnȱ derȱ Kundendatenȱ stammenȱ ausȱ demȱ Namensraumȱ http://www.AlfredȬ Moos.de/Kunde.ȱ Dieȱ Vokabelnȱ derȱ Rechnungsdatenȱ sindȱ imȱ Namensraumȱ http://www.AlfredȬMoos.de/Rechnungȱ definiert.ȱ Dieȱ Vokabelnȱ derȱ PositionsȬȱ undȱ Artikeldatenȱ stammenȱ ausȱ denȱ Namensräumenȱ http://www.AlfredȬ Moos.de/Positionȱundȱhttp://www.AlfredȬMoos.de/Artikel.ȱ 19) GebenȱSieȱalleȱKundenȱmitȱihrenȱRechnungen,ȱderenȱPositionenȱundȱdenȱbeȬ troffenenȱ Artikelnȱ inȱ elementzentrierterȱ Formȱ aus.ȱ Kommentierenȱ Sieȱ jedesȱ XMLȬElementȱ mitȱ einemȱ inȱ ihmȱ stehendenȱ XMLȬKommentar.ȱ Versehenȱ Sieȱ dasȱWurzelelementȱmitȱeinemȱVerarbeitungshinweisȱfürȱdieȱXMLȬParser.ȱ
93ȱ
4ȱȱPublikationȱrelationalerȱDatenȱ 20) Beschreibenȱ Sie,ȱ wasȱ manȱ inȱ XMLȱ unterȱ einerȱ Entitätȱ (entity)ȱ versteht.ȱ UntersuchenȱsieȱderenȱVerwendungȱanȱeinemȱBeispiel,ȱdasȱSieȱvomȱInternetȬ ExplorerȱderȱFirmaȱMicrosoftȱoderȱeinemȱvergleichbarenȱWerkzeugȱdarstellenȱ lassen.ȱ ȱ
94ȱ
5 XML-Dokumente relational speichern InȱdiesemȱKapitelȱlernenȱSie,ȱ – wieȱeineȱTabelleȱmitȱSpaltenȱvomȱDatentypȱXMLȱangelegtȱwirdȱ – wieȱeinȱXMLȬDokumentȱalsȱeinȱrelationalerȱXMLȬWertȱgespeichertȱwird.ȱ Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ sodannȱ beliebigȱ komplexeȱ XMLȬ DokumenteȱalsȱGanzesȱspeichern.ȱ
5.1 Spalte vom Datentyp XML vereinbaren Dieȱ Vereinbarungȱ einerȱ relationalenȱ Tabelleȱ mitȱ Spaltenȱ vomȱ Datentypȱ XMLȱ istȱ sehrȱeinfach.ȱZurȱDemonstrationȱvereinbarenȱwirȱdieȱTabelleȱXML_Kundeȱmitȱderȱ herkömmlichenȱPrimärschlüsselspalteȱKunde_NrȱundȱeinerȱSpalteȱmitȱdemȱNamenȱ XML_Dokument.ȱ Kunde_Nrȱ sollȱ wiederȱ vomȱ Datentypȱ CHARȱ (4)ȱ sein.ȱ Dieȱ Spalteȱ XML_DokumentȱistȱvomȱDatentypȱXML.ȱȱ Eineȱ XMLȬSpalteȱ kannȱ wederȱ eineȱ PrimärȬȱ nochȱ eineȱ Fremdschlüsselspalteȱ sein.ȱ AuchȱkannȱfürȱeineȱXMLȬSpalteȱkeinȱDefaultȬWertȱangegebenȱwerden.ȱEineȱXMLȬ Spalteȱ hatȱ keineȱ Größenbegrenzung.ȱ Wirdȱ einȱ XMLȬWertȱ inȱ einenȱ CLOBȬWertȱ konvertiert,ȱ kannȱ dieserȱ Ergebniswertȱ inȱ DB2ȱ Versionȱ 9.5ȱ jedochȱ nurȱ zweiȱ GigaȬ byteȱ Platzȱ belegen.ȱ Hiermitȱ istȱindirektȱ eineȱ Größenbegrenzungȱgegeben.ȱ Dieȱ inȬ ternenȱ XMLȬWerteȱ werdenȱ nichtȱ imȱ relationalenȱ Tabellenspeicherȱ sondernȱ imȱ XMLȬSpeicherȱabgelegt,ȱsieheȱauchȱAbbildungȱ16:ȱStrukturȱdesȱDatenbanksystemsȱ DB2ȱV9.5.ȱ Imȱ Zugeȱ derȱ vonȱ unsȱ praktiziertenȱ architekturgetriebenenȱ Softwareentwicklungȱ erstellenȱ wirȱ zunächstȱ dasȱ Modellȱ derȱ Tabelleȱ XML_Kundeȱ bevorȱ wirȱ sieȱ mitȱ SQL/XMLȱimplementieren.ȱ ȱ ȱ ȱ ȱ
«table» XML_Kunde Kunde_Nr : CHAR(4) XML_Dokument : XML
ȱ
Abbildungȱ32:ȱRelationstypȱmitȱeinerȱSpalteȱvomȱDatentypȱXMLȱ
ȱ 95
5ȱȱXMLȬDokumenteȱrelationalȱspeichernȱ Dieȱ Implementierungȱ derȱ Relationȱ XML_Kundeȱ istȱ sehrȱ einfach.ȱ Eineȱ Spalteȱ vomȱ Datentypȱ XMLȱ wirdȱ hierbeiȱ lediglichȱ mitȱ demȱ Datentypbezeichnerȱ XMLȱ ausgeȬ zeichnet,ȱsieheȱProgrammzeileȱ(5).ȱ CREATE TABLE XML_Kunde (Kunde_Nr CHAR (4) NOT NULL PRIMARY KEY, XML_Dokument XML ) ;
(1) (2) (3) (4) (5) (6) (7)
Programmȱ38:ȱVereinbarungȱeinerȱTabelleȱmitȱeinerȱXMLȬSpalteȱ
5.2 XML-Daten in Spalte vom Datentyp XML laden Inȱ eineȱ Spalteȱ vomȱ Datentypȱ XMLȱ könnenȱ nurȱ wohlgeformteȱ XMLȬDokumenteȱ gespeichertȱwerden.ȱEinȱsolchesȱDokumentȱwirdȱinternȱcodiertȱalsȱeinȱDatenbaumȱ inȱGestaltȱeinesȱXDMȬObjektesȱ(XQueryȱDataȱModelȬObjekt)ȱhinterlegt.ȱExternȱkannȱ dasȱ XMLȬDokumentȱ inȱ seinerȱ zeichenartigenȱ Gestaltȱ abgeliefertȱ werden.ȱ Imȱ folȬ gendenȱBeispielȱladenȱwirȱeinȱXMLȬDokument,ȱdasȱdenȱKundenȱK001ȱinȱeinfachsȬ terȱFormȱbeschreibt.ȱDasȱDokumentexemplarȱsiehtȱinȱUMLȱwieȱfolgtȱaus.ȱ ȱ ȱ
«Document» K001:XML_Dokument
ȱ
1
ȱ ȱ
«Element» Kunde
ȱ
Kunde_Nr = K001
ȱ
1
«Element» Name
1
«Element» Vorname
1
«Element» Zuname
1 1
«Textk» Hugo «Textk» Mueller
ȱ
Abbildungȱ33:ȱDokumentenexemplarȱüberȱKundeȱK001ȱ
ImȱfolgendenȱProgrammȱwirdȱdasȱzuȱladendeȱXMLȬDokumentȱalsȱZeichenkettenȬ ausdruckȱ angeliefert.ȱ Erȱ erstrecktȱ sichȱ vonȱ derȱ Programmzeileȱ (4)ȱ bisȱ (9).ȱ Damitȱ dasȱ XMLȬDokumentȱ gutȱ lesbarȱ ist,ȱ sindȱ seineȱ Bestandteileȱ ästhetischȱ eingerücktȱ undȱuntereinanderȱgeschrieben.ȱȱ VomȱDatenbankprozessorȱwirdȱdiesesȱzeichenartigeȱXMLȬDokumentȱimplizitȱaufȱ Gültigkeitȱgeprüftȱ(engl.ȱtoȱparse,ȱtoȱvalidate),ȱinȱseineȱinternȱcodierteȱXDMȬFormȱ konvertiertȱundȱinȱdieȱSpalteȱXML_Dokumentȱgespeichert.ȱ ȱ ȱ
96ȱ
5.2ȱȱXMLȬDatenȱinȱSpalteȱvomȱDatentypȱXMLȱladenȱ INSERT INTO XML_Kunde (Kunde_Nr, XML_Dokument) VALUES ('K001', ' ' ' Hugo ' Mueller ' '' ) ;
' ' ' ' '
|| || || || ||
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
Programmȱ39:ȱLadeprogrammȱfürȱXMLȬDokumentȱdesȱKundenȱK001ȱmitȱimpliziterȱGülȬ tigkeitsprüfungȱ
Dieȱ Prüfungȱ aufȱ Gültigkeitȱ kannȱ auchȱ mitȱ derȱ eingebautenȱ SQL/XMLȬFunktionȱ XMLPARSE()ȱexplizitȱdurchgeführtȱwerden.ȱ DieȱSyntaxȱvonȱXMLPARSE()ȱlautetȱfolgendermaßen.ȱ ȱ ȱ ȱ
XMLPARSE( DOCUMENT Zeichenkettenausdruck {STRIP WHITESPACE | PRESERVE WHITESPACE} )
Syntaxȱ15:ȱSQL/XMLȬFunktionȱXMLPARSE()ȱ
Dieȱ Syntaxȱ besagt,ȱ dassȱ dasȱ XMLȬDokumentȱ alsȱ Zeichenkettenausdruckȱ angelieȬ fertȱ werdenȱ muss.ȱ Dieȱ Notationskonstanteȱ DOCUMENTȱ erinnertȱ daran,ȱ dassȱ esȱ wohlgeformtȱseinȱmuss.ȱDieȱsoȱgenanntenȱwhiteȱspaces,ȱdasȱsindȱȱ – – – –
mehrereȱLeerzeichenȱnacheinanderȱ TabulatorȬSteuerzeichenȱ WagenrücklaufȬSteuerzeichenȱundȱ NeueȬZeileȬSteuerzeichenȱ
werdenȱ standardmäßigȱdurchȱ einȱLeerzeichenȱ ersetztȱ (STRIPȱ WHITESPACE).ȱ Istȱ dieseȱ Dienstleistungȱ nichtȱ gewünscht,ȱ soȱ mussȱ manȱ dieȱ Klauselȱ RESERVEȱ WHIȬ TESPACEȱalternativȱeinsetzten.ȱ
97ȱ
5ȱȱXMLȬDokumenteȱrelationalȱspeichernȱ DasȱLadeprogrammȱmitȱderȱFunktionȱXMLPARSE()ȱsiehtȱwieȱfolgtȱaus.ȱ INSERT INTO XML_Kunde (Kunde_Nr, XML_Dokument) VALUES ('K001', XMLPARSE( DOCUMENT ' ' ' Hugo ' Mueller ' '' ) ) ;
' ' ' ' '
|| || || || ||
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ40:ȱLadeprogrammȱfürȱXMLȬDokumentȱdesȱKundenȱK001ȱmitȱexpliziterȱGülȬ tigkeitsprüfungȱ
Dasȱ geladeneȱ XMLȬDokumentȱ kannȱ sehrȱ einfachȱ ausgegebenȱ werden.ȱ Amȱ einȬ fachstenȱ istȱ dieȱ impliziteȱ Serialisierung.ȱ Hierbeiȱ wirdȱ lediglichȱ derȱ Nameȱ derȱ XMLȬSpalteȱ inȱ derȱ Projektionsklauselȱ desȱ Befehlsȱ SELECTȱ angegeben,ȱ sieheȱ ProȬ grammzeileȱ(1)ȱvonȱProgrammȱ41.ȱȱ Zumȱ selbenȱ Ergebnisȱ führtȱ derȱ Einsatzȱ derȱ eingebautenȱ SQL/XMLȬFunktionȱ XMLSERIALIZE(),ȱ mitȱ derȱ dieȱ gewohnteȱ expliziteȱ Serialisierungȱ inȱ einenȱ geȬ wünschtenȱtextartigenȱexternenȱDatentypȱgesteuertȱwird,ȱsieheȱZeileȱ(5)ȱbisȱ(7).ȱ SELECT XML_Dokument FROM XML_Kunde ; SELECT XMLSERIALIZE( XML_Dokument AS CLOB ) FROM XML_Kunde ;
Programmȱ41:ȱImpliziteȱundȱexpliziteȱSerialisierungȱdesȱXMLȬWertes Ergebnis - Hugo Mueller
ȱ
98ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9)
5.3ȱȱKundendatenȱvomȱDatentypȱXMLȱladenȱ Auchȱ dieȱ eingebauteȱ SQL/XMLȬFunktionȱ XMLCAST()ȱ kannȱ zurȱ Konvertierungȱ desȱ XMLȬWertesȱ angewendetȱ werden.ȱ XMLCAST()ȱ entnimmtȱ demȱ XMLȬDokuȬ mentȱ jedochȱ nurȱ dieȱ Werteȱ derȱ XMLȬElementeȱ undȱ fügtȱ sieȱ zuȱ einemȱ ZeichenȬ kettenwertȱzusammen.ȱ ȱ SELECT XMLCAST(XML_Dokument AS CHAR(15)) AS Ergebnis FROM XML_Kunde ;
(1) (2) (3)
Programmȱ42:ȱKonvertierungȱdesȱXMLȬWertesȱinȱeinenȱZeichenkettenwertȱ
Ergebnis ERGEBNIS ––––––––––––––– HugoMueller
5.3 Kundendaten vom Datentyp XML laden ImȱvorherigenȱBeispielȱhabenȱwirȱeinȱsehrȱeinfachesȱXMLȬDokumentȱinȱdieȱSpalteȱ XML_Dokumentȱ geladen.ȱ Hierbeiȱ wurdeȱ dieȱ grundsätzlicheȱ Funktionalitätȱ vonȱ SQL/XMLȱ fürȱ dasȱ Ladenȱ vonȱ XMLȬDokumentenȱ geklärt.ȱ Imȱ nunȱ folgendenȱ BeiȬ spielȱwerdenȱwirȱdasȱXMLȬDokumentȱinȱdieȱSpalteȱXML_Dokumentȱladen,ȱdasȱdenȱ Kundenȱ K001,ȱ Hugoȱ Müller,ȱ beschreibt.ȱ Seinȱ XMLȬSchemaȬModellȱ basiertȱ aufȱ Abbildungȱ 29:ȱ XMLȬDokumentȱ undȱ RDBDȱ Kundenrechnungen.ȱ Dasȱ dortigeȱ WurȬ zelelementȱ Alle_Kundenȱ wirdȱ weggelassen.ȱ Dasȱ neueȱ Wurzelelementȱ istȱ sodannȱ dasȱXMLȬElementȱKunde,ȱsieheȱAbbildungȱ34.ȱȱ DasȱXMLȬDokumentȱgenerierenȱwirȱausȱdenȱbekanntenȱrelationalenȱDaten.ȱDaȱdasȱ ErgebnisȱdesȱGenerierungsprozessesȱnichtȱalsȱeinȱexternȱlesbares,ȱzeichenförmigesȱ XMLȬDokumentȱ benötigtȱ wird,ȱ sondernȱ nurȱ inȱ seinerȱ internȱ codiertenȱ Formȱ inȱ GestaltȱeinesȱXDMȬObjektes,ȱverzichtenȱwirȱaufȱdieȱSerialisierung.ȱDasȱinternȱcoȬ dierteȱXDMȬObjektȱspeichernȱwirȱsomitȱunmittelbarȱalsȱXDMȬBaumȱinȱdieȱSpalteȱ XML_Dokument.ȱ Wegenȱ derȱ hohenȱ strukturellenȱ Ähnlichkeitȱ desȱ neuenȱ XMLȬ SchemasȱmitȱdemȱSchemaȱaufȱSeiteȱ79ȱhatȱauchȱdasȱerforderlicheȱLadeprogrammȱ großeȱ Ähnlichkeitenȱ mitȱ demȱ Publikationsprogrammȱ Programmȱ 35:ȱ KundenrechȬ nungen.ȱȱ ȱ ȱ ȱ ȱ
99ȱ
5ȱȱXMLȬDokumenteȱrelationalȱspeichernȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ34:ȱXMLȬSchemaȬModellȱKundenrechnungȱ
100ȱ
5.3ȱȱKundendatenȱvomȱDatentypȱXMLȱladenȱ Dasȱ folgendeȱ SQL/XMLȬProgrammȱ lädtȱ dasȱ XMLȬDokumentȱ inȱ seinerȱ internenȱ XDMȬFormȱinȱdieȱSpalteȱXML_DokumentȱderȱTabelleȱXML_Kunde.ȱAlsȱerstesȱProȬ jektionselementȱ inȱ derȱ Programmzeileȱ (4)ȱ wirdȱ derȱ Primärschlüsselwertȱ K001ȱ anȱ denȱ Ladeprozessȱ übergeben.ȱ Ihmȱ folgtȱ dasȱ XMLȬDokumentȱ inȱ seinerȱ internenȱ FormȱinȱGestaltȱeinesȱXDMȬBaumes,ȱderȱabȱProgrammzeileȱ(5)ȱgeneriertȱwird.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
INSERT INTO XML_Kunde (Kunde_Nr, XML_Dokument) SELECT 'K001', XMLDOCUMENT( XML_Kunde.XML_Spalte_Kunde ) FROM LATERAL (SELECT XMLELEMENT( NAME "Kunde", XMLFOREST( K.Kunde_Nr AS "Kunde_Nr", K.Anrede AS "Anrede" , K.Vorname AS "Vorname" , K.Zuname AS "Zuname" , K.Strasse AS "Strasse" , K.PLZ AS "PLZ" , K.Ort AS "Ort" ), XMLELEMENT( NAME "Rechnungen", (SELECT XMLAGG(XML_Rechnung.XML_Spalte_Rechnung) FROM LATERAL (SELECT XMLELEMENT( NAME "Rechnung", XMLFOREST( R.Rechnung_Nr AS "Rechnung_Nr", R.Kunde_Nr AS "Kunde_Nr" , R.Datum AS "Datum" , R.Betrag AS "Betrag" ), (SELECT XMLELEMENT( NAME "Positionen", XMLAGG( XML_Position.XML_Spalte_Position) ) FROM LATERAL (SELECT XMLELEMENT( NAME "Position", XMLFOREST ( P.Rechnung_Nr AS "Rechnung_Nr", P.Artikel_Nr AS "Artikel_Nr" , P.Anzahl AS "Anzahl" ),
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47)
ȱ ȱ
101ȱ
5ȱȱXMLȬDokumenteȱrelationalȱspeichernȱ ȱ ȱ ȱ ȱ ȱ ȱ ) FROM
ȱ
Position P INNER JOIN Artikel A ON P.Artikel_Nr = A.Artikel_Nr WHERE P.Rechnung_Nr = R.Rechnung_Nr ) AS XML_Position (XML_Spalte_Position)
ȱ ȱ ȱ ȱ
) ) FROM Rechnung AS R WHERE R.Kunde_Nr = K.Kunde_Nr ) AS XML_Rechnung (XML_Spalte_Rechnung)
ȱ ȱ ȱ
) OPTION EMPTY ON NULL
ȱ
) ) FROM Kunde AS K WHERE K.Kunde_Nr = 'K001' ) AS XML_Kunde (XML_Spalte_Kunde)
ȱ ȱ ȱ ȱ
XMLELEMENT( NAME "Artikel", XMLFOREST( A.Artikel_Nr AS "Artikel_Nr", A.Name AS "Name" , A.Preis AS "Preis" ) )
;
(48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80)
Programmȱ43:ȱGenerierungȱdesȱXMLȬDokumentesȱKundenrechnungȱfürȱKundeȱK001ȱ
Inȱ Programmzeileȱ (78)ȱ werdenȱ dieȱ Datenȱ fürȱ denȱ Kundenȱ K001ȱ ausȱ derȱ Tabelleȱ Kundeȱselektiert.ȱ ImȱfolgendenȱProgrammȱwerdenȱdieȱgeladenenȱDatenȱdesȱXMLȬDokumentesȱexȬ plizitȱ serialisiertȱ undȱ inȱZeichenformȱausgegeben.ȱ Dabeiȱ wirdȱ nochȱ inȱ derȱerstenȱ ZeileȱdesȱXMLȬDokumentesȱdieȱXMLȬDeklarationȱgeneriert,ȱsieheȱProgrammzeileȱ (3).ȱ SELECT XMLSERIALIZE( CONTENT XML_Dokument AS CLOB INCLUDING XMLDECLARATION ) FROM XML_Kunde WHERE Kunde_Nr = 'K001' ;
Programmȱ44:ȱAusgabeȱdesȱgeladenenȱXMLȬDokumentesȱinȱZeichenform
102ȱ
(1) (2) (3) (4) (5) (6) (7)
5.4ȱȱÜbungenȱ Ergebnis - K001 Herr Hugo Mueller Gartenstr. 4a 69123 Heidelberg R001 K001 2008-04-04 000013000.00 R001 A001 00002. A001 Computer 000005000.00 R001 A002 00003. A002 Drucker 000001000.00 +
5.4 Übungen Gehenȱ Sieȱ beiȱ derȱ Lösungȱ derȱ folgendenȱ Übungȱ architekturgetriebenȱ vor,ȱ indemȱ Sieȱ zuerstȱ dasȱ Modellȱ desȱ XMLȬDokumentesȱ erstellenȱ undȱ erstȱ dannȱ dieȱ ImpleȬ mentierungȱ mitȱ SQL/XMLȱ vornehmen.ȱ Jedesȱ XMLȬDokumentȱ mussȱ mitȱ einerȱ XMLȬDeklarationsanweisungȱbeginnen.ȱ 1) Ladenȱ Sieȱ alleȱ Artikelȱ inȱ elementzentrierterȱ Darstellungȱ inȱ dieȱ Spalteȱ DokuȬ mentȱderȱTabelleȱArtikel_XML.ȱ ȱ
103ȱ
6 XML-Daten manipulieren – XQuery InȱdiesemȱKapitelȱlernenȱSieȱ – dieȱSprachkonzepteȱvonȱXQueryȱ – denȱEinsatzȱderȱSprachelementeȱvonȱXQueryȱundȱ – wieȱDatenȱinȱeinemȱXMLȬDokumentȱgelesenȱwerden.ȱ Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ sodannȱ inȱ beliebigȱ komplexenȱ XMLȬ DokumentenȱnavigierenȱundȱderenȱDatenȱmitȱderȱSpracheȱXQueryȱverarbeiten.ȱ
6.1 Die Sprache XQuery DieȱSpracheȱXQueryȱ(engl.ȱXMLȱQueryȱLanguage)ȱistȱeineȱfunktionaleȱSprache.ȱSieȱ wurdeȱ vomȱ WorldȱWideȱWebȱConsortiumȱ (W3C)ȱ definiert.ȱ Ihrȱ primäresȱ EinsatzgeȬ bietȱ istȱ dieȱ Verarbeitungȱ vonȱ XMLȬDatenȱ inȱ internȱ codiertenȱ XMLȬDokumenten,ȱ dieȱ inȱ DB2ȱ inȱ Gestaltȱ vonȱ XDMȬObjektenȱ (XDM:ȱ XQueryȱDataȱModel)ȱ vorliegen.ȱ EinȱsolchesȱXDMȬObjektȱwirdȱalsȱEintragȱinȱeinerȱSequenzȱgespeichert.ȱ
6.1.1 Das Datenmodell von XQuery – Einführung DasȱDatenmodellȱvonȱXQuery,ȱdasȱXQueryȱDataȱModel,ȱabgekürztȱdasȱXDM,ȱbautȱ aufȱ derȱ Sequenzȱ auf.ȱ Eineȱ Sequenzȱ (engl.ȱ sequence)ȱ istȱ eineȱ Sammlungȱ einzelnerȱ Werte.ȱ Inȱ ihrȱ herrschtȱ dieȱ serielleȱ Zugangsordnung.ȱ Derȱ Eintragȱ (engl.ȱ item),ȱ derȱ alsȱersterȱinȱdieȱSequenzȱeingestelltȱwurde,ȱwirdȱauchȱalsȱersterȱausȱihrȱausgegeȬ ben.ȱ Somitȱ ähneltȱ dieȱ Sequenzȱ einerȱ seriellen,ȱ fortlaufendenȱ Datei.ȱ Eineȱ Sequenzȱ kannȱ auchȱ alsȱ eineȱ Datenschlangeȱ (engl.ȱ queue)ȱ gesehenȱ werden.ȱ Eineȱ Sequenzȱ funktioniertȱsomitȱnachȱderȱEingabeȬ/Ausgabemethodeȱfirstȱinȱ–ȱfirstȱout,ȱd.ȱh.ȱderȱ Eintrag,ȱderȱalsȱersterȱeingestelltȱwurde,ȱwirdȱauchȱalsȱersterȱausgegeben.ȱGenauer,ȱ inȱ derȱ Reihenfolge,ȱ inȱ welcherȱ dieȱ Einträgeȱ eingestelltȱ wurden,ȱ inȱ genauȱ dieserȱ Reihenfolgeȱ werdenȱ sieȱ auchȱ wiederȱ ausgegeben.ȱ Dieȱ einzelnenȱ Einträgeȱ sindȱ prinzipiellȱ unterschiedlichȱ aufgebaut,ȱ d.ȱ h.ȱ sieȱ sindȱ Ausprägungenȱ vonȱ unterȬ schiedlichenȱTypen.ȱEinȱundȱderselbeȱWertȱkannȱmehrfachȱjeȱinȱGestaltȱeinesȱEinȬ tragsȱeingetragenȱwerden.ȱIdentischeȱEinträgeȱsindȱsomitȱmöglich.ȱ Imȱ Gegensatzȱ zumȱ XDMȱ bautȱ dasȱ relationaleȱ Datenbankmodellȱ (RDBD)ȱ aufȱ derȱ Relationȱauf.ȱSieȱistȱeineȱSpielartȱderȱmathematischenȱMenge.ȱIhreȱBestandteileȱsindȱ dieȱ Tupel.ȱ Sieȱ sindȱ Ausprägungenȱ desselbenȱ Typs.ȱ Einȱ Tupelȱ bestehtȱ ausȱ einemȱ PrimärschlüsselwertȱundȱeinerȱkonstantenȱAnzahlȱvonȱnullȱbisȱvielenȱNichtschlüsȬ selwerten.ȱ Wieȱ inȱ derȱ mathematischenȱ Mengeȱ kraftȱ Definitionȱ erforderlich,ȱ sindȱ dieȱTupelȱeinmalig,ȱidentischȱaufgebautȱundȱungeordnet.ȱEsȱistȱsomitȱunbestimmt,ȱ inȱwelcherȱReihenfolgeȱdieȱTupelȱausȱderȱRelationȱausgegebenȱwerden.ȱ
ȱ105
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Inȱ derȱ folgendenȱ Tabelleȱ sindȱ dieȱ wesentlichenȱ Merkmaleȱ derȱ beidenȱ Modelleȱ gegenübergestellt.ȱ Merkmalȱ
XDMȱ
RDBDȱ
BezeichnungȱderȱDaȬ tenmengeȱ
Sequenzȱ
Relationȱ
Sortierordnungȱ
Zugangsordnungȱ
Unordnungȱ
Datenelementȱ
Eintragȱ
Tupelȱ
StrukturȱderȱDateneleȬ menteȱ
Einträgeȱsindȱprinzipiellȱ unterschiedlichȱstruktuȬ riert,ȱd.ȱh.ȱsieȱsindȱvonȱ unterschiedlichemȱTyp.ȱ
TupelȱsindȱgleichȱstrukȬ turiert,ȱsindȱvomȱselbenȱ Typ.ȱ
AuftrittȱeinesȱDateneleȬ mentesȱ
mehrmaligȱ
einmaligȱ
Tabelleȱ7:ȱGegenüberstellungȱdesȱXDMȱundȱdesȱRDBDȱ
Dasȱ Datenmodellȱ vonȱ XQueryȱ beruhtȱ aufȱ denȱ Vorgängerdatenmodellenȱ mitȱ denȱ Bezeichnungen:ȱ – XMLȱInformationȱSetȱ(Infoset)ȱ – PostȱSchemaȬValidationȱInfosetȱ(PSVI)ȱ Sieȱwerdenȱhierȱnichtȱweiterȱbehandelt.ȱ Wieȱwirȱgesehenȱhaben,ȱistȱeineȱSequenzȱeineȱgeordneteȱZusammenfassungȱ(engl.ȱ collection)ȱvonȱnullȱbisȱvielenȱEinträgenȱ(engl.ȱitems).ȱEinȱEintragȱistȱentwederȱeinȱ skalarerȱWertȱoderȱeinȱXDMȬKnoten.ȱ Einenȱ skalarenȱ Wertȱ bezeichnetȱ manȱ inȱ XQueryȱ auchȱ alsȱ atomarenȱ Wert,ȱ weilȱ erȱ nichtȱ weiterȱ unterteilbarȱ ist.ȱ Einȱ atomarerȱ Wertȱ istȱ dieȱ Ausprägungȱ einesȱ inȱ derȱ Datendefinitionsspracheȱ XMLȱ Schemaȱ eingebautenȱ Datentyps.ȱ Dieȱ eingebautenȱ Datentypenȱ vonȱ XMLȱ Schemaȱ sindȱ sehrȱ umfangreich.ȱ Deshalbȱ werdenȱ sieȱ inȱ eiȬ nemȱfolgendenȱKapitelȱseparatȱundȱsystematischȱbehandelt.ȱȱ BeispieleȱfürȱSequenzenȱ – – – – – –
AtomareȱGanzzahlȱ ȱ AtomareȱZeichenketteȱ ȱ DreiȱatomareȱWerteȱ ȱ ZweiȱatomareȱZeichenkettenȱ XMLȬElementȬKnotenȱ ȱ AtomareȱWerteȱundȱȱ XMLȬElementȬKnotenȱȱ ȱ – LeereȱSequenzȱ ȱ ȱ
106ȱ
2ȱ ȇhalloȇȱ (2,ȱ3,ȱ4)ȱ (ȇhalloȇ,ȱȇFreundeȇ)ȱ ȱ (2,ȱ,ȱȇhalloȇ)ȱ ()ȱ
6.1ȱȱDieȱSpracheȱXQueryȱ Einȱ Eintragȱ inȱ einerȱ XQueryȬSequenzȱ kannȱ einȱ XMLȬDokumentȱ inȱ seinerȱ internȱ codiertenȱFormȱsein.ȱEinȱsolcherȱEintragȱistȱeineȱAusprägung,ȱd.ȱh.ȱeinȱExemplarȱ desȱ XQueryȱ Datenmodellsȱ (XDM).ȱ Erȱ wirdȱ alsȱ XDMȬKnotenȱ oderȱ kurzȱ Knotenȱ bezeichnet.ȱ Einȱ Eintragȱ istȱ somitȱ prinzipiellȱ vergleichbarȱ mitȱ einemȱ relationalenȱ Tupel,ȱ dasȱ einȱ Exemplarȱ einesȱ Relationstypsȱ ist.ȱ Hierbeiȱ istȱ jedochȱ zuȱ beachten,ȱ dassȱalleȱTupelȱeinerȱRelationȱtypidentischȱsind.ȱDieȱKnotenȱeinerȱSequenzȱkönnenȱ jedochȱExemplareȱvonȱunterschiedlichenȱTypenȱsein.ȱ Einȱ Exemplarȱ desȱ XDM,ȱ d.ȱ h.ȱ dieȱ internȱ codierteȱ Formȱ einesȱ XMLȬDokumentes,ȱ wirdȱ inȱ Gestaltȱ einesȱ Datenbaumesȱ dargestellt.ȱ Zurȱ Konstruktionȱ einesȱ solchenȱ XDMȬBaumesȱ könnenȱ Ausprägungenȱ vonȱ siebenȱ XDMȬKnotenartenȱ verwendetȱ werden:ȱ – – – – – –
Dokumentknotenȱ Elementknotenȱ Attributknotenȱ Textknotenȱ Kommentarknotenȱ Verarbeitungshinweisknotenȱ(PI)ȱ
Documentȱ Elementȱ Attributeȱ Textȱ Commentȱ ProcessingȱInstructionȱ
InȱobjektorientierterȱBetrachtungsweiseȱsindȱdieȱKnotenartenȱKlassen.ȱEineȱKlasseȱ istȱderȱBauplan,ȱd.ȱh.ȱdieȱDefinitionȱeinesȱObjekts.ȱDieȱnachȱihrenȱVorgabenȱausgeȬ prägtenȱ Objekteȱ sindȱ dieȱXDMȬKnotenȱ imȱ XDMȬBaum.ȱ Hiermitȱkannȱ manȱ allgeȬ meinȱgesprochenȱeineȱKlasseȱauchȱalsȱeinenȱBegriffȱauffassen,ȱderȱdurchȱdenȱKlasȬ sennamenȱbezeichnetȱwird.ȱDieȱBegriffsintensionȱistȱderȱausȱderȱAusformulierungȱ derȱKlasseȱbestehendeȱBauplanȱderȱObjekte.ȱDieȱExtensionȱistȱschließlichȱdieȱMenȬ geȱderȱausgeprägtenȱObjekte.ȱSomitȱkönnenȱauchȱdieȱXDMȬKnotenartenȱallgemeinȱ alsȱ Begriffeȱ vonȱ XQueryȱ aufgefasstȱ werden.ȱ Sieȱ habenȱ einenȱ Namen,ȱ eineȱ inȱ XQueryȱ vordefinierteȱ Intensionȱ undȱ eineȱ Mengeȱ vonȱ Extensionen.ȱ Dieȱ einzelnenȱ ExtensionenȱsindȱsodannȱletztendlichȱdieȱausgeprägtenȱXDMȬKnotenȱinȱderȱMenȬ geȱallerȱXDMȬBäume.ȱ DenȱZusammenhangȱderȱdargestelltenȱXQueryȬspezifischenȱGrundbegriffeȱkannȱ manȱübersichtlichȱinȱeinemȱUMLȬKlassendiagrammȱdarstellen.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
107ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Sequenz
*
Eintrag
Atomarer Wert Datentyp Knoten Zeichenkettenwert Identität
«Document» Dokument «Element» Element Elementname Typ des Wertes Getypter Wert «Attribut» Attribut Attributname Typ des Wertes Getypter Wert «Textk» Text Getypter«Comment» Wert Kommentar «Processing-Instruction» Verarbeitungshinweis Zielsystemname
ȱ
ȱ Abbildungȱ35:ȱGrundbegriffeȱdesȱXDMȱ
WieȱmanȱausȱdemȱKlassendiagrammȱsieht,ȱbestehtȱeineȱSequenzȱausȱnullȱbisȱvielenȱ Einträgen.ȱ Einȱ Eintragȱ istȱ entwederȱ einȱ atomarerȱWertȱ oderȱ einȱ XDMȬKnoten.ȱ Einȱ Knotenȱ seinerseitsȱ istȱ einerȱ derȱ sechsȱ Knotenartenȱ desȱ XDMȬDatenmodells.ȱ Dieȱ Attributeȱ Zeichenkettenwertȱ undȱ Identitätȱ vonȱ Knotenȱ werdenȱ anȱ dieseȱ erbendenȱ Knotenartenȱ vererbt.ȱ Diesȱ wirdȱ durchȱ dieȱ Generalisierungsbeziehungȱ vonȱ UML,ȱ demȱ Pfeilȱ mitȱ derȱ hohlenȱ Spitzeȱ dargestellt.ȱ Zusätzlichȱ zuȱ diesenȱ vonȱ derȱ Klasseȱ Knotenȱ geerbtenȱ Attributenȱ enthaltenȱ dieȱ beidenȱ Klassenȱ Elementȱ undȱ Attributȱ nochȱihreȱsieȱspezialisierendenȱeigenenȱAttribute.ȱ JederȱKnotenȱhatȱeineȱeigeneȱIdentität.ȱInȱobjektorientierterȱSprechweiseȱbezeichȬ netȱ manȱ diesenȱ Sachverhaltȱ auchȱ mitȱ derȱ Objektidentitätȱ (engl.ȱ objectȱ identity,ȱ OIDȱ).ȱAufȱdenȱWertȱderȱIdentitätȱkannȱnichtȱdirektȱzugegriffenȱwerden.ȱWeiterȬ hinȱ hatȱ jederȱ Knotenȱ einenȱ Wertȱ inȱ Zeichenkettenform.ȱ Inȱ einemȱ Elementknotenȱ wirdȱzusätzlichȱderȱNameȱdesȱvonȱihmȱinternȱrepräsentiertenȱXMLȬElementes,ȱderȱ DatentypȱdesȱElementwertesȱundȱderȱElementwertȱinȱseinerȱdatentypspezifischenȱ Formȱdargestellt.ȱGleichesȱgiltȱfürȱeinenȱAttributknoten.ȱ
108ȱ
6.1ȱȱDieȱSpracheȱXQueryȱ Aufȱ denȱ Einsatzȱ dieserȱ Knotenartenȱ zurȱ Konstruktionȱ vonȱ XDMȬBäumenȱ undȱ derenȱprogrammtechnischeȱHandhabungȱgehenȱwirȱimȱnächstenȱKapitelȱausführȬ lichȱein.ȱ
6.1.2 Befehl XQuery in DB2-Client eingeben BevorȱwirȱunsȱmitȱtheoretischenȱAspektenȱtieferȱbeschäftigen,ȱwollenȱwirȱzunächstȱ einfacheȱ XQueryȬBefehleȱ inȱ denȱ DB2ȬClientȱ eingeben.ȱ Dabeiȱ werdenȱ wirȱ auchȱ kurzȱdieȱÄhnlichkeitenȱzwischenȱderȱEingabeȱvonȱXQueryȬȱundȱSQLȬBefehlenȱinȱ dieȱDB2ȬClientȱbehandeln.ȱHierdurchȱgewinnenȱwirȱschnellȱeinȱtieferesȱVerständȬ nisȱfürȱdieȱneueȱSpracheȱinȱDB2ȱundȱlassenȱkeineȱKluftȱzwischenȱTheorieȱundȱPraȬ xisȱaufkommen.ȱEinȱsolcherȱDB2ȬClientȱkannȱderȱ – Befehlseditorȱoderȱderȱ – Befehlszeilenprozessorȱ sein.ȱ BeginntȱeineȱEingabeȱinȱeinenȱDB2ȬClientȱmitȱdemȱWortȱXQUERY,ȱdannȱwirdȱderȱ DatenstromȱanȱdenȱXQueryȬParserȱvonȱDB2ȱgeleitet,ȱansonstenȱanȱdenȱSQLȬParser.ȱ Dasȱ Wortȱ XQUERYȱ istȱ derȱ Nameȱ einesȱ DB2ȬKommandosȱ undȱ gehörtȱ nichtȱ zurȱ XQueryȬSprache.ȱDasȱDB2ȬKommandoȱXQUERYȱ kannȱinȱ jederȱ Kombinationȱvonȱ GroßȬȱ undȱ Kleinbuchstabenȱ geschriebenȱ werden.ȱ Wirdȱ derȱ atomareȱ Wertȱ 1ȱ anȱ XQueryȱgeschickt,ȱkannȱdasȱKommandoȱbeispielsweiseȱwieȱfolgtȱaussehen.ȱ Beispielȱ XQUERY 1 xquery 1 XQuery 1 xquErY 1
DB2ȬXQueryȱantwortetȱhieraufȱmitȱdemȱErgebnisȱ 1 ––––––––––––––––– 1
DieȱSpracheȱXQueryȱselbstȱunterscheidetȱjedochȱzwischenȱGroßȬȱundȱKleinschreiȬ bungȱderȱWorte.ȱSchlüsselworteȱderȱSprache,ȱdieȱNotationskonstanten,ȱwerdenȱinȱ Kleinbuchstabenȱ geschrieben.ȱ Sieȱ sindȱ nichtȱ reserviert.ȱ Dieȱ restlichenȱ Worte,ȱ dieȱ Notationsvariablen,ȱdieȱvomȱProgrammiererȱfreiȱgewähltȱwerden,ȱkönnenȱinȱeinerȱ MischungȱvonȱGroßȬȱundȱKleinbuchstabenȱgeschriebenȱwerden.ȱ DieȱVerwendungȱdesȱDB2ȬBefehlsȱXQUERYȱistȱähnlichȱeinfachȱundȱwirkungsvollȱ wieȱ dieȱ Verwendungȱ derȱ SQLȬKlauselȱ VALUES.ȱ Auchȱ mitȱ VALUESȱ kannȱ manȱ sehrȱeinfachȱeinȱoderȱmehrereȱSQLȬAusdrückeȱanȱdenȱSQLȬParserȱvonȱDB2ȱschiȬ ckenȱ undȱ vonȱ diesemȱ imȱ Kommandomodusȱ ausführenȱ lassen.ȱ Beideȱ Parser,ȱ derȱ XQueryȬȱundȱderȱSQLȬParserȱschickenȱdieȱErgebnisseȱinȱexternȱlesbarerȱZeichenȬ
109ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ formȱzurück.ȱIstȱhierbeiȱeineȱSerialisierungȱvonȱinternȱcodiertenȱXMLȬWertenȱerȬ forderlich,ȱsoȱerfolgtȱdieȱSerialisierungȱimplizitȱdurchȱdenȱDatenbankprozessor.ȱ Inȱ derȱ folgendenȱ Tabelleȱzeigenȱ wirȱ dieȱ einfacheȱHandhabungȱ beiderȱ SpracheinȬ richtungenȱinȱDB2.ȱ SQL – VALUES
XQuery – XQUERY
Atomare Ganzzahl
VALUES 1
XQUERY 1
Atomare Zeichenkette
VALUES 'hallo'
XQUERY 'hallo'
Drei atomare Ganzzahlen
VALUES 2, 3, 4
XQUERY 2, 3, 4
Zwei atomare Zeichenketten
VALUES 'hallo', 'Freunde'
XQUERY 'hallo', 'Freunde'
XML-Element-Knoten
VALUES XMLPARSE( DOCUMENT '' )
XQUERY
Tabelleȱ8:ȱÄhnlichkeitenȱzwischenȱSQLȬȱundȱXQueryȬAufrufenȱinȱDB2ȱ
Dieȱ beidenȱParser,ȱderȱSQLȬParserȱundȱderȱXQueryȬParser,ȱ behandelnȱ dieȱeingeȬ gebenenȱWerteȱinȱderȱihremȱjeweiligenȱWeltbildȱkonformenȱArt,ȱdemȱrelationalenȱ undȱdemȱdokumentenorientiertenȱWeltbild.ȱDerȱSQLȬParserȱerkenntȱdenȱeingegeȬ benenȱ Wertestromȱ alsȱ eineȱ Relation.ȱ Derȱ XQueryȬParserȱ betrachtetȱ ihnȱ alsȱ eineȱ Sequenz.ȱ SowohlȱdieȱRelationȱalsȱauchȱdieȱSequenzȱstellenȱwirȱnunȱinȱTabellenformȱdarȱundȱ fügenȱ inȱ beideȱ dieȱ zweiȱ atomarenȱ Zeichenkettenȱ ȇhalloȇȱ undȱ ȇFreundeȇȱ ein.ȱ Dieȱ folgendeȱRelationȱbestehtȱausȱzweiȱTupelȱmitȱjeȱeinemȱWert.ȱDieȱSequenzȱbestehtȱ ausȱzweiȱEinträgen.ȱ ȱ
Relationȱ
Sequenz
halloȱ
halloȱ
Freundeȱ
Freundeȱ ȱ
Abbildungȱ36:ȱGegenüberstellungȱvonȱRelationȱundȱSequenzȱ
ȱ ȱ ȱ ȱ
110ȱ
6.1ȱȱDieȱSpracheȱXQueryȱ Datenstrom an SQL-Parser
Datenstrom an SQL-Parser
VALUES 'hallo', 'Freunde' Antwort 1 ––––––– hallo Freunde
XQUERY 'hallo', 'Freunde' Antwort 1 ––––––– hallo Freunde
Tabelleȱ9:ȱBehandlungȱeinerȱRelationȱundȱSequenzȱdurchȱdieȱParserȱ
Andersȱ istȱ dasȱ Parserverhalten,ȱ wennȱ derȱ Eingabestromȱ nichtȱ einenȱ atomarenȱ WertȱjeȱTupel,ȱsondernȱmehrereȱatomareȱWerteȱjeȱTupelȱbzw.ȱjeȱSequenzȱumfasst.ȱ ImȱfolgendenȱBeispielȱbestehtȱdieȱEingabeȱinȱdenȱSQLȬParserȱausȱzweiȱTupelȱmitȱjeȱ zweiȱ Datenworten.ȱ Dieȱ Eingabeȱ inȱ denȱ XQueryȬParserȱ istȱ ausȱ zweiȱ Sequenzenȱ zusammengesetztȱmitȱebenfallsȱjeweilsȱzweiȱDatenworten.ȱWieȱmanȱanȱdenȱAusȬ gabenȱ beiderȱ Systemeȱ sieht,ȱ behältȱ SQLȱ dieȱ Tupelstrukturierungȱ inȱ derȱ Relationȱ bei.ȱXQueryȱhingegenȱbautȱdieȱbeidenȱSequenzenȱzuȱeinerȱSequenzȱzusammen.ȱ Datenstrom an SQL-Parser
Datenstrom an SQL-Parser
VALUES ('hallo', 'Freunde'), ('guten', 'Morgen' )
XQUERY ('hallo', 'Freunde'), ('guten', 'Morgen' )
Antwort
Antwort
1 ––––– hallo guten
1 –––––––– hallo Freunde guten Morgen
2 ––––––– Freunde Morgen
Tabelleȱ10:ȱBehandlungȱvonȱkomplexenȱTupelȱundȱSequenzenȱ
ȱ ȱ
Relation hallo guten
ȱ ȱ
Freunde Morgen
Sequenz hallo Freunde guten Morgen
Abbildungȱ37:ȱUnterschiedlicheȱBehandlungȱvonȱTupelȱundȱSequenzenȱ
Eineȱ Sequenzȱ wirdȱ inȱ einemȱ Sequenzausdruckȱ zusammengebaut.ȱ Dasȱ Kommaȱ fungiertȱinȱeinemȱSequenzausdruckȱalsȱdyadischerȱOperator,ȱd.ȱh.ȱalsȱeinȱOperator,ȱ vorȱundȱnachȱdemȱjeȱeinȱOperandȱsteht.ȱFürȱdieȱLesbarkeitȱistȱesȱvorteilhaft,ȱeinenȱ Sequenzausdruckȱ inȱ rundenȱ Klammernȱ einzuklammern.ȱ Dieseȱ Darstellungsartȱ
111ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ vermitteltȱ auchȱ optischȱ denȱ Eindruckȱ einerȱ geschlossenenȱ Einheit.ȱ Eineȱ Sequenzȱ kannȱ ausȱ Wertenȱ unterschiedlichsterȱ Typenȱ bestehen.ȱ Eineȱ rundeȱ Klammerȱ aufȱ undȱzuȱ()ȱistȱeineȱleereȱSequenz.ȱ BeispieleȱfürȱSequenzenȱ SequenzȱausȱGanzzahlenȱ
(1, 2, 3)
SequenzȱausȱreellenȱZahlenȱ
(1.1, 2.2, 3.3)
SequenzȱausȱganzenȱundȱreellenȱZahlenȱ
(1.1, 2, 3.3)
SequenzȱausȱZahlenȱundȱTextzeichenȱ
(1, 2.2, 'a')
SequenzȱausȱSequenzenȱ
(1, (2.2, 3), (4), (), 5, 'a')ȱ
Tabelleȱ11:ȱSequenzenȱausȱaufgezähltenȱatomarenȱWertenȱ
Dieȱ Operandenȱ einesȱ KommaȬOperatorsȱ könnenȱ auchȱ Ausdrückeȱ sein.ȱ Imȱ FolȬ gendenȱgehenȱwirȱkurzȱaufȱeinigeȱAusdrucksartenȱein.ȱInȱeinemȱspäterenȱKapitelȱ werdenȱdieȱAusdrucksartenȱsodannȱsystematischȱbehandelt.ȱ BeispieleȱfürȱSequenzenȱmitȱAusdrückenȱalsȱOperandenȱ SequenzȱausȱganzzahligenȱAusdrückenȱ
(1 + 1, 2 + 2, 3 + 3)
SequenzȱausȱreellzahligenȱAusdrückenȱ
(1.1 + 1.1, 3.3 – 1.1)
SequenzȱausȱgemischtzahligenȱAusdrückenȱ
(1.1 + 1, 2 – 1.1)
Sequenzȱ ausȱ Textwortenȱ undȱ VerkettungsȬ funktionȱconcat()ȱ
('hallo', concat('Fre', 'unde'))
SequenzȱausȱAusdrückenȱinȱSequenzenȱ
((1.1 div 2.2), (concat('a', 'b' )))
Tabelleȱ12:ȱSequenzenȱmitȱAusdrückenȱ
DieȱAusdrückeȱderȱobigenȱBeispieleȱverwendenȱarithmetischeȱOperatorenȱundȱdieȱ inȱXQueryȱeingebauteȱFunktionȱconcat()ȱzurȱVerkettungȱvonȱZeichendaten.ȱ InȱXQueryȱgibtȱesȱdieȱfolgendenȱarithmetischenȱOperatoren.ȱSieȱwerdenȱvonȱlinksȱ nachȱrechtsȱabgearbeitet.ȱ Operatorȱ
Bedeutungȱ
Beispielȱ
ȱ +ȱ –ȱ
Vorzeichenoperator:ȱ positivȱ negativȱ
-1
ȱ *ȱ
Punktrechnung:ȱ Multiplikationȱȱ
112ȱ
--1 -+1 2 * 3
6.1ȱȱDieȱSpracheȱXQueryȱ divȱȱ idivȱȱ modȱ
Divisionȱ ganzzahligeȱDivisionȱȱ Modulodivisionȱ
2 div 3 7 idiv 3 7 mod 3ȱ
ȱ +ȱ –ȱ
Strichrechnung:ȱ Additionȱ Subtraktionȱ
1 + 1 5 – 2ȱ
Tabelleȱ13:ȱArithmetischeȱOperatorenȱ
DieȱSyntaxȱderȱeingebautenȱFunktionȱconcat()ȱlautetȱwieȱfolgt.ȱ ȱ ȱ
concat( atomarer Wert, atomarer Wert [, atomarer Wert] ...)
Syntaxȱ16:ȱEingebauteȱFunktionȱconcat()ȱ
SollȱeineȱSequenzȱEinträgeȱausȱeinemȱBereichȱvonȱunmittelbarȱbenachbartenȱganzȬ zahligenȱ Wertenȱ enthalten,ȱ soȱ kannȱ fürȱ dieȱ Herstellungȱ derȱ Einträgeȱ einȱ BeȬ reichsausdruckȱ eingesetztȱ werden.ȱ Einȱ Wertebereichsausdruckȱ bestehtȱ ausȱ dreiȱ Bestandteilen,ȱdemȱdyadischenȱOperatorȱto,ȱvorȱdemȱderȱAusdruckȱfürȱdieȱAngaȬ beȱ derȱ Untergrenzeȱ desȱ Wertebereichesȱ steht.ȱ Nachȱ demȱ Operatorȱ toȱ stehtȱ derȱ Ausdruck,ȱderȱdenȱgrößtenȱWertȱdesȱWertebereichesȱangibt,ȱdieȱObergrenze.ȱȱ BeispieleȱfürȱdieȱErzeugungȱvonȱSequenzenȱmitȱHilfeȱdesȱBereichsoperatorsȱto.ȱ SequenzȱausȱeinemȱganzzahligenȱWertebereichȱ
(1 to 3)
SequenzȱausȱzweiȱganzzahligenȱWertebereichenȱ
(1 to 3, 5 to 7)
SequenzȱausȱzweiȱganzzahligenȱWertebereichenȱ –ȱbesserȱlesbarȱ
((1 to 3), (5 to 7))
SequenzȱausȱzweiȱganzzahligenȱWertebereichenȱ undȱEinzelwertȱ
((1 to 3), (5 to 7), 9)
SequenzȱinȱabsteigenderȱFolgeȱ
(reverse(1 to 3))
Tabelleȱ14:ȱWertebereichsausdrückeȱzurȱErzeugungȱvonȱganzzahligenȱSequenzenȱ
XQueryȱ istȱ eineȱ funktionaleȱ Sprache.ȱ Dasȱ bedeutetȱ auch,ȱ dassȱ nachȱ demȱ DB2Ȭ Befehlsnamenȱ XQUERYȱ dieȱ Implementierungȱ derȱ Hauptfunktionȱ beginnt.ȱ Dieseȱ hatȱ keinenȱ Namen.ȱ Sieȱ wirdȱ jedochȱ vomȱ Datenbankprozessorȱ DB2ȱ aufgerufen,ȱ wennȱ inȱ ihrȱ keinȱ Syntaxfehlerȱ gefundenȱ wurde.ȱ Dieȱ anonymeȱ Hauptfunktionȱ mussȱeineȱSequenzȱenthalten,ȱdieȱauchȱleerȱseinȱkann.ȱAuchȱdieȱSequenzȱhatȱkeiȬ nenȱNamen.ȱWieȱinȱderȱfunktionalenȱProgrammierungȱüblich,ȱwirdȱdasȱErgebnisȱ
113ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ derȱFunktionȱdurchȱdieȱAnweisungȱreturnȱanȱdieȱStelleȱihresȱAufrufsȱzurückgegeȬ ben.ȱBeiȱeinerȱanonymenȱSequenzȱistȱdieȱXQueryȬKlauselȱreturnȱebenfallsȱanonym.ȱ InȱXQueryȱistȱdieserȱMechanismusȱetwasȱverschleiert,ȱweilȱzumȱeinenȱdieȱHauptȬ sequenzȱ keinenȱ Namenȱ hatȱ undȱ zumȱ anderenȱ ihreȱ Einträgeȱ durchȱ einȱ implizitesȱ undȱnichtȱsichtbaresȱreturnȱanȱdenȱDatenbankprozessorȱinȱserialisierterȱFormȱzuȬ rückgegebenȱ werden.ȱ Wieȱ manȱ hierausȱ erkennt,ȱ istȱ dasȱ Arbeitenȱ mitȱ implizitenȱ Standardkonzeptenȱzwarȱsehrȱeffizient.ȱEsȱverschleiertȱjedochȱauchȱdieȱeigentlicheȱ FunktionsweiseȱundȱistȱdeshalbȱfürȱdenȱAnfängerȱnichtȱsofortȱeinsichtig.ȱ Eineȱ Sequenzȱ kannȱ manȱ jedochȱ auchȱ anȱ eineȱ XQueryȬVariableȱ binden.ȱ Hiermitȱ machtȱmanȱdieseȱSequenzȱexplizitȱundȱprogrammtechnischȱanfassbar.ȱIhreȱWerteȱ könnenȱsodannȱmitȱderȱXQueryȬKlauselȱreturnȱanȱdenȱDatenbankprozessorȱexpliȬ zitȱzurückgegebenȱwerden.ȱȱ EineȱXQueryȬVariableȱbeginntȱmitȱdemȱDollarzeichenȱ$ȱgefolgtȱvonȱeinerȱbeliebiȬ genȱ Kombinationȱ alphanumerischerȱ Zeichen.ȱ Sieȱ wirdȱ inȱ einemȱ soȱ genanntenȱ FLWORȬAusdruckȱvereinbart.ȱInȱihmȱistȱsieȱbekanntȱundȱwirdȱinȱihmȱauchȱgenutzt.ȱ (FLWOR:ȱ ausgesprochenȱ engl.ȱ wieȱ flowerȱ –ȱ Blume).ȱ FLWORȬAusdrückeȱ werdenȱ inȱ einemȱ späterenȱ Kapitelȱ intensivȱ behandelt.ȱ EinȱFLWORȬAusdruckȱ bestehtȱ ausȱ denȱKlauselnȱfor,ȱlet,ȱwhere,ȱorderȱundȱreturn.ȱDieȱbeidenȱBestandteileȱletȱundȱreturnȱ sindȱfürȱunsereȱaktuellenȱZweckeȱbedeutsam.ȱ InȱRahmenȱdesȱminimalenȱFLWORȬAusdrucksȱletȱundȱreturn,ȱdieȱzusammenȱeineȱ Einheitȱbilden,ȱwirdȱeineȱXQueryȬVariableȱvereinbartȱundȱmitȱeinerȱSequenzȱverȬ bunden.ȱDieȱEinträgeȱderȱSequenzȱwerdenȱsodannȱmitȱderȱKlauselȱreturnȱausȱderȱ FunktionȱanȱdenȱDatenbankprozessorȱimplizitȱserialisiertȱzurückgegeben.ȱ ImȱfolgendenȱBeispielȱsollȱanȱdieȱXQueryȬVariableȱ$_explizite_SequenzȱdieȱSequenzȱ (1,ȱȇaȇ)ȱgebundenȱundȱmitȱderȱKlauselȱreturnȱserialisiertȱanȱdenȱDatenbankprozesȬ sorȱ zurückgegebenȱ werden.ȱ Dieserȱ stelltȱ sodannȱ dasȱ serialisierteȱ Ergebnisȱ demȱ DB2ȬClientȱ zurȱ Verfügung,ȱ derȱ sieȱ ausgibt.ȱ Dieȱ Sequenzȱ wirdȱ mitȱ demȱ ZuweiȬ sungsoperator,ȱ derȱ ausȱ demȱ Doppelpunktȱ undȱ demȱ Gleichheitszeichenȱ bestehtȱ :=,ȱ anȱdieȱXQueryȬVariableȱgebunden,ȱsieheȱProgrammzeileȱ(2).ȱ XQUERY let $_explizite_Sequenz := (1, 'a') return $_explizite_Sequenz
(1) (2) (3)
Programmȱ45:ȱSequenzȱistȱanȱXQueryȬVariableȱgebundenȱ
Ergebnisȱ 1 –––––––– 1 a
Eineȱ Sequenzȱ kannȱ auchȱ ausȱ Sequenzenȱ zusammengebautȱ werden,ȱ dieȱ jeweilsȱ überȱ eineȱ XQueryȬVariableȱ referenziertȱ werden.ȱ Dasȱ istȱ naheȱ liegend,ȱ dennȱ eineȱ
114ȱ
6.1ȱȱDieȱSpracheȱXQueryȱ Variableȱist,ȱgenauȱsoȱwieȱeinȱLiteral,ȱeinȱminimalerȱAusdruck.ȱDasȱfolgendeȱBeiȬ spielȱdemonstriertȱdiesenȱKonstruktionsansatz.ȱ XQUERY let let let let let
$Ganzzahlsequenz $Zeichenkettensequenz $Leere_Sequenz $Wertebereich_Sequenz $Ergebnissequenz
) return $Ergebnissequenz
:= := := := :=
(1, 2) ('hallo', 'Freunde') () (5 to 7) ($Ganzzahlsequenz , $Zeichenkettensequenz, $Leere_Sequenz , $Wertebereich_Sequenz
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
Programmȱ46:ȱSequenzȱwirdȱausȱSequenzenȱmehrererȱVariablenȱkonstruiert
Ergebnisȱ 1 –––––––––– 1 2 hallo Freunde 5 6 7
6.1.3 Übungen 1) Stellenȱ Sieȱ dieȱ Werteȱ ȇXQueryȇȱ ȇistȇȱ ȇeinfachȇȱ alsȱ dreiȱ Einträgeȱ inȱ dieȱ anonymeȱ SequenzȱeinȱundȱgebenȱSieȱdieseȱSequenzȱmitȱeinemȱanonymenȱreturnȱaus.ȱ 2) Stellenȱ Sieȱdieȱ Werteȱ ȇXQueryȇȱ ȇistȇȱ ȇeinfachȇȱ alsȱdreiȱ Einträgeȱ inȱ eineȱ Sequenzȱ einȱundȱweisenȱSieȱdieseȱSequenzȱderȱReferenzvariablenȱ$Sequenz_Refȱzu.ȱAnȬ schließendȱgebenȱSieȱdieȱEinträgeȱdieserȱSequenzȱmitȱderȱKlauselȱreturnȱaus.ȱ 3) Erzeugenȱ Sieȱ eineȱ benannteȱ Sequenzȱ ausȱ Einträgen,ȱ dieȱ sichȱ ausȱ folgendenȱ Ausdrückenȱergeben:ȱ1ȱ+ȱ1,ȱ–1ȱ+ȱ2,ȱ3ȱ–ȱ1,ȱ7ȱ*ȱ3,ȱ10ȱdivȱ2,ȱ22.2ȱdivȱ2.2,ȱ10ȱmodȱ3,ȱ8ȱ idivȱ3,ȱȇhalloȇ,ȱȇFreundeȇ,ȱconcat(ȇgutenȱȇ,ȱȇMorgenȇ).ȱGebenȱSieȱdieȱEinträgeȱderȱ SequenzȱmitȱderȱKlauselȱreturnȱaus.ȱ 4) Erzeugenȱ Sieȱ eineȱ benannteȱ Sequenzȱ ausȱ Einträgen,ȱ dieȱ sichȱ ausȱ folgendenȱ Ausdrückenȱ ergeben:ȱ 10ȱ toȱ 15,ȱ 25ȱ toȱ 30,ȱ reverseȱ (ȱ 55ȱ toȱ 60),ȱ ().ȱ Gebenȱ Sieȱ dieȱ EinträgeȱderȱSequenzȱmitȱderȱKlauselȱreturnȱaus.ȱ 5) Erzeugenȱ Sieȱ eineȱ benannteȱ Sequenzȱ ausȱ Einträgen,ȱ dieȱ sichȱ ausȱ Einträgenȱ vorherȱ erstellterȱ undȱ benannterȱ Sequenzenȱ ergeben.ȱ Gebenȱ Sieȱ dieȱ ErgebnisȬ sequenzȱmitȱderȱKlauselȱreturnȱaus.ȱ ȱ
115ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ
6.2 Konstruktoren zur Erzeugung von XDM-Knoten Fürȱ dieȱ interneȱ Darstellungȱ vonȱ XMLȬDokumentenȱ sindȱ besondersȱ diejenigenȱ Einträgeȱ inȱ einerȱ Sequenzȱ bedeutsam,ȱ dieȱ ausȱ XDMȬKnotenȱ aufgebautȱ sind.ȱ Wieȱ bereitsȱausgeführt,ȱhandeltȱesȱsichȱhierbeiȱumȱfolgendeȱKnotenarten:ȱ – – – – – –
Dokumentknotenȱ Elementknotenȱ Textknotenȱ Attributknotenȱ Verarbeitungshinweisknotenȱ(PI)ȱ KommentarȬKnotenȱ
documentȱ elementȱ textȱ attributeȱ Processingȱinstructionȱ commentȱ
Einȱ XDMȬKnotenȱ wirdȱ mitȱ einemȱ Knotenkonstruktorȱ oderȱ kurzȱ gesagtȱ einemȱ Konstruktorȱerzeugt.ȱInȱXQueryȱwerdenȱzweiȱKonstruktorartenȱunterschiedenȱ – direkterȱKonstruktorȱ – berechneterȱKonstruktor.ȱ EinȱdirekterȱKonstruktorȱliegtȱdannȱvor,ȱwennȱderȱtextförmigeȱXMLȬTextȱalsȱLiteȬ ralȱinȱeinerȱSequenzȱaufgeführtȱwird.ȱDerȱTextȱwirdȱhierbeiȱnichtȱalsȱZeichenketȬ tenliteralȱinȱHochkommataȱgeschrieben.ȱDasȱXMLȬElementȱȱhalloȱȱ istȱ solchȱ einȱ direkterȱ Konstruktor.ȱ Imȱ folgendenȱ Programmȱ erzeugtȱ derȱ direkteȱ Konstruktorȱ einenȱ Eintragȱ inȱ derȱ anonymenȱ Sequenz.ȱ Derȱ Eintragȱ istȱ vomȱ Typȱ Elementknoten.ȱ Beispielȱ XQUERY ( hallo ) Ergebnis hallo
ImȱnächstenȱSchrittȱwollenȱwirȱdasȱXMLȬDokumentȱdesȱKundenȱmitȱderȱKundenȬ nummerȱ K001ȱundȱ mitȱ denȱ Namenselementenȱ Vornameȱ gleichȱ Hugoȱundȱ Zunameȱ gleichȱ Muellerȱ imȱ gemischtenȱ Entwicklungsansatzȱ inȱ XQueryȱ mitȱ einemȱ direktenȱ Konstruktorȱ implementieren.ȱ Dieȱ Kundennummerȱ wirdȱ alsȱ Attributȱ desȱ XMLȬ ElementsȱKundeȱausgestaltet.ȱDieȱXMLȬElementeȱVornameȱundȱZunameȱsollenȱdemȱ XMLȬElementȱ Nameȱ hierarchischȱuntergeordnetȱsein.ȱDerȱfolgendeȱ Bauplanȱstelltȱ dasȱausgeprägteȱXMLȬDokumentȱinȱderȱSpracheȱUMLȱinȱGestaltȱeinesȱObjektmoȬ dellsȱdar.ȱ
116ȱ
6.2ȱKonstruktorenȱzurȱErzeugungȱvonȱXDMȬKnotenȱ ȱ
«Element» K001:Kunde
ȱ
+ Kunde_Nr : string = K001
ȱ ȱ
1
«Element» Name
«Element» 1 Vorname «Element» Zuname 1
1 1
«Wert» Hugo «Wert» Mueller
Abbildungȱ38:ȱObjektmodellȱdesȱKundenȱK001ȱinȱgemischtemȱAnsatzȱ
DieȱImplementierungȱdesȱDokumentmodellsȱinȱXQueryȱmitȱeinemȱdirektenȱKonȬ struktorȱundȱeinerȱbenanntenȱSequenzȱzeigtȱdasȱfolgendeȱProgramm.ȱ XQUERY let $Sequenz := ( Hugo Mueller ) return $Sequenz
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
Programmȱ47:ȱXMLȬDokumentȱmitȱdirektemȱKonstruktorȱerzeugtȱ
Inȱ denȱ Programmzeilenȱ(3)ȱ bisȱ (8)ȱ wirdȱdasȱXMLȬElementȱ KundeȱinȱGestaltȱeinesȱ direktenȱ Konstruktorsȱ alsȱ Elementknotenȱ inȱ dieȱ Sequenzȱ eingebracht.ȱ Derȱ EleȬ mentknotenȱ Kundeȱ istȱ einȱ komplexerȱ Elementknoten,ȱ weilȱ erȱ dasȱ Attributȱ KunȬ de_Nrȱ undȱ denȱ ihmȱ hierarchischȱ untergeordnetenȱ Elementknotenȱ Nameȱ hat.ȱ Dieȱ KlauselȱreturnȱinȱderȱProgrammzeileȱ(10)ȱgibtȱdenȱgesamtenȱInhaltȱderȱSequenzȱinȱ serialisierterȱTextformȱaus.ȱ Ergebnis Hugo Mueller
Ausȱ demȱ direktenȱ Konstruktorȱ inȱ Programmȱ 47ȱ bautȱ XQueryȱ einenȱ internenȱ XDMȬBaumȱ auf.ȱ Derȱ Zeigerȱ aufȱ dasȱ Wurzelelementȱ wirdȱ hierbeiȱ inȱ derȱ Sequenzȱ vermerkt.ȱDerȱXDMȬBaumȱbestehtȱaufȱderȱhöchstenȱEbeneȱausȱdemȱWurzelknoten.ȱ DieserȱrepräsentiertȱdasȱWurzelelementȱKunde.ȱDiesemȱElementknotenȱistȱeinȱAtȬ tributknotenȱzugeordnet,ȱderȱdasȱAttributȱKunde_NrȱimȱBaumȱimplementiert.ȱDemȱ Attributknotenȱ istȱ seinȱ Wertknotenȱ untergeordnet.ȱ Seinȱ Wertȱ istȱ dieȱ KundenȬ
117ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ nummerȱK001.ȱWeiterhinȱistȱdemȱElementknotenȱKundeȱderȱElementknotenȱNameȱ hierarchischȱ untergeordnet.ȱ Derȱ Elementknotenȱ Nameȱ istȱ derȱ Vorgängerknotenȱ seinerȱ hierarchischenȱ ElementȬNachfolgerknotenȱ Vornameȱ undȱ Zuname.ȱ Beideȱ NachfolgerknotenȱhabenȱnochȱjeȱeinenȱWertknotenȱfürȱdieȱDarstellungȱderȱWerteȱ HugoȱundȱMuellerȱuntergeordnet.ȱ ȱ ȱ ȱ ȱ
Sequenzȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
«Element» Kunde
1
1
«Element» Name
1
«Element» Vorname
1
«Element» Zuname
«Attribut» Kunde_Nr
1 1
1
«Wert» Hugo «Wert» Mueller «Wert» K001
ȱ
ȱ Abbildungȱ39:ȱXDMȬBaumȱderȱinternenȱRepräsentationȱdesȱdirektenȱKonstruktorsȱ
EinȱsolcherȱXDMȬBaumȱkannȱauchȱmitȱdemȱEinsatzȱvonȱberechnetenȱKonstruktoȬ ren,ȱ d.ȱ h.ȱ mitȱ berechnetenȱ Knoten,ȱ konstruiertȱ werden.ȱ Dieȱ Anwendungȱ vonȱ beȬ rechnetenȱ Konstruktorenȱ istȱ ähnlichȱ demȱ Einsatzȱ derȱ eingebautenȱ PublikationsȬ funktionenȱvonȱSQL/XML.ȱAuchȱmitȱihnenȱwerdenȱinterneȱXMLȬKnotenȱimȱXDMȬ Baumȱerzeugt.ȱ DieȱNamenȱderȱKonstruktorenȱfürȱdieȱberechneteȱKonstruktionȱvonȱXDMȬKnotenȱ entsprechenȱdenȱNamenȱderȱXDMȬKnoten,ȱwelcheȱdurchȱdieȱKonstruktorenȱausȬ geprägtȱwerden.ȱ Knotenartȱ
Konstruktornameȱ
Dokumentknotenȱ
document
Elementknotenȱ
element
Attributknotenȱ
attribute
Textknotenȱ
text
Kommentarknotenȱ
comment
Verarbeitungshinweisknotenȱ
processing-instructionȱ
Tabelleȱ15:ȱXDMȬKnotenartenȱundȱNamenȱihrerȱKonstruktorenȱ
Imȱ FortgangȱderȱAusführungenȱ stellenȱ wirȱdieȱ KnotenartenȱzurȱKonstruktionȱ eiȬ nesȱ XDMȬBaumesȱ grafischȱ inȱ UMLȱ dar.ȱ Hierbeiȱ zeigenȱ wirȱ vornehmlich,ȱ welcheȱ KnotenartenȱvonȱderȱgeradeȱdargestelltenȱKnotenartȱabhängigȱseinȱkönnen.ȱNachȱ
118ȱ
6.2ȱKonstruktorenȱzurȱErzeugungȱvonȱXDMȬKnotenȱ derȱ grafischenȱ Darstellungȱ beschreibenȱ wirȱ dieȱ Syntaxȱ desȱ jeweiligenȱ KonstrukȬ tors.ȱHieraufȱgebenȱwirȱeineȱAnzahlȱinteressanterȱBeispiele.ȱ
Elementknoten Dieȱ Ausführungenȱ beginnenȱ wirȱ mitȱ demȱ berechnetenȱ Konstruktorȱ fürȱ dieȱ KonȬ struktionȱeinesȱElementknotens.ȱSeinȱXQueryȬNameȱlautetȱelement.ȱDaȱdieȱNamenȱ derȱ berechnetenȱ Konstruktorenȱ inȱ XQueryȱ inȱ Kleinbuchstabenȱ geschriebenȱ werȬ den,ȱ sindȱ auchȱ dieȱ Knotennamenȱ inȱ denȱ folgendenȱ UMLȬDiagrammenȱ inȱ KleinȬ buchstabenȱgeschrieben.ȱ Wieȱ ausȱ demȱ UMLȬDiagrammȱ ersichtlichȱ ist,ȱ kannȱ vonȱ einemȱ XDMȬKnotenȱ derȱ ArtȱelementȱeineȱVielzahlȱderȱrechtsȱaufgeführtenȱKnotenartenȱhierarchischȱabhänȬ gigȱsein.ȱEinȱKnotenȱderȱArtȱattributeȱistȱdemȱElementknotenȱjedochȱbeigeordnet.ȱ ȱ ȱ
element
ȱ
*
ȱ
*
ȱ
*
ȱ
*
ȱ
*
ȱ ȱ ȱ
*
element text comment processing-instruction atomarer Wert
attribute
ȱ
Abbildungȱ40:ȱDerȱKonstruktorȱelementȱprägtȱeinenȱXDMȬElementknotenȱausȱ
DieȱSyntaxȱdesȱberechnetenȱKonstruktorsȱelementȱistȱfolgende.ȱ ȱ
element XML-Elementname {[ Inhaltsausdruck ] }
ȱ Syntaxȱ17:ȱBerechneterȱKonstruktorȱelementȱ
Wieȱ ausȱ derȱSyntaxȱ ersichtlichȱist,ȱfolgtȱ aufȱdenȱ Bezeichnerȱ desȱKonstruktorsȱ eleȬ mentȱderȱNameȱdesȱauszuprägendenȱXMLȬElementesȱinȱseinerȱinternenȱFormȱalsȱ XDMȬKnotenȱ imȱ XDMȬKnotenbaum.ȱ Hieraufȱ folgtȱ einȱ Paarȱ geschweifterȱ KlamȬ mern.ȱInȱdiesenȱKlammernȱkannȱeinȱInhaltsausdruckȱangegebenȱwerden,ȱderȱausȱ einerȱSequenzȱvonȱKnotenȱderȱinȱAbbildungȱ40ȱaufgeführtenȱArtenȱund/ȱoderȱausȱ atomarenȱWertenȱbesteht.ȱWirdȱderȱInhaltsausdruckȱnichtȱangegeben,ȱsoȱwirdȱeinȱ KnotenȱfürȱeinȱleeresȱXMLȬElementȱausgeprägt.ȱ
119ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Beispieleȱ EinȱElementknotenȱfürȱeinȱleeresȱXMLȬElementȱwirdȱausgeprägt.ȱ XQUERY element Leeres_Element{}
(1) (2)
Programmȱ48:ȱBerechneterȱKonstruktorȱelementȱprägtȱKnotenȱfürȱleeresȱXMLȬElementȱ ausȱ Ergebnis
Demȱ Elementknotenȱ desȱ XMLȬElementesȱ Nameȱ sollenȱ dieȱ beidenȱ Elementknotenȱ derȱXMLȬElementeȱVornameȱundȱZunameȱhierarchischȱuntergeordnetȱwerden.ȱDerȱ Knotenȱ Vornameȱ sollȱ denȱ Inhaltsausdruckȱ Hugoȱ undȱ derȱ Knotenȱ Nachnameȱ denȱ InhaltsausdruckȱMuellerȱenthalten.ȱ XQUERY element Name{ element Vorname{ 'Hugo' }, element Zuname{ 'Mueller' } }
(1) (2) (3) (4) (5)
Programmȱ49:ȱBerechneterȱKonstruktorȱelementȱistȱhierarchischȱgeschachteltȱ Ergebnis Hugo Mueller
DieȱInhaltsausdrückeȱfürȱdieȱBildungȱderȱXDMȬKnotenȱwerdenȱnunȱinȱGestaltȱvonȱ SequenzenȱmitȱatomarenȱWertenȱangereichert.ȱ XQUERY element Name{ 'hallo', element Vorname{ 'Hugo', 1, 2 }, element Zuname{ ('Mueller', 'a', 'b') } }
Programmȱ50:ȱInhaltsausdrückeȱinȱGestaltȱvonȱSequenzenȱausȱatomarenȱWertenȱ Ergebnis hallo
120ȱ
(1) (2) (3) (4) (5)
6.2ȱKonstruktorenȱzurȱErzeugungȱvonȱXDMȬKnotenȱ Hugo 1 2 Mueller a b
WieȱausȱdemȱErgebnisȱersichtlichȱist,ȱführtȱderȱatomareȱWertȱȇhalloȇȱinȱProgrammȬ zeileȱ (2)ȱ zuȱ demȱ Wertȱ halloȱ imȱ XMLȬElementȱ Name.ȱ Hieraufȱ folgenȱ sodannȱ dieȱ hierarchischȱuntergeordnetenȱ XMLȬElementeȱ Vornameȱundȱ Zuname.ȱ Dieȱ jeweiligeȱ Sequenzȱ ausȱ atomarenȱ Wertenȱ inȱ Programmzeileȱ (3)ȱ undȱ (4)ȱ wirdȱ zuȱ einemȱ ErȬ gebniswertȱzusammengefasst.ȱDieȱeinzelnenȱWerteȱwerdenȱhierbeiȱdurchȱLeerzeiȬ chenȱ voneinanderȱ getrennt.ȱ Einȱ XMLȬElement,ȱ demȱ sowohlȱ Textwerteȱ alsȱ auchȱ weitereȱXMLȬElementeȱuntergeordnetȱsind,ȱbezeichnetȱmanȱauchȱalsȱeinȱkompleȬ xesȱXMLȬElement.ȱ
Dokumentknoten Einȱ Dokumentknotenȱ istȱ derȱ hierarchischȱ höchsteȱ Repräsentantȱ einesȱ XDMȬ Baumes.ȱ Erȱ istȱ jedochȱ insoweitȱ einȱ virtuellerȱ Knoten,ȱ alsȱ erȱ inȱ derȱ textförmigenȱ Ausgabeȱeinesȱ XMLȬDokumentesȱnichtȱerscheint.ȱ Einȱ Dokumentknotenȱ wirdȱmitȱ Einsatzȱ desȱ berechnetenȱ Konstruktorsȱ documentȱ ausgeprägt.ȱ Dieȱ hierbeiȱ entsteȬ hendeȱReferenzȱaufȱdasȱKnotenexemplarȱwirdȱinȱeineȱXQueryȬVariableȱoderȱeineȱ Sequenzȱgespeichert.ȱ Imȱ folgendenȱ UMLȬDiagrammȱ istȱ zuȱ sehen,ȱ Knotenȱ welcherȱ Artenȱ einemȱ DokuȬ mentknotenȱuntergeordnetȱwerdenȱkönnen.ȱȱ DasȱKnotendiagrammȱzeigt,ȱdassȱXDMȬKnotenȱderȱdargestelltenȱvierȱArtenȱeinemȱ KnotenȱvomȱTypȱdocumentȱuntergeordnetȱseinȱkönnen.ȱAuchȱatomareȱWerteȱsindȱ möglich.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
document
element * * * * *
text comment processing-instruction atomarer Wert
ȱ
Abbildungȱ41:ȱDerȱKonstruktorȱdocumentȱprägtȱeinenȱXDMȬDokumentknotenȱausȱ
121ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ DieȱSyntaxȱdesȱberechnetenȱKonstruktorsȱdocumentȱistȱsehrȱeinfachȱundȱlautetȱwieȱ folgt.ȱ ȱ
document { Inhaltsausdruck }
ȱ Syntaxȱ18:ȱBerechneterȱKonstruktorȱdocumentȱ
Wieȱ manȱ sieht,ȱ hatȱ einȱ XDMȬDokumentknotenȱ keinenȱ Namen.ȱ Imȱ geschweiftenȱ KlammernpaarȱwirdȱeinȱInhaltsausdruckȱangegeben.ȱErȱbestehtȱausȱeinerȱSequenzȱ vonȱ Knotenȱ derȱ inȱ Abbildungȱ 41ȱ aufgeführtenȱ abhängigenȱ Knotenarten.ȱ Auchȱ atomareȱ Werteȱ sindȱ angebbar.ȱ Wieȱ imȱ UMLȬDiagrammȱ auchȱ ersichtlichȱ ist,ȱ sindȱ Attributknotenȱnichtȱzugelassen.ȱ Unterȱ einemȱ Dokumentknotenȱ könnenȱ mehrereȱ Wurzelknotenȱ vomȱ Typȱ elementȱ angeordnetȱwerden.ȱDasȱausȱdemȱDokumentknotenȱmitȱallȱseinenȱuntergeordneȬ tenȱ Knotenȱ generierteȱ XMLȬDokumentȱ istȱ beiȱ mehrerenȱ Wurzelknotenȱ jedochȱ nichtȱmehrȱwohlgeformt.ȱDennȱWohlgeformtheitȱerlaubtȱnurȱeinenȱXMLȬElementȬ knotenȱalsȱexterneȱtextförmigeȱDokumentenwurzelȱinȱeinemȱXMLȬDokument.ȱ Beispiel:ȱDokumentȱbestehtȱausȱleeremȱXMLȬElementȱ InȱdieȱanonymeȱHauptsequenzȱvonȱXQueryȱsollȱeinȱEintragȱaufȱeinenȱDokumentȬ knotenȱ eingefügtȱ werden.ȱ Vonȱ ihmȱ sollȱ lediglichȱ dasȱ leereȱ XMLȬElementȱ Nameȱ abhängigȱsein.ȱ ȱ
ȱ Sequenz
ȱ ȱ
«Document» Dokument
1
«Element» Name
Abbildungȱ42:ȱArchitekturȱdesȱZusammenhangsȱzwischenȱHauptsequenz,ȱDokumentȬ knotenȱundȱElementknotenȱ
Dieȱ Umsetzungȱ derȱ obigenȱ Vorgabenȱ mitȱ berechnetenȱ Konstruktorenȱ lautetȱ inȱ XQueryȱsodannȱwieȱfolgt.ȱ XQUERY document{ element Name{} }
Programmȱ51:ȱXDMȬBaumȱbestehtȱausȱDokumentȬȱundȱElementknoten Ergebnis
122ȱ
(1) (2) (3) (4)
6.2ȱKonstruktorenȱzurȱErzeugungȱvonȱXDMȬKnotenȱ DasȱausgegebeneȱXMLȬDokumentȱbestehtȱausȱdemȱleerenȱXMLȬElement.ȱDerȱDoȬ kumentknotenȱimȱXDMȬBaumȱistȱnurȱinternȱvorhandenȱundȱwirdȱnichtȱausgegeȬ ben.ȱ Beispiel:ȱDokumentȱbestehtȱausȱgeschachteltenȱXMLȬElementenȱ InȱdieȱanonymeȱHauptsequenzȱvonȱXQueryȱsollȱeinȱDokumentknotenȱeingehängtȱ werden.ȱVonȱihmȱsollȱdasȱXMLȬElementȱNameȱabhängigȱsein.ȱDiesemȱWurzeleleȬ mentȱ Nameȱ sollenȱ dieȱ beidenȱ Elementknotenȱ Vornameȱ mitȱ demȱ Wertȱ Hugoȱ undȱ ZunameȱmitȱdemȱWertȱMüllerȱhierarchischȱuntergeordnetȱsein.ȱ ȱ ȱ
ȱ
Sequenzȱ ȱ
ȱ
ȱ
«Document» Dokument
«Element» Name 1
ȱ
ȱ
1 1
«Element» Vorname «Element» Zuname
ȱ
1 1
«Wert» Hugo «Wert» Mueller
ȱ
ȱ
Abbildungȱ43:ȱDokumentȱmitȱgeschachteltenȱXMLȬElementenȱ
DieȱUmsetzungȱdesȱModelsȱinȱdieȱSpracheȱXQueryȱundȱdamitȱdieȱErzeugungȱdesȱ entsprechendȱ strukturiertenȱ XDMȬBaumesȱ zeigtȱ dasȱ folgendeȱ Programmȱ 52,ȱ dasȱ dieȱhierfürȱerforderlichenȱberechnetenȱKonstruktorenȱeinsetzt.ȱ XQUERY document{ element Name{ element Vorname{'Hugo' }, element Zuname{ 'Mueller'} } }
(1) (2) (3) (4) (5) (6) (7)
Programmȱ52:ȱXDMȬBaumȱbestehtȱausȱDokumentȬȱundȱgeschachteltenȱElementknotenȱ Ergebnis Hugo Mueller
Imȱ folgendenȱ Beispielȱ wirdȱ einȱ XDMȬBaumȱ aufgebaut,ȱ derȱ alleȱ zulässigenȱ KnoȬ tenartenȱeinesȱXMLȬElementknotensȱundȱeinenȱatomarenȱWertȱenthält.ȱȱ ȱ
123ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ 1
ȱ
«Attribut» Kunde_Nr
«Element» K001:Kunde
ȱ ȱ
«Document» Dokument
ȱ
1
1
«Processing-Instruction» XML_Parser_Y
1
«Element» Name
ȱ ȱ 1
ȱ ȱ
1
ȱ
1
1
«Element» Vorname
1
«Element» Zuname
1
«Wert» K001
1
«Wert» Argument
1 1
«Wert» Hugo «Wert» Mueller
«Comment» Kommentar «Textk» Text «Atom» Hallo
ȱ
ȱ
Abbildungȱ44:ȱKnotenȱallerȱKnotenartenȱunterȱdemȱElementknotenȱElementȱ
Dieȱ auszuprägendenȱ Knotenȱ werdenȱ unterȱ demȱ Elementknotenȱ Kundeȱ desȱ KunȬ denȱmitȱderȱKundennummerȱK001ȱangeordnet.ȱDasȱneueȱDokumentmodellȱbauenȱ wirȱaufȱderȱBasisȱvonȱAbbildungȱ39ȱauf.ȱDieȱimpliziteȱSequenzȱvonȱXQueryȱstellenȱ wirȱhinfortȱnurȱnochȱinȱAusnahmefällenȱimȱUMLȬDiagrammȱdar.ȱ Bevorȱ wirȱ dieȱ obigeȱ Architekturȱ inȱ einemȱ korrespondierendeȱ XQueryȬProgrammȱ implementieren,ȱ benötigenȱ wirȱ nochȱ dieȱ Syntaxȱ derȱ berechnetenȱ Konstruktorenȱ fürȱȱ – – – –
einȱAttributȱ einenȱVerarbeitungshinweisȱ einenȱKommentarȱundȱ einenȱText.ȱ
DieȱSyntaxȱdesȱberechnetenȱKonstruktorsȱattributeȱlautet:ȱ ȱ
attribute XML-Attributname {[ Inhaltsausdruck ]}
ȱ Syntaxȱ19:ȱBerechneterȱKonstruktorȱattributeȱ
DieȱSyntaxȱdesȱberechnetenȱKonstruktorsȱprocessingȬinstruction lautet:ȱ ȱ
processing-instruction Zielsystemname {[ Inhaltsausdruck ]}
ȱ Syntaxȱ20:ȱBerechneterȱKonstruktorȱprocessingȬinstructionȱ
DieȱSyntaxȱdesȱberechnetenȱKonstruktorsȱcomment lautet:ȱ
124ȱ
6.2ȱKonstruktorenȱzurȱErzeugungȱvonȱXDMȬKnotenȱ ȱ ȱ
comment { Inhaltsausdruck }
Syntaxȱ21:ȱBerechneterȱKonstruktorȱcommentȱ
DieȱSyntaxȱdesȱberechnetenȱKonstruktorsȱtext lautet:ȱ ȱ ȱ
text { Inhaltsausdruck }
Syntaxȱ22:ȱBerechneterȱKonstruktorȱtextȱ
DieȱImplementierungȱderȱArchitekturȱinȱAbbildungȱ44ȱinȱXQueryȱsiehtȱsodannȱ wieȱfolgtȱaus.ȱ XQUERY document { element Kunde{ attribute Kunde_Nr{'K001'}, processing-instruction XML_Parser_Y{ 'Argument' }, element Name{ element Vorname{'Hugo'}, element Zuname{'Mueller'} }, comment{'Kommentar'}, text{'Text'}, 'Hallo' } }
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16)
Programmȱ53:ȱAbhängigeȱKnotenartenȱvonȱElementȬKnotenȱinȱberechnetenȱKonstruktoȬ renȱundȱAtom Ergebnis Hugo Mueller TextHallo
125ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Wieȱ imȱ obigenȱ Ergebnisȱ zuȱ sehenȱist,ȱwirdȱ derȱ Wertȱ einesȱatomarenȱ Wertes,ȱderȱ aufȱ einenȱ Textknotenȱ folgt,ȱ sieheȱ Programmzeileȱ (13)ȱ undȱ (14),ȱ demȱ Wertȱ desȱ TextknotensȱohneȱeineȱLeerstelleȱangefügt.ȱDieserȱSachverhaltȱistȱinȱAbbildungȱ44ȱ nichtȱdargestellt.ȱ DasȱZusammenfassenȱderȱWerteȱeinerȱFolgeȱvonȱberechnetenȱTextȬKonstruktorenȱ undȱatomarenȱWertenȱwirdȱnunȱinȱzweiȱBeispielenȱuntersucht.ȱ Beispielȱ Imȱ folgendenȱ Programmȱ54ȱ wirdȱ derȱ ElementȬKnotenȱinȱ Zeileȱ (4)ȱ ausgeprägt.ȱInȱ Zeileȱ (3)ȱ gehtȱ ihmȱ eineȱ Sequenzȱ ausȱ atomarenȱ Wertenȱ voraus.ȱ Desgleichenȱ folgtȱ ihmȱ eineȱ Sequenzȱ ausȱ atomarenȱ Wertenȱ inȱ Zeileȱ (5).ȱ Imȱ Ergebnisȱ istȱ ersichtlich,ȱ dassȱ XQueryȱ dieȱ Sequenzȱ derȱ atomarenȱ Werteȱ zuȱ einemȱ textförmigenȱ Wertȱ zuȬ sammenbautȱundȱinȱeinemȱXDMȬTextknotenȱablegt.ȱDieȱatomarenȱWerteȱimȱProȬ grammȱwerdenȱimȱErgebnisȱdurchȱeinȱLeerzeichenȱgetrennt.ȱ ȱ XQUERY element Kunde{ 1, 'hallo', element Name{}, 2, 'Freunde' }
(1) (2) (3) (4) (5) (6)
Programmȱ54:ȱEineȱSequenzȱausȱatomarenȱWertenȱwerdenȱzuȱeinemȱTextknotenȱzusamȬ mengefasst Ergebnis 1 hallo 2 Freunde
Beispielȱ ImȱfolgendenȱProgrammȱ55ȱwirdȱderȱleereȱElementȬKnotenȱinȱZeileȱ(7)ȱausgeprägt.ȱ InȱZeileȱ(3)ȱbisȱ(6)ȱgehtȱihmȱeineȱSequenzȱausȱzweiȱTextȬKnotenȱvoraus.ȱInȱZeileȱ(9)ȱ undȱ(10)ȱfolgtȱihmȱeinȱTextȬKnoten,ȱderȱvonȱeinemȱZeichenkettenatomȱinȱZeileȱ(11)ȱ gefolgtȱwird.ȱȱ Wieȱ ausȱ demȱ Ergebnisȱ zuȱ ersehenȱ ist,ȱ bautȱ XQueryȱ ausȱ derȱ Sequenzȱ derȱ beidenȱ berechnetenȱTextȬKonstruktorenȱinȱZeileȱ(3)ȱbisȱ(6)ȱnurȱeinenȱXDMȬTextknotenȱimȱ resultierendenȱ XDMȬBaumȱauf.ȱDieȱ TextwerteȱderȱbeidenȱKonstruktorenȱwerdenȱ hierbeiȱ ohneȱ Leerzeichenȱ miteinanderȱ verkettet.ȱ Genauȱ soȱ verfährtȱ XQueryȱ mitȱ einerȱSequenzȱausȱeinemȱTextȬKonstruktorȱundȱeinemȱatomarenȱWertȱwieȱinȱProȬ grammzeileȱ(9)ȱbisȱ(11)ȱdargestellt.ȱAuchȱderȱWertȱdesȱberechnetenȱTextȬKonstrukȬ torsȱundȱderȱhieraufȱfolgendeȱatomareȱWertȱwerdenȱinȱeinemȱgemeinsamenȱXDMȬ
126ȱ
6.2ȱKonstruktorenȱzurȱErzeugungȱvonȱXDMȬKnotenȱ Textknotenȱzusammengefasst.ȱIhreȱAusgangswerteȱwerdenȱhierbeiȱebenfallsȱnichtȱ mitȱeinemȱLeerzeichenȱgetrennt.ȱ ȱ XQUERY element Kunde{ text{'hallo' }, text{'Freunde' }, element Name{ }, text{'und ein Text' }, 'gefolgt von einem Atom' }
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
Programmȱ55:ȱSequenzenȱausȱTextknotenȱundȱatomarenȱWertenȱwerdenȱzuȱeinemȱTextȬ knotenȱzusammengefasst Ergebnis halloFreunde und ein Textgefolgt von einem Atom
6.2.1 Übungen 1) ErzeugenȱSieȱinȱderȱTechnikȱderȱdirektenȱKonstruktorenȱdasȱelementzentrierteȱ XMLȬDokumentȱmitȱdemȱWurzelelementȱKunde.ȱEsȱbestehtȱausȱdenȱuntergeȬ ordnetenȱ XMLȬElementenȱ Kunde_Nr,ȱ Anrede,ȱ Vorname,ȱ Zuname,ȱ Strasse,ȱ PLZȱ undȱOrt.ȱFürȱdieȱjeweiligenȱWerteȱverwendenȱSieȱdieȱDatenȱdesȱKundenȱK001,ȱ HerrȱHugoȱMüller,ȱGartenstr.ȱ4a,ȱ69123,ȱHeidelberg.ȱ 2) ErzeugenȱSieȱinȱderȱTechnikȱderȱdirektenȱKonstruktorenȱdasȱattributzentrierteȱ XMLȬDokumentȱmitȱdemȱWurzelelementȱKunde.ȱEsȱbestehtȱausȱdenȱbeigeordȬ netenȱ XMLȬAttributenȱ Kunde_Nr,ȱAnrede,ȱVorname,ȱ Zuname,ȱStrasse,ȱ PLZȱ undȱ Ort.ȱ Fürȱ dieȱ jeweiligenȱ Werteȱ verwendenȱ Sieȱ dieȱ Datenȱ desȱ Kundenȱ K001,ȱ HerrȱHugoȱMüller,ȱGartenstr.ȱ4a,ȱ69123,ȱHeidelberg.ȱ 3) ErzeugenȱSieȱinȱderȱTechnikȱderȱdirektenȱKonstruktorenȱdasȱgemischteȱXMLȬ DokumentȱmitȱdemȱWurzelelementȱKunde.ȱEsȱbestehtȱausȱdemȱbeigeordnetenȱ XMLȬAttributenȱKunde_NrȱundȱdenȱuntergeordnetenȱXMLȬElementenȱAnrede,ȱ Vorname,ȱZuname,ȱStrasse,ȱPLZȱ undȱ Ort.ȱ Fürȱ dieȱ jeweiligenȱ Werteȱ verwendenȱ SieȱdieȱDatenȱdesȱKundenȱK001,ȱHerrȱHugoȱMüller,ȱGartenstr.ȱ4a,ȱ69123,ȱHeiȬ delberg.ȱ ȱ
127ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ 4) ErzeugenȱSieȱinȱderȱTechnikȱderȱdirektenȱKonstruktorenȱdasȱelementzentrierteȱ XMLȬDokumentȱmitȱdemȱWurzelelementȱKunde.ȱEsȱbestehtȱausȱdenȱuntergeȬ ordnetenȱ XMLȬElementenȱ Kunde_Nr,ȱ Anrede,ȱ Vorname,ȱ Zuname,ȱ Strasse,ȱ PLZȱ undȱOrt.ȱJedesȱElementȱbeschreibenȱSieȱnochȱmitȱeinemȱXMLȬKommentar.ȱFürȱ dieȱjeweiligenȱWerteȱverwendenȱSieȱdieȱDatenȱdesȱKundenȱK001,ȱHerrȱHugoȱ Müller,ȱGartenstr.ȱ4a,ȱ69123,ȱHeidelberg.ȱ 5) DieȱÜbungenȱ1)ȱbisȱ4)ȱverwirklichenȱSieȱmitȱberechnetenȱKonstruktoren.ȱ
6.3 Datentypen in XQuery ImȱVergleichȱzuȱSQLȱbesitztȱXQueryȱeinȱsehrȱumfangreichesȱDatentypsystem.ȱEsȱ istȱ inȱ derȱ Datenbeschreibungsspracheȱ (Dataȱ Descriptionȱ Language:ȱ DDL)ȱ XMLȱ Schemaȱ festgelegt.ȱ Dieȱ hierinȱ definiertenȱ Begriffe,ȱ wieȱ beispielsweiseȱ dieȱ Namenȱ vonȱ Datentypenȱ undȱ Namenȱ vonȱ Funktionenȱ zurȱ Datentypkonvertierung,ȱ liegenȱ imȱ Namensraumȱ http://www.w3.org/2001/XMLSchema.ȱ Dieserȱ Namensraumȱ istȱ anȱ denȱNamensraumpräfixȱxsȱ(XMLȱSchema)ȱstandardmäßigȱgebunden.ȱ AuchȱistȱXQueryȱeineȱtypstrengeȱSprache.ȱDasȱbedeutet,ȱdassȱjederȱOperatorȱundȱ jedeȱFunktionȱOperandenȱbzw.ȱArgumenteȱerwartet,ȱdieȱinȱeinemȱdefiniertenȱTypȱ anzuliefernȱ sind.ȱ Beiȱ unserenȱ einführendenȱ Lernschrittenȱ habenȱ wirȱ unsȱ umȱ dieȱ DatentypenȱderȱverwendetenȱLiteraleȱbeiȱderȱAngabeȱvonȱatomarenȱWertenȱnichtȱ gekümmert.ȱDiesȱwollenȱwirȱnunȱnachholen.ȱ
Datentypen von Literalen Inȱ XQueryȱ gibtȱ esȱ nurȱ vierȱ Artenȱ anȱ Literalen,ȱ dreiȱ numerischeȱ Literalartenȱ undȱ dasȱZeichenkettenliteral.ȱ Nameȱ
XMLȱSchemaȱNameȱ
Beispielȱ
Dualzahlȱ
xs:integerȱ
123ȱ
DezimaleȱFestpunktzahlȱ
xs:decimalȱ
123.45ȱ
Gleitpunktzahlȱ
xs:doubleȱ
1.123E3ȱ
Zeichenketteȱ
xs:stingȱ
ȇhalloȇ,ȱȈFreundeȈȱ
Tabelleȱ16:ȱDatentypenȱvonȱLiteralenȱinȱXQueryȱ
LiteraleȱdieserȱArtenȱwerdenȱalsȱatomareȱWerteȱinȱSequenzenȱeingebrachtȱoderȱinȱ Ausdrückenȱ alsȱ konstanteȱ Operandenȱ undȱ inȱ Funktionsaufrufenȱ alsȱ konstanteȱ Argumenteȱverwendet.ȱ
Datentypen der Werte von XML-Elementen und XML-Attributen Wennȱ einȱ Wertȱ einesȱ XMLȬElementesȱ oderȱ einesȱ XMLȬAttributesȱ nichtȱ anhandȱ einesȱ XMLȬSchemasȱ vonȱ DB2ȱ beimȱ Abspeichernȱ validiertȱ wurde,ȱ soȱ wirdȱ derȱ jeȬ
128ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ weiligeȱ Wertȱ untypisiertȱ inȱ derȱ Datenbankȱ gespeichert.ȱ Dieserȱ untypisierteȱ ZuȬ standȱbeiȱeinemȱWertȱeinesȱXMLȬElementesȱwirdȱinȱDB2ȱmitȱdemȱTypȱxdt:untypedȱ imȱ Elementknotenȱ festgehalten.ȱ Derȱ untypisierteȱ Wertȱ einesȱ Attributsȱ wirdȱ mitȱ demȱ Typȱ xdt:untypedAtomicȱ imȱ Attributknotenȱ vermerkt.ȱ Wirdȱ jedochȱ einȱ XMLȬ Dokumentȱ beimȱ Abspeichernȱ vonȱ DB2ȱ unterȱ Verwendungȱ einesȱ XMLȬSchemasȱ validiert,ȱsoȱwerdenȱdieȱDatentypinformationenȱausȱdemȱXMLȬSchemaȱinȱdieȱentȬ sprechendenȱ ElementȬȱ undȱ Attributknotenȱ eingetragenȱ undȱ auchȱ dieȱ getyptenȱ Werteȱ inȱ dieȱ Knotenȱ eingestellt.ȱ Dasȱ Ganzeȱ wirdȱ sodannȱ alsȱ einȱ Wertȱ desȱ SQL/XMLȬTypsȱXMLȱgespeichert.ȱȱ WirdȱanschließendȱderȱXMLȬWertȱinȱXQueryȱeingelesenȱundȱinȱeinemȱXDMȬBaumȱ dargestellt,ȱ kannȱ einȱ solchermaßenȱ untypisierterȱ Wertȱ ausȱ einemȱ ElementȬȱ bzw.ȱ AttributknotenȱmitȱderȱXQueryȬFunktionȱfn:data()ȱausgelesenȱwerden.ȱDieȱFunktiȬ onȱfn:data()ȱstelltȱdenȱWertȱalsȱuntypisiertenȱWertȱzurȱVerfügung,ȱfallsȱdasȱXMLȬ Dokumentȱ beimȱ Speichernȱ nichtȱ validiertȱ wurde.ȱ Wurdeȱ esȱ validiert,ȱ wirdȱ derȱ WertȱinȱdemȱbeimȱValidierenȱverwendetenȱDatentypȱvonȱfn:data()ȱzurückgegeben.ȱȱ BevorȱeinȱuntypisierterȱWertȱverarbeitetȱwerdenȱkann,ȱmussȱerȱinȱeinenȱDatentypȱ konvertiertȱ werden,ȱ derȱfürȱ denȱ verarbeitendenȱ Operatorȱ oderȱ dieȱ verarbeitendeȱ Funktionȱpassendȱist.ȱȱ WirdȱeinȱElementknotenȱmitȱeinemȱdirektenȱoderȱberechnetenȱKonstruktorȱausgeȬ prägt,ȱsoȱistȱderȱDatentypȱseinesȱWertesȱebenfallsȱuntypisiert,ȱinȱderȱTerminologieȱ vonȱXQueryȱsomitȱxdt:untyped.ȱMitȱeinemȱsolchermaßenȱtypisiertenȱWertȱkönnenȱ nurȱinȱbeschränktemȱMaßeȱOperationenȱausgeführtȱwerden.ȱErstȱnachȱeinerȱexpliȬ zitenȱDatentypumwandlungȱinȱeinenȱgeeignetenȱTypȱsindȱdieȱfürȱdiesenȱTypȱdefiȬ niertenȱOperationenȱundȱFunktionenȱmöglich.ȱ ImȱfolgendenȱProgrammȱ56ȱwirdȱeinȱElementknotenȱmitȱeinemȱdirektenȱKonstrukȬ torȱausgeprägt.ȱDerȱElementwertȱsollȱ5000.00ȱEuroȱsein.ȱDaȱderȱWertȱdesȱdirektenȱ Konstruktorsȱnichtȱvalidiertȱwird,ȱwirdȱderȱElementwertȱimȱXDMȬKnotenȱuntypiȬ siertȱ imȱ Datentypȱ xdt:untypedȱ gespeichert.ȱ Dieȱ hierbeiȱ entstehendeȱ Sequenzȱ mitȱ demȱ Elementknotenȱ wirdȱ mitȱ derȱ XQueryȬVariablenȱ $Sequenzȱ referenziert.ȱ AnȬ schließendȱwirdȱderȱElementwertȱmitȱderȱFunktionȱfn:data()ȱausȱdemȱElementknoȬ tenȱentnommenȱundȱausgegeben.ȱBeiȱderȱRückgabeȱdesȱuntypisiertenȱWertesȱbeȬ hältȱ dieserȱ seinenȱ Datentypȱ xdt:untypedȱ bei.ȱ Einenȱ untypisiertenȱ Wertȱ kannȱ XQueryȱ zwarȱ ausgeben.ȱ Arithmetischeȱ Operationenȱ beispielsweiseȱ könnenȱ mitȱ ihmȱjedochȱnichtȱdurchgeführtȱwerden.ȱ ȱ ȱ ȱ ȱ ȱ ȱ
129ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY let $Sequenz := 5000.00 return fn:data( $Sequenz )
(1) (2) (3) (4)
Programmȱ56:ȱUntypisierterȱElementwertȱ Ergebnis 5000.00
SollȱaufȱdenȱRückgabewertȱvonȱfn:data()ȱbeispielsweiseȱderȱliteraleȱdezimaleȱFestȬ kommawertȱ1.00ȱhinzuaddiertȱwerden,ȱsoȱmussȱderȱuntypisierteȱWertȱvorherȱmitȱ derȱ Typkonvertierungsfunktionȱxs:decimal()ȱ inȱ eineȱdezimaleȱFormȱ gebrachtȱ werȬ den,ȱsieheȱProgrammzeileȱ(4).ȱ XQUERY let $Sequenz := 5000.00 return xs:decimal(fn:data( $Sequenz )) + 1.00
(1) (2) (3) (4)
Programmȱ57:ȱKonvertierungȱvonȱxdt:untypedȱnachȱxs:decimalȱ Ergebnis 5001
NachdemȱwirȱnunȱdieȱBetrachtungȱvonȱDatentypenȱeingeleitetȱhaben,ȱwollenȱwirȱ sieȱintensivȱuntersuchen.ȱ
6.3.1 Eingebauten Datentypen in XQuery von DB2 InȱXQueryȱvonȱDB2ȱgibtȱesȱ48ȱinȱdieȱSpracheȱeingebauteȱDatentypen.ȱSieȱsindȱinȱ denȱ beidenȱ Namensräumenȱ http://www.w3.org/2001/XMLȬSchemaȱ undȱ http://www.ȱ w3.org/2005/xpathȬdatatypesȱ vereinbart.ȱ Datentypenȱ desȱ erstenȱ Namensraumesȱ werdenȱmitȱdemȱPräfixȱxsȱundȱdieȱdesȱzweitenȱNamensraumesȱmitȱdemȱPräfixȱxdtȱ qualifiziert.ȱ Derȱ Präfixȱ xsȱ istȱ dieȱ Abkürzungȱ fürȱ XMLȱ Schemaȱ Namensraum.ȱ Derȱ PräfixȱxdtȱstehtȱfürȱXQueryȱTypȱNamensraum.ȱȱ Dieȱ folgendeȱ Abbildungȱ 45ȱ zeigtȱ eineȱ grobeȱ Einteilungȱ derȱ Datentypenȱ vonȱ XQuery.ȱDerȱWurzeltypȱheißtȱxs:anyType.ȱ ȱ ȱ ȱ ȱ ȱ ȱ
130ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ ȱ
xs:anyType
ȱ ȱ xs:anySimpleType
ȱ
xdt:untyped
ȱ ȱ
xs:anyAtomicType
ȱ ȱ
xdt:untypedAtomic
ȱ ȱ ȱ
numerische Datentypen
ȱ
zeichenförmige Datentypen
Datum- und Zeit-Datentypen
sonstige Datentypen
ȱ
ȱ Abbildungȱ45:ȱGrobeinteilungȱderȱDatentypenȱvonȱXQueryȱ
DieȱinȱkursiverȱSchriftȱgeschriebenenȱDatentypenȱsindȱabstrakteȱDatentypen.ȱVonȱ ihnenȱ kannȱ manȱ keineȱ Werteȱ ausprägen.ȱ Sieȱ dienenȱ lediglichȱ zurȱ strukturiertenȱ EinteilungȱundȱBildungȱvonȱTypȬȱbzw.ȱBegriffshierarchien.ȱDerȱGeneralisierungsȬ pfeilȱsagtȱaus,ȱwelcherȱDatentypȱderȱübergeordneteȱist,ȱvonȱdemȱderȱuntergeordȬ neteȱ Datentypȱ alleȱ Eigenschaftenȱ erbt.ȱ Soȱ erbenȱ vomȱ Datentypȱ xs:anyAtomicTypeȱ dieȱ 43ȱ ihmȱ untergeordneteȱ Datentypenȱ dessenȱ Eigenschaften,ȱ entwederȱ direktȱ oderȱindirekt.ȱȱ Dasȱ sichȱ hierausȱ ergebendeȱ GeneralisierungsȬ/Spezialisierungsdiagrammȱ istȱ verȬ hältnismäßigȱumfangreich.ȱEsȱwirdȱdeshalbȱinȱvierȱTeildiagrammeȱaufgeteilt,ȱinȱjeȱ einȱDiagrammȱderȱ – – – –
numerischenȱDatentypenȱ zeichenförmigenȱDatentypenȱ DatumsȬȱundȱZeitȬDatentypenȱundȱ sonstigenȱDatentypen.ȱ
AllgemeinȱgesprochenȱistȱeinȱDatentypȱdieȱBeschreibungȱvonȱzweiȱMengen,ȱeinerȱ Wertemengeȱ undȱ einerȱ Operationsmenge.ȱ Dieȱ Wertemengeȱ wirdȱ inȱ XQueryȱ oftȱ auchȱalsȱWerteraumȱ(engl.ȱvalueȱ space)ȱbezeichnet.ȱDieȱElementeȱderȱ OperationsȬ mengeȱ sindȱ dieȱ Operationen,ȱ mitȱ denenȱ dieȱ Werteȱ derȱ Wertemengeȱ verknüpftȱ bzw.ȱverarbeitetȱwerdenȱkönnen.ȱȱ InȱXQueryȱkommtȱzuȱdiesenȱbeidenȱMengenȱnochȱdieȱDarstellungsmengeȱhinzu.ȱ SieȱwirdȱauchȱalsȱlexikalischerȱRepräsentationsraumȱbezeichnet.ȱErȱbestehtȱausȱallenȱ möglichenȱDarstellungenȱderȱWerteȱderȱWertemengeȱinȱderenȱexternenȱundȱtextȬ
131ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ förmigenȱGestalten.ȱDieȱWerteȱerscheinenȱhierinȱinȱihrerȱanȱdenȱMenschenȱgerichȬ tetenȱ externenȱ Formatierung.ȱ Imȱ Rahmenȱ desȱ Serialisierungsprozessesȱ wirdȱ dieȱ interneȱ Darstellungȱ einesȱ Wertesȱ inȱ eineȱ externeȱ Repräsentationȱ umgeformt.ȱ Dieȱ hierbeiȱvorgeseheneȱStandardrepräsentationȱeinesȱWertesȱbezeichnetȱmanȱauchȱalsȱ seineȱkanonischeȱForm.ȱ DasȱfolgendeȱBeispielȱzeigtȱdieȱkanonischeȱlexikalischeȱRepräsentationȱderȱWerteȱ derȱpositivenȱEinsȱundȱderȱnegativenȱEins.ȱ XQUERY 1.99, –1.99;
(1) (2)
Programmȱ58:ȱSerialisierungȱderȱDezimalzahlenȱ1,99ȱundȱ–1,99 Ergebnis 1.99 –1.99
Imȱ Ergebnisȱ istȱ zuȱ sehen,ȱ dassȱ dieȱ kanonischeȱ Formȱ derȱ positivenȱ Zahlenȱ ohneȱ undȱdieȱderȱnegativenȱZahlenȱmitȱVorzeichenȱgeschriebenȱwird.ȱDasȱTrennzeichenȱ desȱganzzahligenȱundȱdesȱgebrochenenȱTeilsȱistȱderȱamerikanischeȱDezimalpunkt.ȱ Imȱ folgendenȱ Programmȱ 59ȱ istȱ inȱ derȱ Klauselȱ returnȱ einȱ Vergleichsausdruckȱ noȬ tiert.ȱDieȱkanonischeȱlexikalischeȱFormȱdesȱAusdrucksergebnisses,ȱalsoȱdesȱWahrȬ heitswertes,ȱistȱhierȱdieȱZeichenketteȱtrue.ȱ ȱ XQUERY let $V1 := 1 let $V2 := 2 return ($V1 < $V2);
(1) (2) (3) (4)
Programmȱ59:ȱSerialisierungȱdesȱWahrheitswertesȱwahr Ergebnis true
Wieȱmanȱsieht,ȱbeschreibtȱeinȱDatentyp,ȱgenauerȱgesagtȱeinȱkonkreterȱDatentyp,ȱinȱ XQueryȱ einȱ Datenobjekt,ȱ alsoȱ einenȱ Datenwertȱ inȱ dessenȱ internerȱ undȱ inȱ dessenȱ externerȱlexikalischerȱForm.ȱAlleȱmöglichenȱWerte,ȱdieȱderartȱbeschriebenȱwerdenȱ können,ȱbildenȱdieȱWertemengeȱdesȱDatentyps.ȱDieȱunterschiedlichenȱDatentypenȱ umfassenȱ teilweiseȱunterschiedlicheȱ Operationen.ȱ Zweiȱ Operationenȱ sindȱ hierbeiȱ beiȱjedemȱDatentypȱanzutreffen,ȱ – dieȱKonstruktoroperationȱundȱȱ – dieȱTypumwandlungsoperation.ȱ ȱ
132ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ
Konstruktor Mitȱ demȱ Einsatzȱ einesȱ Typkonstruktorsȱ wirdȱ einȱ Datenobjektȱ einesȱ Datentypsȱ inȱ seinerȱ internȱ codiertenȱ Formȱ ausgeprägt.ȱ Mitȱ derȱ Typumwandlungsoperationȱ wirdȱeinȱDatenobjektȱeinesȱDatentypsȱinȱeinȱgleichwertigesȱDatenobjektȱeinesȱanȬ derenȱDatentypsȱumgewandelt.ȱ DerȱNameȱeinesȱKonstruktorsȱistȱinȱXQueryȱidentischȱmitȱdemȱNamenȱdesȱDatenȬ typs,ȱ vomȱdemȱderȱ Konstruktorȱ Datenobjekteȱausprägt.ȱEbensoȱ wieȱdieȱDatentyȬ penȱ sindȱ dieȱ Konstruktorenȱ inȱ denȱ obenȱ aufgeführtenȱ Namensräumenȱ http://www.w3.org/2001/XMLSchemaȱ undȱ http://www.w3.org/2005/xpathȬdatatypesȱ enthalten.ȱ EinȱKonstruktorȱhatȱsyntaktischȱdieȱGestaltȱeinerȱFunktion.ȱSeineȱeinfacheȱSyntaxȱ beschreibtȱdasȱfolgendeȱSyntaxdiagramm.ȱ ȱ
Typname( Wert )
Syntaxȱ23:ȱAufbauȱeinesȱKonstruktorsȱ
FürȱeinenȱSQLȬKennerȱistȱdieseȱSchreibweiseȱgeläufig.ȱSieȱistȱdieȱeinfacheȱArtȱderȱ Datentypkonvertierung.ȱ DieȱfolgendenȱBeispieleȱzeigenȱdieȱeinfacheȱHandhabungȱeinesȱKonstruktors.ȱ InȱdieȱimpliziteȱSequenzȱwirdȱeinȱdezimalerȱEintragȱeingefügt,ȱderȱausȱdemȱdeziȬ malenȱLiteralȱ1.99ȱimȱArgumentȱdesȱKonstruktorsȱxs:decimal()ȱhergeleitetȱwird.ȱ XQUERY xs:decimal( 1.99 ) Ergebnis 1.99
DasȱArgumentȱdesȱKonstruktorsȱxs:decimal()ȱistȱnunȱeinȱZeichenkettenliteralȱmitȱ demȱWertȱȇ1.99ȇ.ȱ XQUERY xs:decimal( '1.99' ) Ergebnis 1.99
DasȱArgumentȱdesȱKonstruktorsȱxs:decimal()ȱistȱjetztȱdieȱleereȱSequenzȱ().ȱ XQUERY xs:decimal( () ) Ergebnis Nichts, keine Ausgabe
DasȱArgumentȱdesȱKonstruktorsȱxs:decimal()ȱistȱimȱfolgendenȱBeispielȱeinȱdualerȱ Wert,ȱ derȱ vomȱ Konstruktorȱ xs:integer()ȱ ausgeprägtȱ wurde.ȱ Derȱ Wertȱ desȱ ArguȬ mentsȱdesȱKonstruktorsȱxs:integer()ȱistȱderȱganzzahligeȱDezimalwertȱ5.ȱ
133ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY xs:decimal( xs:integer(5) ) Ergebnis 5
Derȱ Wertȱ desȱ Konstruktorsȱ xs:decimal()ȱ wirdȱ vonȱ derȱ XQueryȬVariablenȱ $DeziȬ malzahlȱreferenziertȱundȱvonȱderȱKlauselȱreturnȱausgegeben.ȱ XQUERY let $Dezimalzahl := xs:decimal( 1.99 ) return $Dezimalzahl Ergebnis 1.99
WieȱmanȱanȱdiesenȱBeispielenȱerkennenȱkann,ȱistȱderȱKonstruktorȱxs:decimal()ȱeineȱ überladeneȱFunktion,ȱbeiȱwelcherȱderȱTypȱdesȱArgumentesȱdieȱÜberladungȱsteuȬ ert.ȱDiesȱgiltȱfürȱalleȱKonstruktorenȱvonȱXQuery.ȱ
Typumwandlung Dieȱ Umwandlungȱ desȱ Datentypsȱ einesȱ Wertesȱ erfolgtȱ mitȱ demȱ TypumwandȬ lungsausdruck.ȱ Erȱ istȱ einȱ dyadischerȱ Ausdruckȱ mitȱ demȱ Operatorȱ castȱ as.ȱ Linksȱ undȱ rechtsȱ desȱ Operatorsȱ stehtȱ hierbeiȱ einȱ Operand.ȱ Derȱ rechteȱ Operandȱ istȱ derȱ Datentyp,ȱinȱwelchenȱderȱWertȱdesȱlinkenȱOperandenȱumzuwandelnȱist.ȱDieȱSynȬ taxȱdesȱTypumwandlungsausdrucksȱistȱwieȱfolgt.ȱ ȱ ȱ
Ausdruck cast as Zieltyp [?]
ȱ Syntaxȱ24:ȱAufbauȱdesȱTypumwandlungsausdrucksȱ
DasȱoptionaleȱFragezeichenȱhinterȱdemȱZieltypȱgibtȱan,ȱdassȱderȱWertȱdesȱumzuȬ wandelndenȱ Ausdrucksȱ auchȱ dieȱ leereȱ Sequenzȱ seinȱ darf.ȱ Dasȱ UmwandlungserȬ gebnisȱistȱdannȱebenfallsȱdieȱleereȱSequenz.ȱDasȱFragezeichenȱentsprichtȱderȱMulȬ tiplizitätȱnullȱoderȱeinsȱ(UMLȱ0..1)ȱundȱwirdȱimȱenglischenȱalsȱoccurrenceȱindicatorȱ bezeichnet.ȱ DerȱTypumwandlungsausdruckȱistȱauchȱähnlichȱzuȱdenȱSpracheinrichtungenȱvonȱ SQL.ȱ Hierȱ istȱ dieseȱ Artȱ derȱ Typumwandlungȱ inȱ derȱ eingebautenȱ Funktionȱ CAST(ȱAusdruckȱASȱZieltyp)ȱbzw.ȱXMLCAST()ȱimplementiert.ȱ Dieȱ folgendenȱ Beispieleȱ gebenȱ einenȱ Eindruckȱ vonȱ derȱ Wirkungsweiseȱ desȱ TypȬ umwandlungsausdrucksȱmitȱcastȱasȱvonȱXQuery.ȱ XQUERY xs:integer(7) cast as xs:decimal
134ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ Ergebnis 7 XQUERY xs:integer(–7) cast as xs:decimal Ergebnis –7
LeereȱSequenzȱwirdȱimȱTypȱkonvertiert.ȱ XQUERY xs:integer(()) cast as xs:decimal ? Ergebnis Es wird kein Wert ausgegeben
ImȱErgebnisȱentsprichtȱdieȱAnwendungȱdesȱTypumwandlungsausdrucksȱdemȱdesȱ Konstruktors.ȱLediglichȱinȱderȱBehandlungȱderȱleerenȱSequenzȱunterscheidenȱsichȱ beide.ȱDieȱKonstruktortechnikȱverkraftetȱohneȱdenȱoccurrenceȱindicatorȱ–ȱdasȱFraȬ gezeichenȱ?ȱ–ȱeineȱleereȱSequenzȱalsȱEingabe.ȱImȱTypumwandlungsausdruckȱwirdȱ dieȱleereȱSequenzȱgesondertȱbehandelt.ȱ
6.3.2 Numerische Datentypen Dieȱ numerischenȱ Datentypenȱ vonȱ XQueryȱ zeigtȱ dasȱ Strukturdiagrammȱ inȱ Abbildungȱ46.ȱVomȱTypȱxs:anyAtomicTypeȱgibtȱesȱkeineȱWerte,ȱweilȱdieserȱTypȱeinȱ abstrakterȱTypȱist.ȱInȱUMLȱwirdȱdiesȱinȱkursiverȱSchriftȱausgedrückt.ȱDieȱvonȱihmȱ abgeleitetenȱ dreiȱ Typenȱ xs:decimal,ȱ xs:doubleȱ undȱ xs:floatȱ sindȱ dieȱ Basistypenȱ vonȱ XQuery,ȱderenȱWerteȱfürȱarithmetischeȱOperationenȱvorgesehenȱsind.ȱSieȱwerdenȱ auchȱalsȱprimitiveȱTypenȱbezeichnet,ȱweilȱsieȱvonȱfundamentalerȱNaturȱsind.ȱAlleȱ weiterenȱ numerischenȱ Datentypenȱ werdenȱ inȱ XQueryȱ alsȱ abgeleiteteȱ numerischeȱ Typenȱbezeichnet.ȱDieseȱTerminologieȱerscheintȱetwasȱkünstlich,ȱweilȱletztlichȱalleȱ DatentypenȱvonȱXQueryȱdirektȱoderȱindirektȱvomȱWurzeltypȱxs:anyTypeȱkonzepȬ tionellȱabgeleitetȱsind.ȱVomȱTypȱxs:decimalȱistȱxs:integerȱabgeleitet.ȱAufȱihmȱberuȬ henȱ12ȱSpielartenȱvonȱDualzahlenȱunterschiedlicherȱWertebereiche,ȱmitȱundȱohneȱ Vorzeichen.ȱ Inȱ derȱ folgendenȱ Tabelleȱ sindȱ dieȱ 16ȱ numerischenȱ Datentypenȱ hinsichtlichȱ ihrerȱ WertebereicheȱundȱihrerȱAnalogienȱzuȱDB2ȬSQLȱdargestellt.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
135ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ NameȱdesȱTypsȱ
Wertebereichȱ
DB2ȬSQLȱ
xs:decimalȱ
31ȬstelligeȱDezimalzahlȱ
DECIMALȱ
xs:doubleȱ
IEEEȱdoppelteȱGenauigȬ keitȱGleitkommazahlȱ
DOUBLEȱ
xs:floatȱ
IEEEȱeinfacheȱGenauigȬ keitȱGleitkommazahlȱ
REALȱ
xs:integerȱ
–2**63ȱbisȱ+2**63ȱ–ȱ1ȱ
BIGINTȱ
xs:longȱ
–2**63ȱbisȱ+2**63ȱ–ȱ1ȱ
BIGINTȱ
xs:intȱ
–2**31ȱbisȱ+2**31ȱ–ȱ1ȱ
INTEGERȱ
xs:shortȱ
–32768ȱbisȱ+32767ȱ
SMALLINTȱ
xs:byteȱ
–128ȱbisȱ+127ȱ
ȱ
xs:nonNegativeIntegerȱ
0ȱbisȱ+2**63ȱ–ȱ1ȱ
ȱ
xs:positiveIntegerȱ
+1ȱbisȱ+2**63ȱ–ȱ1ȱ
ȱ
xs:unsignedLongȱ
0ȱbisȱ+2**63ȱ–ȱ1ȱ
ȱ
xs:unsignedIntȱ
0ȱbisȱ+2**32ȱ
ȱ
xs:unsignedShortȱ
0ȱbisȱ+65535ȱ
ȱ
xs:unsignedByteȱ
0ȱbisȱ+255ȱ
ȱ
xs:nonPositiveIntegerȱ
–2**63ȱbisȱ0ȱ
ȱ
xs:negativeIntegerȱ
–2**63ȱbisȱ–1ȱ
ȱ
Tabelleȱ17:ȱDieȱeingebautenȱnumerischenȱDatentypenȱvonȱXQueryȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
136ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ ȱ
numerische Datentypen
ȱ ȱ
xs:anyAtomicType
ȱ ȱ ȱ
xs:decimal
xs:double
xs:float
ȱ xs:integer
ȱ ȱ ȱ
xs:nonNegativeInteger
xs:nonPositiveInteger
xs:positiveInteger
xs:negativeInteger
ȱ ȱ ȱ ȱ ȱ ȱ
xs:long
xs:unsignedLong
xs:int
xs:unsignedInt
xs:short
xs:unsignedShort
xs:byte
xs:unsignedByte
ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ46:ȱNumerischeȱDatentypenȱvonȱXQueryȱ
Wieȱ ausȱ derȱ Aufstellungȱ ersichtlich,ȱ gibtȱ esȱ inȱ XQueryȱ mehrȱ Datentypenȱ fürȱ nuȬ merischeȱDatenȱalsȱinȱDB2ȬSQL.ȱDieȱüberȱdenȱDatentypvorratȱvonȱSQLȱhinausgeȬ hendenȱ Datentypenȱ dürftenȱ jedochȱ fürȱ dieȱ meistenȱ Fälleȱ derȱ Praxisȱ nichtȱ besonȬ dersȱwichtigȱsein.ȱ WieȱausȱdenȱAngabenȱinȱderȱSpalteȱWertebereichȱderȱTabelleȱ17ȱundȱdenȱSpezialiȬ sierungsbeziehungenȱinȱderȱAbbildungȱ46ȱinȱihremȱZusammenspielȱzuȱersehenȱist,ȱ beschreibtȱ einȱ jeweiligerȱ Untertypȱ meistensȱ eineȱ Einschränkungȱ desȱ WertebereiȬ chesȱ seinesȱübergeordnetenȱ Typs.ȱ DieȱMengeȱderȱ Zahlen,ȱ dieȱdurchȱ einenȱunterȬ geordnetenȱDatentypȱdefiniertȱwird,ȱistȱsomitȱeineȱTeilmengeȱderȱZahlen,ȱdieȱderȱ übergeordneteȱTypȱbeschreibt.ȱEinȱWertȱdesȱWertebereichsȱeinesȱuntergeordnetenȱ Typsȱ istȱ ebenfallsȱ einȱ Wertȱ imȱ Wertebereichȱ desȱ übergeordnetenȱ Typs.ȱ Esȱ liegtȱ somitȱeineȱErbschaftȱmitȱEinschränkungȱvor.ȱ
137ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Nachdemȱ wirȱ dieȱ Hierarchieȱ derȱ numerischenȱ Datentypenȱ inȱ Abbildungȱ46ȱ kenȬ nenȱgelerntȱhaben,ȱwollenȱwirȱunsȱnochmalsȱmitȱderȱUmwandlungȱvonȱDatentyȬ penȱbeschäftigen.ȱObwohlȱXQueryȱeineȱtypstrengeȱSpracheȱist,ȱvereinfachtȱsieȱdieȱ Verwendungȱ vonȱ Operandenȱ ungleicherȱ Typenȱ inȱ Ausdrücken.ȱ Dieseȱ ErleichteȬ rungȱwirdȱermöglicht,ȱindemȱ – Untertypenȱ durchȱ ihreȱ passendenȱ Obertypenȱ ersetztȱ werden;ȱ diesȱ wirdȱ auchȱalsȱUntertypensubstitutionȱ(engl.ȱsubtypeȱsubstitution)ȱbezeichnet,ȱ – TypenȱmitȱgeringeremȱWertebereichȱoderȱPräzisionȱanȱTypenȱmitȱgrößeremȱ Wertebereichȱ oderȱ Präzisionȱ automatischȱ angeglichenȱ werdenȱ (TypangleiȬ chung,ȱengl.ȱtypeȱpromotion),ȱ – ungetyptenȱWertenȱvomȱTypȱxdt:untypedȱundȱxdt:untypedAtomicȱautomatiȬ scheȱinȱeinenȱfürȱdieȱOperationȱpassendenȱTypȱumgewandeltȱwerden.ȱ FürȱdieseȱdreiȱAutomatismenȱwollenȱwirȱnunȱeinigeȱBeispieleȱuntersuchen.ȱ
Untertypensubstitution Zurȱ Dezimalzahlȱ 1,50ȱ sollȱ dieȱ Dualzahlȱ 3ȱ hinzuaddiertȱ werden,ȱ dieȱ imȱ Datentypȱ xs:byteȱausgeprägtȱist.ȱ Hierbeiȱ giltȱ dasȱ Prinzip,ȱ dassȱ Operatorenȱ undȱ Funktionen,ȱ dieȱ einenȱ Operandenȱ mitȱ einemȱ bestimmtenȱ Typȱ erwarten,ȱ auchȱ einenȱ Operandenȱ inȱ einemȱ Untertypȱ vonȱdiesemȱTypȱakzeptieren.ȱDerȱWertȱimȱuntergeordnetenȱTypȱwirdȱhierbeiȱauȬ tomatischȱinȱdenȱerwartetenȱTypȱkonvertiertȱbevorȱdieȱOperationȱausgeführtȱwird.ȱ Daȱxs:byteȱ einȱ Untertypȱvonȱxs:decimalȱist,ȱkannȱdieȱUntertypsubstitutionȱ stattfinȬ den.ȱ XQUERY 1.50 + xs:byte( 3 ) Ergebnis 4.5
Automatische Typangleichung ZurȱGleitkommazahlȱ2.5E0ȱinȱdoppelterȱGenauigkeitȱsollȱdieȱGleitpunktzahlȱ1.5E6ȱ inȱeinfacherȱGenauigkeitȱhinzuaddiertȱwerden.ȱ XQUERY xs:double( 2.5E0 ) + xs:float( 1.5E6 ) Ergebnis 1,50000250E6
ZurȱDezimalzahlȱ1,1ȱsollȱdieȱGleitpunktzahlȱ1,5E6ȱhinzuaddiertȱwerden.ȱ XQUERY xs:decimal(1.1) + xs:double( 1.5E6 ) Ergebnis 1,50000110E6
138ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ
Automatische Typumwandlung InȱeinigenȱFällenȱunterstütztȱXQueryȱdieȱautomatischeȱTypumwandlungȱvonȱWerȬ ten.ȱ Einȱ Beispielȱ hierfürȱ istȱ einȱ ungeparstesȱ XMLȬElement,ȱ dessenȱ Wertȱ sodannȱ vomȱ Typȱ xs:untypedȱ ist.ȱ Verkettetȱ manȱ einȱ solchesȱ XMLȬElementȱ mitȱ einemȱ ZeiȬ chenkettenwertȱ mitȱ Hilfeȱ derȱ Funktionȱ fn:concat(),ȱ soȱ wirdȱ derȱ Wertȱ desȱ XMLȬ Elementesȱ automatischȱ inȱ eineȱ Zeichenketteȱ umgewandelt,ȱ bevorȱ dieȱ VerketȬ tungsoperationȱausgeführtȱwird.ȱ Beispielȱ Dasȱ XMLȬElementȱ mitȱ demȱ Elementnameȱ aȱ wirdȱ mitȱ demȱ Zeichenkettenliteralȱ halloȱverkettet.ȱ XQUERY fn:concat(3, 'hallo') Ergebnis 3hallo
6.3.3 Zeichenförmige Datentypen Denȱ Zusammenhangȱ derȱ zeichenförmigenȱ Datentypenȱ vonȱ XQueryȱ zeigtȱ dasȱ StrukturdiagrammȱinȱAbbildungȱ47.ȱȱ ȱ ȱ
Vomȱ Typȱ xs:anyAtomicTypeȱ gibtȱ es,ȱ wieȱ bereitsȱ erwähnt,ȱ keineȱ Werte,ȱ weilȱ dieserȱ Typȱ einȱȱ abstrakterȱTypȱist.ȱȱ
zeichenförmige Datentypen
ȱ ȱ
xs:anyAtomicType
Inȱ derȱ folgendenȱ Tabelleȱ18ȱsindȱ dieȱ 10ȱ zeichenartigenȱ DatenȬ typenȱ mitȱ ihrenȱ maßgeblichenȱ Eigenschaftenȱ undȱ ihrerȱ AnaloȬ gienȱzuȱDB2ȬSQLȱdargestellt.ȱ
ȱ ȱ
xs:string
ȱ ȱ
xs:normalizedString
ȱ
ȱ ȱ
xs:token
ȱ ȱ
xs:Name
xs:language
xs:NMTOKEN
ȱ ȱ xs:NCName
ȱ xs:ID
xs:IDREF
xs:ENTITY
ȱ
Abbildungȱ47:ȱZeichenförmigeȱDaȬ tentypenȱvonȱXQueryȱ
139ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ
NameȱdesȱTypsȱ
Eigenschaftȱ
xs:stringȱ
Zeichenkettenȱ ausȱ allenȱ zulässigenȱ Zeichenȱ CLOBȱ vonȱXML.ȱ
xs:normalizedȱ Stringȱ
Entsprichtȱ xs:string,ȱ jedochȱ ohneȱ dieȱ whiteȱ ȱ spaceȱ genanntenȱ Steuerzeichenȱ TabulatorȬ Steuerzeichen,ȱ WagenrücklaufȬSteuerzeichenȱ undȱNeueȬZeileȬSteuerzeichen.ȱ
xs:tokenȱ
Entsprichtȱ xs:normalizedStringȱ ohneȱ mehrfaȬ ȱ cheȱ Leerzeichenȱ undȱ ohneȱ Leerzeichenȱ amȱ AnfangȱundȱEndeȱeinerȱZeichenkette.ȱ
xs:Nameȱ
Entsprichtȱ xs:tokenȱ mitȱ derȱ Einschränkung,ȱ ȱ dassȱdasȱersteȱZeichenȱeinesȱWortesȱentwederȱ einȱBuchstabe,ȱUnterstrichȱoderȱDoppelpunktȱ seinȱmuss.ȱ
xs:languageȱ
Entsprichtȱ xs:tokenȱ undȱ lässtȱ nurȱ Worteȱ zurȱ ȱ Identifikationȱ vonȱ Sprachenȱ zuȱ wieȱ beispielsȬ weiseȱ ge,ȱ enȬUS,ȱ dieȱ inȱ mehrerenȱ Standardsȱ genormtȱsind.ȱ
xs:NMTOKENȱ
Entsprichtȱ xs:tokenȱ mitȱ derȱ Einschränkung,ȱ ȱ dassȱ dieȱ Worteȱ nurȱ ausȱ Buchstaben,ȱ Ziffernȱ undȱ denȱ Zeichenȱ ȇ.ȇ,ȱ ȇ–ȇ,ȱ ȇ_ȇȱ undȱ ȇ:ȇȱ bestehenȱ können.ȱ Dieȱ Abkürzungȱ bedeutetȱ NamensȬ Token.ȱ
xs:NCNameȱ
Entsprichtȱ xs:Nameȱ mitȱ derȱ Einschränkung,ȱ ȱ dassȱdieȱWorteȱkeineȱDoppelpunkteȱenthaltenȱ dürfen.ȱ Dieȱ Abkürzungȱ bedeutetȱ nonȬ colonized.ȱ Dieȱ Worteȱ werdenȱ fürȱ Namensteileȱ vonȱ qualifiziertenȱ Namenȱ verwendet.ȱ Derȱ DoppelpunktȱistȱhierȱderȱQualifikator.ȱ
xs:IDȱ
Entsprichtȱ xs:NCName.ȱ Dieȱ Werteȱ sindȱ verȬ ȱ gleichbarȱ mitȱ Primärschlüsseln.ȱ Sieȱ müssenȱ imȱ gesamtenȱ Dokumentȱ eindeutigȱ sein,ȱ d.ȱ h.ȱ dürfenȱnurȱeinmaligȱauftreten.ȱ
xs:IDREFȱ
Entsprichtȱ xs:NCName.ȱ Dieȱ Werteȱ sindȱ verȬ ȱ gleichbarȱ mitȱ Fremdschlüsseln.ȱ Denȱ Wertenȱ müssenȱ vorhandeneȱ xs:IDȬWerteȱ imȱ DokuȬ mentȱentsprechen.ȱ
140ȱ
DB2ȬSQLȱ
6.3ȱȱDatentypenȱinȱXQueryȱ xs:ENTITYȱ
Entsprichtȱ xs:NCName.ȱ Dieȱ Werteȱ sindȱ NaȬ ȱ menȱ vonȱ soȱ genanntenȱ Entities.ȱ Entitiesȱ sindȱ Daten,ȱ dieȱ durchȱ denȱ Parserȱ nichtȱ validiertȱ werden,ȱz.ȱB.ȱBilderȱoderȱBLOBs.ȱ
Tabelleȱ18:ȱDieȱeingebautenȱzeichenartigenȱDatentypenȱvonȱXQueryȱ
Aufȱ dieȱ Eigenschaftenȱ derȱ inȱ XQueryȱ eingebautenȱ zeichenartigenȱ Datentypenȱ wirdȱ imȱ Kapitelȱ überȱ dieȱ Datenbeschreibungsspracheȱ XMLȱ Schemaȱ detaillierterȱ eingegangen.ȱ Inȱ derȱ folgendenȱ Tabelleȱ wirdȱ eineȱ Auswahlȱ derȱ Konstruktorenȱ fürȱ dieȱ AuspräȬ gungȱvonȱtextartigenȱWertenȱmitȱihrenȱentsprechendenȱDatentypenȱdargestellt.ȱ Damitȱ auchȱ dasȱ Verhaltenȱ derȱ Konstruktorenȱ beiȱ Zeichenkettenȱ untersuchtȱ werȬ denȱ kann,ȱ dieȱ Steuerzeichenȱ enthalten,ȱ sindȱ Zeichenreferenzenȱ vonȱ XQueryȱ aufȱ dieȱ Zeichenȱ imȱ UnicodeȬZeichensatzȱ erforderlich.ȱ Eineȱ solcheȱ Zeichenreferenzȱ beginntȱmitȱdemȱkaufmännischenȱUndȱ&ȱundȱdemȱNummernzeichenȱ#ȱundȱendetȱ mitȱ einemȱ Semikolonȱ (;).ȱ Zwischenȱ demȱ Nummernzeichenȱ undȱ demȱ Semikolonȱ stehtȱeineȱvierstelligeȱZahlȱinȱDezimalziffernȱoderȱHexadezimalziffern.ȱWennȱdieȱ Zahlȱ eineȱ Hexadezimalzahlȱ ist,ȱ stehtȱ vorȱ ihrȱ einȱ xȱ inȱ Kleinbuchstaben.ȱ Eineȱ ZeiȬ chenreferenzȱistȱdieȱNummerȱeinesȱZeichensȱimȱUnicodezeichensatz.ȱ Folgendeȱ Zeichenreferenzenȱ inȱ hexadezimalerȱ Schreibweiseȱ undȱ dieȱ vonȱ ihnenȱ adressiertenȱSteuerzeichenȱimȱUnicodezeichensatzȱwerdenȱinȱdenȱfolgendenȱAusȬ führungenȱverwendet:ȱ – ȱȱ –
ȱ – ȱ
Tabulatorsteuerzeichenȱ NeueȱZeileȱSteuerzeichenȱ Wagenrücklaufsteuerzeichenȱ
Konstruktorȱ
Ergebnisȱ
xs:string('hallo') xs:string( 'a b' )
hallo a b
ȱ xs:normalizedString( 'a b' )ȱ xs:token( ' a b c' )ȱ
Die Zeichenkette enthält die Zeichenreferenz (Tabulatorsteuerzeichen) Achtung: Die Wirkung der Steuerzeichen sind nur im Command Line-Fenster CLP von DB2 sichtbar. Das grafische Befehlseditor-GUI unterdrückt die Wirkung.ȱ a b Steuerzeichen werden durch ein Leerzeichen ersetzt.ȱ a b c Steuerzeichen und mehrere Leerzeichen im Text werden durch ein Leerzeichen ersetzt. Leerzeichen am Anfang und Ende werden entfernt.
ȱ
141ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ xs:Name( ':hallo' )
:hallo
xs:Name( '?hallo' )ȱ xs:language('de')
Fehler Erstes Zeichen eines Wortes muss entweder Buchstabe, Unterstrich oder Doppelpunkt sein.ȱȱ de
xs:language('12')ȱ
Fehlerȱ
xs:NMTOKEN( 'a_b-c:d..e' )
a_b-c:d..e
xs:NMTOKEN( 'a?b' )ȱ
Fehler Nur Buchstaben, Ziffern und die Zeichen '.', '-', '_', ':' sind erlaubt.
xs:NCName( 'ab' )
ab
xs:NCName( ':ab' )ȱ
Fehler Erstes Zeichen darf kein Doppelpunkt sein.ȱ
xs:ID('ab')ȱ
abȱȱ
xs:IDREF('ab')
ab
xs:ENTITY('ab')
abȱ
ein
Tabelleȱ19:ȱKonstruktorenȱfürȱDatenobjekteȱtextartigerȱDatentypenȱ
6.3.4 Datum- und Zeit-Datentypen DenȱZusammenhangȱderȱDatentypenȱfürȱdieȱAngabeȱvonȱDatumȬȱundȱZeitwertenȱ inȱ XQueryȱ zeigtȱ dasȱ Strukturdiagrammȱ inȱ Abbildungȱ 48.ȱ Vomȱ Typȱ xs:anyAtomicTypeȱ gibtȱ es,ȱ wieȱ bereitsȱ erwähnte,ȱ keineȱ Werte,ȱ weilȱ dieserȱ Typȱ einȱ abstrakterȱTypȱist.ȱȱ Alleȱ TypenȱfürȱdieȱZeitȬȱundȱ Datumsangabeȱ sindȱ primitiveȱDatentypen,ȱd.ȱh.ȱ sieȱ sindȱnichtȱvonȱkonkretenȱDatentypenȱabgeleitet.ȱVonȱkonkretenȱDatentypenȱkannȱ esȱ Werteȱ geben.ȱ Dieȱ Vorgängertypenȱ derȱ DatumȬȱ undȱ Zeittypenȱ sindȱ somitȱ alleȬ samtȱ abstrakt,ȱ sieheȱ Abbildungȱ 45.ȱ Dieȱ DatumȬȱ undȱ Zeittypenȱ könnenȱ inȱ dreiȱ Gruppenȱ aufgeteiltȱ werden.ȱ Dieseȱ bestehenȱ ausȱ denȱ Datentypenȱ fürȱ dieȱ Angabeȱ vonȱȱ – einmaligenȱundȱȱ – wiederkehrendenȱZeitpunktenȱsowieȱvonȱȱ – Zeiträumen,ȱd.ȱh.ȱZeitdauern.ȱ ȱ
142ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ ȱ
Datum- und Zeit-Datentypen
ȱ ȱ
xs:anyAtomicType
xs:dateTime
ȱ ȱ ȱ ȱ
xs:date xs:time xs:duration
ȱ xdt:yearMonthDuration
ȱ ȱ
xdt:dayTimeDuration
ȱ ȱ ȱ ȱ ȱ ȱ ȱ
xs:gYearMonth xs:gYear xs:gMonthDay xs:gMonth xs:gDay
ȱ Abbildungȱ48:ȱDatumȬȱundȱZeitȬDatentypenȱvonȱXQueryȱ
Einmalige Zeitpunkte Dieȱ auchȱ inȱ SQLȱ vorhandenenȱ Datentypenȱ fürȱ dieȱ Angabeȱ vonȱ einmaligenȱ ZeitȬ punktenȱ istȱ derȱ Datumstypȱ (DATE)ȱ undȱ derȱ Zeitstempeltypȱ (TIMESTAMP).ȱ Derȱ ersteȱ heißtȱ inȱ XQueryȱ xs:dateȱ undȱ derȱ zweiteȱ xs:dateTime.ȱ Derȱ Datumstypȱ inȱ XQueryȱlegtȱdieȱReihenfolgeȱseinerȱBestandteile,ȱderȱJahresȬ,ȱMonatsȬȱundȱTagesȬ angabeȱ undȱ dieȱ Trennzeichenȱ zwischenȱ diesenȱ jeweiligenȱ Angabenȱ fest.ȱ Dieȱ folȬ gendeȱSchabloneȱdrücktȱdiesȱaus:ȱCCYYȬMMȬDD.ȱ BeispielȱfürȱeinȱDatum:ȱ XQUERY xs:date('2008-05-31') Ergebnis 2008-05-31
ȱ
143ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ZusätzlichȱzuȱdenȱdreiȱDatumsbestandteilenȱJahr,ȱMonatȱundȱTagȱkannȱinȱXQueryȱ nochȱdieȱZeitzoneȱangegebenȱwerden.ȱDieseȱwirdȱaufȱderȱBasisȱvonȱUTCȱ(Universalȱ Timeȱ Coordinated),ȱ besserȱ bekanntȱ unterȱ GMTȱ (Greenwichȱ Meanȱ Time)ȱ spezifiȬ ziert.ȱDerzeitȱwirdȱdieȱUTCȱauchȱalsȱkoordinierteȱWeltzeitȱbezeichnet.ȱDieȱmöglichenȱ AngabenȱfürȱdieȱZeitzonenȱsindȱderȱBuchstabeȱZȱfürȱdieȱUTCȱselbstȱoderȱeinȱposiȬ tiverȱoderȱnegativerȱZeitversatzȱaufȱBasisȱderȱUTC.ȱȱ DerȱBuchstabeȱZȱistȱdieȱAbkürzungȱfürȱeinenȱZeitversatzȱvonȱnullȱ(engl.ȱzero).ȱFürȱ dieȱ Angabeȱ einesȱ Zeitzonenversatzesȱ vonȱ Greenwichȱ ausȱ nachȱ Ostenȱ wirdȱ eineȱ positiveȱZeitangabeȱinȱderȱFormȱStunden:Minutenȱverwendet,ȱz.ȱB.ȱ+01:00ȱfürȱdieȱ mitteleuropäischeȱ Zeitȱ MEZ.ȱ Fürȱ dieȱ Angabeȱ einesȱ Zeitzonenversatzesȱ vonȱ GreenwichȱausȱnachȱWestenȱwirdȱeineȱnegativeȱZeitangabeȱvonȱStundenȱundȱMiȬ nutenȱbenutzt,ȱz.ȱB.ȱZeitzoneȱvonȱNewȱYorkȱ–05:00.ȱ UnterȱBerücksichtigungȱderȱoptionalenȱZeitzonenangabeȱsiehtȱdasȱFormatȱfürȱdieȱ AngabeȱeinesȱDatumsȱwieȱfolgtȱaus:ȱCCYYȬMMȬDD[z].ȱ Beispieleȱ DatumȱinȱGreenwich,ȱUTCȱ XQUERY xs:date('2008-05-31Z') Ergebnis 2008-05-31Z
DatumȱinȱBerlin,ȱMEZȱ XQUERY xs:date('2008-05-31+01:00') Ergebnis 2008-05-31+01:00
DatumȱinȱNewȱYork:ȱUTCȱminusȱfünfȱStundenȱ(–05:00)ȱ XQUERY xs:date('2008-05-31-05:00') Ergebnis 2008-05-31-05:00
DatumȱanȱderȱDatumsgrenzeȱ XQUERY xs:date('2008-05-31+12:00') Ergebnis 2008-05-31+12:00
144ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ Fürȱ denȱ Zeitstempeltypȱ xs:dateTimeȱ beschreibtȱ dieȱ Schabloneȱ CCYYȬMMȬDDTȱ hh:mm:ssȱ dieȱ Strukturȱ derȱ einzelnenȱ Bestandteileȱ undȱ dieȱ erforderlichenȱ TrennȬ zeichen.ȱInȱXQueryȱsindȱdieȱVorgabenȱderȱISOȬNormȱISOȱ8601ȱfürȱdieȱSchreibweiȬ seȱvonȱDatumȬȱundȱZeitwertenȱweitgehendȱeingehaltenȱ[ISO8601].ȱ DerȱTypȱxs:dateTimeȱbestehtȱsomitȱausȱdenȱWertenȱJahrhunderte,ȱJahrzehnte,ȱMoȬ nate,ȱTage,ȱStunden,ȱMinutenȱundȱSekunden.ȱDasȱTrennzeichenȱTȱtrenntȱdieȱDaȬ tumsȬȱ vonȱ denȱ Zeitbestandteilen.ȱ Alleȱ Bestandteileȱ müssenȱ beiȱ einemȱ ZeitstemȬ pelwertȱangegebenȱwerden.ȱBeiȱderȱAngabeȱderȱSekundenȱkannȱauchȱeinȱmaximalȱ sechsstelligerȱ Sekundenbruchteilȱ aufgeführtȱ werden.ȱ Erȱ wirdȱ durchȱ einenȱ DeziȬ malpunktȱvonȱdenȱganzzahligenȱSekundenȱgetrennt.ȱ Beispielȱ XQUERY xs:dateTime('2008-05-31T11:39:46.123456') Ergebnis 2008-05-31T11:39:46.123456
HinterȱdenȱSekundenȱkannȱauchȱdieȱZeitzoneȱstehen.ȱȱ Beispieleȱ ZeitstempelȱfürȱUTCȱ XQUERY xs:dateTime('2008-05-31T11:39:46.123456Z') Ergebnis 2008-05-31T11:39:46.123456Z
ZeitstempelȱfürȱMEZȱ(+1ȱStundeȱZeitversatz)ȱ XQUERY xs:dateTime('2008-05-31T11:39:46.123456+01:00') Ergebnis 2008-05-31T11:39:46.123456+01:00
ZeitstempelȱfürȱNewȱYorkȱ(Ȭ5ȱStundenȱZeitversatz)ȱ XQUERY xs:dateTime('2008-05-31T11:39:46.123456-05:00') Ergebnis 2008-05-31T11:39:46.123456-05:00
Nebenȱ denȱ dargestelltenȱ Datentypenȱ fürȱ einmaligeȱ Zeitpunkteȱ xs:dateȱ undȱ xs:dateTimeȱgibtȱesȱinȱXQueryȱnochȱKurzformenȱfürȱweitereȱZeitpunkteȱwieȱ – nurȱdasȱJahrȱmitȱdemȱFormatȱCCYY[z]ȱ derȱDatentypȱheißtȱxs:gYearȱ – JahrȱundȱMonatȱmitȱdemȱFormatȱCCYYȬMM[z]ȱ derȱDatentypȱheißtȱxs:gYearMonthȱ
145ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ DerȱBuchstabeȱgȱstehtȱfürȱdieȱAbkürzungȱvonȱgregorianisch.ȱ Inȱ denȱ folgendenȱ Beispielenȱ werdenȱ Objekteȱ derȱ unterschiedlichenȱ ZeitpunkttyȬ penȱausgeprägt.ȱ JahreszahlȱinȱlokalerȱZeitzoneȱ XQUERY xs:gYear('2008') Ergebnis 2008
JahreszahlȱinȱderȱUTCȬZeitzoneȱ XQUERY xs:gYear('2008Z') Ergebnis 2008Z
JahreszahlȱinȱMEZȬZeitzoneȱ XQUERY xs:gYear('2008+01:00') Ergebnis 2008+01:00
ȱ JahrȱundȱMonatȱinȱderȱlokalenȱZeitzoneȱ XQUERY xs:gYearMonth('2008-05') Ergebnis 2008-05
Wiederkehrende Zeitpunkte ZuȱdenȱwiederkehrendenȱZeitpunktenȱzählenȱallȱjeneȱDatumsȬȱundȱZeitangaben,ȱ dieȱ täglich,ȱmonatlichȱundȱ jährlichȱ wiederkehren.ȱDieȱhierfürȱinȱXQueryȱvorhanȬ denenȱDatentypenȱheißenȱ – xs:timeȱ ȱ – xs:gMonthȱ ȱ ȱ ȱ ȱ ȱ ȱ – xs:gMonthDayȱ – xs:gDayȱ ȱ
Format:ȱhh:mm:ss[.ssssss][z]ȱ Format:ȱȬȬMM[z]ȱ ȱderȱlinkeȱStrichȱstehtȱfürȱdenȱȱ ȱfehlendenȱMonatȱ Format:ȱȬȬMMȬDD[z]ȱ Format:ȱȬȬȬDD[z]ȱ
ȱ Beispieleȱ UhrzeitȱinȱStunden,ȱMinutenȱundȱSekundenȱ XQUERY
146ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ xs:time('13:30:59') Ergebnis 13:30:59
UhrzeitȱinȱStunden,ȱMinuten,ȱSekundenȱundȱMirosekundenȱ XQUERY xs:time('13:30:59.888999') Ergebnis 13:30:59.888999
UhrzeitȱinȱStunden,ȱMinuten,ȱSekundenȱundȱMirosekundenȱinȱderȱZeitzoneȱMEZȱ XQUERY xs:time('13:30:59.888999+01:00') Ergebnis 13:30:59.888999+01:00
ȱ AnȱjedemȱsechstenȱMonatȱeinesȱJahresȱfindetȱdieȱSommersonnenwendeȱstatt:ȱ XQUERY xs:gMonth('--06') Ergebnis --06
AnȱjedemȱerstenȱMaiȱeinesȱjedenȱJahresȱfindetȱdieȱFeierȱzumȱ1.ȱMaiȱstatt:ȱ XQUERY xs:gMonthDay('--05-01') Ergebnis --05-01
AmȱfünfzehntenȱeinesȱjedenȱMonatsȱfindetȱdieȱGehaltszahlungȱstatt:ȱ XQUERY xs:gDay('---15') Ergebnis ---15
Zeiträume InȱXQueryȱgibtȱesȱdenȱDatentypȱfürȱdieȱSpezifikationȱvonȱZeiträumen.ȱSeinȱNameȱ istȱ xs:duration.ȱ Einȱ Zeitraumȱ liegtȱ zwischenȱ zweiȱ Zeitpunkten.ȱ Einȱ Zeitraumȱ istȱ somitȱdieȱZeit,ȱdieȱverstreicht,ȱbisȱvonȱeinemȱZeitpunktȱausȱderȱnächsteȱZeitpunktȱ erreichtȱist.ȱInȱXQueryȱwirdȱeinȱZeitraumȱdurchȱdasȱfolgendeȱFormatȱbeschrieben:ȱ Pȱ[nY]ȱ[nM]ȱ[nD]ȱ[Tȱ[nH]ȱ[nM]ȱ[mS]ȱ]ȱ Hierbeiȱ bedeutetȱ derȱ Buchstabeȱ nȱ eineȱ Ganzzahlȱ vorȱ demȱ jeweiligenȱ ZeitraumȬ deskriptor,ȱ z.ȱ B.ȱ Yȱ fürȱ Jahrȱ usw.ȱ Derȱ Buchstabeȱ mȱ vorȱ demȱ Deskriptorȱ Sȱ fürȱ SeȬ
147ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ kundeȱ bedeutetȱ eineȱ Sekundenzeitspanneȱ mitȱ bisȱ zuȱ sechsȱ Dezimalstellenȱ nachȱ demȱ Dezimalpunkt.ȱ Dieȱ sechsȱ möglichenȱ Elementeȱ zurȱ Beschreibungȱ einesȱ ZeitȬ raumsȱ bietenȱ dieȱ Möglichkeit,ȱ inȱ unterschiedlichȱ feinenȱ Skalierungenȱ einenȱ ZeitȬ raumȱzuȱbeschreiben.ȱDieȱfeinsteȱSkalierungȱistȱhierbeiȱdieȱSekunde,ȱdieȱeineȱFeinȬ heitȱbzw.ȱPräzisionȱbisȱzuȱeinerȱMikrosekundeȱerlaubt.ȱ MitȱWertenȱvonȱZeitpunktenȱundȱZeiträumenȱkannȱmanȱinȱXQueryȱauchȱrechnen.ȱ Soȱ kannȱ manȱ dieȱ Differenzȱ zwischenȱ zweiȱ Zeitpunkten,ȱ d.ȱ h.ȱ einenȱ Zeitraumȱ bestimmen.ȱ Zuȱ einemȱ Zeitpunktȱ kannȱ manȱ auchȱ einenȱ Zeitraumȱ hinzuaddierenȱ oderȱ vonȱ diesemȱ abziehen.ȱ Hierbeiȱ ergibtȱ sichȱ wiederȱ einȱ Zeitpunkt.ȱ Zeiträumeȱ kannȱmanȱsogarȱvervielfachenȱoderȱteilen.ȱHieraufȱwerdenȱwirȱinȱeinemȱspäterenȱ Kapitelȱ detailliertȱ eingehen.ȱ Hierȱ sollenȱ nurȱ einigeȱ arithmetischeȱ GrundoperatioȬ nenȱ gezeigtȱwerden,ȱumȱdieȱMächtigkeitȱderȱZeitarithmetikȱinȱXQueryȱ anzudeuȬ ten.ȱ NurȱZeitraumwerte,ȱdieȱmitȱdenȱbeidenȱKonstruktorenȱxdt:dayTimeDuration()ȱundȱ xdt:yearMonthDuration()ȱ ausgeprägtȱ wurden,ȱ könnenȱ inȱ derȱ DatumsȬȱ undȱ ZeitȬ arithmetikȱ verwendetȱ werden.ȱ Zeitraumwerteȱ vomȱ Datentypȱ xs:duration()ȱ sindȱ nichtȱverwendbar.ȱ ȱ ȱ ȱ
ȱ
FormateȱfürȱeinmaligeȱZeitpunkte:ȱ xs:dateTime(CCYYȬMMȬDDThh:mm:s[z])ȱ xs:date(CCYYȬMMȬDD[z])ȱ
ȱ ȱ
Zeitpunkt
Zeitpunkt
ȱ ȱ ȱ ȱ ȱ ȱ
Zeitraum FormateȱfürȱZeiträume:ȱ xs:duration(Pȱ[nY]ȱ[nM]ȱ[nD]ȱ[Tȱ[nH]ȱ[nM]ȱ[mS]ȱ])ȱ xdt:dayTimeDuration(P[nD]ȱ[Tȱ[nH]ȱ[nM]ȱ[mS]ȱ])ȱ xdt:yearMonthDuration(Pȱ[nY]ȱ[nM])ȱ
ȱ Abbildungȱ49:ȱKonstruktorenȱfürȱZeitpunkteȱundȱZeiträumeȱ Imȱ Folgendenȱ werdenȱ einigeȱ Beispieleȱ derȱ DatumsȬȱ undȱ Zeitarithmetikȱ gezeigt.ȱ EineȱdetaillierteȱBeschreibungȱerfolgtȱimȱKapitelȱüberȱAusrückeȱinȱXQuery.ȱ ȱ ȱ
148ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ Beispielȱ DifferenzȱvonȱzweiȱeinmaligenȱZeitpunktenȱmitȱmaximalerȱGenauigkeitȱergibtȱdieȱ ZeitspanneȱzwischenȱdiesenȱZeitpunkten.ȱ XQUERY xs:dateTime('2008-12-31T23:59:59.654321') xs:dateTime('2007-01-01T01:02:03.123456') Ergebnis P730DT22H57M56.530865S
DieȱAdditionȱeinesȱZeitpunktsȱzuzüglichȱeinerȱZeitspanneȱergibtȱeinenȱZeitpunkt.ȱ XQUERY xs:dateTime('2008-12-31T23:59:59.654321') + xdt:yearMonthDuration('P1Y2M') Ergebnis 2010-02-28T23:59:59.654321
Dieȱ Subtraktionȱ einesȱ Zeitpunktesȱ abzüglichȱ einerȱ Zeitspanneȱ ergibtȱ einenȱ ZeitȬ punkt.ȱ XQUERY xs:dateTime('2008-12-31T23:59:59.654321') xdt:dayTimeDuration('P1DT3H30M7.12345S') Ergebnis 2008-12-30T20:29:52.530871
Auchȱdieȱ11ȱDatentypenȱvonȱXQueryȱfürȱdieȱBildungȱvonȱWertenȱfürȱDatumȬȱundȱ ZeitangabenȱstellenȱwirȱzurȱÜbersichtȱinȱeinerȱTabelleȱsystematischȱdar.ȱ NameȱdesȱTypsȱ
Eigenschaftȱ
DB2ȬSQLȱ
xs:dateȱ
CCYYȬMMȬDD[z]ȱ Beispiel:ȱȱ LokalesȱDatum:ȱ2008Ȭ05Ȭ31ȱ UTCȬDatum:ȱ2008Ȭ05Ȭ31Zȱ MEZȬDatum:ȱ2008Ȭ05Ȭ31+01:00ȱ
DATEȱ ohneȱ[z]ȱ
NewȱYorkȱDatum:ȱ2008Ȭ05Ȭ31Ȭ05:00ȱ
xs:timeȱ
xs:dateTimeȱ xs:gYearMonthȱ
hh:mm:ss[.ssssss][z]ȱ zȱbedeutetȱZeitzonenversatzȱvonȱUTCȱGreenwich,ȱȱ z.ȱB.ȱMEZȱ=ȱUTC+01.00,ȱUTCȱ=ȱZȱ Beispiel:ȱȱ MEZ:ȱ20:30:59.123+01.00ȱ UTC:ȱ20:30:59.123Zȱ YYYYȬMMȬDDTȱ hh:mm:ss[.ssssss][z]ȱ
TIMEȱ
CCYYȬMM[z]ȱ
ȱ
ohneȱ[z]ȱ
TIMESTAMPȱ ohneȱ[z]ȱ
149ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ xs:gYearȱ
CCYY[z]ȱ
ȱ
xs:gMonthȱ
ȬȬMM[z]ȱ
ȱ
xs:gMonthDayȱ
ȬȬMMȬDD[z]ȱ
ȱ
xs:gDayȱ
ȬȬȬȬDD[z]ȱ
ȱ
xs:durationȱ
Pȱ[nY][nM][nD]ȱ[T[nH][nM]ȱ[mS]ȱ]ȱ
ȱ
xdt:yearMonth Durationȱ
Pȱ[aȱY]ȱ[bȱM]ȱ
ȱ
xdt:dayTimeDu rationȱ
Pȱ[nD]ȱ[T[nH][nM]ȱ[mS]ȱ]ȱ
ȱ
Tabelleȱ20:ȱDatumȬȱundȱZeitȬDatentypenȱvonȱXQueryȱ
6.3.5 Sonstige Datentypen Dieȱ sonstigenȱ primitiven,ȱ d.ȱ h.ȱ nichtȱ abgeleitetenȱ Datentypenȱ vonȱ XQueryȱ zeigtȱ dasȱStrukturdiagrammȱinȱAbbildungȱ50.ȱVomȱTypȱxs:anyAtomicTypeȱgibtȱesȱkeineȱ Werte,ȱweilȱdieserȱTypȱeinȱabstrakterȱTypȱist.ȱInȱUMLȱwirdȱdiesȱinȱkursiverȱSchriftȱ ausgedrückt.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
sonstige Datentypen
xs:anyAtomicType
xs:boolean xs:base64Binary xs:hexBinary
ȱ
xs:anyURI
ȱ
xs:QName
ȱ ȱ
xs:NOTATION
ȱ
Abbildungȱ50:ȱSonstigeȱDatentypenȱvonȱXQueryȱ
Wahrheitswert vom Typ xs:boolean Derȱ Datentypȱ xs:booleanȱ beschreibtȱ dieȱ beidenȱ Wahrheitswerteȱ wahrȱ (engl.ȱ true)ȱ undȱ falschȱ (engl.ȱ false).ȱ Dieȱ lexikalischeȱ externeȱ Repräsentationȱ vonȱ wahrȱ istȱ trueȱ undȱvonȱfalschȱistȱfalse.ȱȱ
150ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ Einȱ internerȱ Wahrheitswertȱ vomȱ Typȱ xs:booleanȱ kannȱ durchȱ folgendeȱ SpracheinȬ richtungenȱvonȱXQueryȱerzeugtȱwerden,ȱ – – – –
durchȱdenȱKonstruktorȱxs:booleanȱ durchȱdenȱOperatorȱcastȱasȱxs:booleanȱ durchȱdieȱFunktionenȱfn:true()ȱundȱfn:false()ȱ durchȱdieȱFunktionȱfn:boolean().ȱ
Derȱ Konstruktorȱ xs:boolean()ȱ istȱ überladen.ȱ Deshalbȱ akzeptiertȱ erȱ sowohlȱ einȱ ArȬ gumentȱ inȱZeichenkettenformȱvomȱTypȱxs:stringȱalsȱ auchȱ einȱnumerischesȱArguȬ mentȱ beliebigenȱ Typs.ȱ Dieȱ beidenȱ zulässigenȱ Zeichenkettenargumenteȱ sindȱ dieȱ Werteȱȇtrueȇȱundȱȇfalseȇȱ.ȱEinȱanderesȱZeichenkettenliteralȱführtȱzuȱeinemȱFehler.ȱ Einȱ numerischerȱWertȱgrößerȱalsȱ–1ȱundȱ kleinerȱalsȱ+1ȱ ergibtȱdenȱWahrheitswertȱ falsch,ȱ derȱ inȱ seinerȱ lexikalischenȱ Repräsentationȱ falseȱ lautet.ȱ Einȱ Wertȱ außerhalbȱ diesesȱIntervallsȱergibtȱdenȱWahrheitswertȱwahr,ȱderȱinȱseinerȱlexikalischenȱRepräȬ sentationȱtrueȱlautet.ȱ ȱ
Beispielȱ Zeichenkettenargumentȱ XQUERY xs:boolean( 'true' ) Ergebnis true XQUERY xs:boolean( 'false' ) Ergebnis false
NumerischesȱArgumentȱ XQUERY xs:boolean( –1 ) Ergebnis true XQUERY xs:boolean( 1 ) Ergebnis true XQUERY xs:boolean( 0 ) Ergebnis false XQUERY xs:boolean( 0.9 )
151ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Ergebnis false
Dieȱ Wirkungsweiseȱ desȱ Operatorsȱ castȱasȱ istȱ identischȱ mitȱ derȱ desȱ Konstruktorsȱ xs:boolean.ȱ ȱ Beispielȱ XQUERY 'true' cast as xs:boolean Ergebnis True XQUERY 1 cast as xs:boolean Ergebnis true XQUERY 0 cast as xs:boolean Ergebnis false
Binäre Daten XQueryȱ ermöglichtȱ dieȱ Darstellungȱ binärerȱ Datenȱ inȱ denȱ beidenȱ Datentypenȱ xs:hexBinaryȱ undȱ xs:base64Binary.ȱ Hierdurchȱ könnenȱ multimedialeȱ Datenȱ wieȱ BilȬ der,ȱAudioȬȱundȱVideodatenȱinȱXMLȬDokumentenȱübertragenȱwerden.ȱ DerȱDatentypȱxs:hexBinaryȱerlaubtȱalsȱWerteȱdieȱHexadezimalzeichenȱvonȱ0ȱbisȱF.ȱ Mitȱ diesenȱ Zeichenȱ werdenȱ dieȱ Binärwerteȱ einesȱ Halbbytesȱ inȱ einemȱ XMLȬ Dokumentȱ dargestellt.ȱ Jeȱ Byteȱ Binärdatenȱ sindȱ somitȱ zweiȱ Hexadezimalzeichenȱ fürȱderenȱÜbertragungȱinȱeinemȱDatenstromȱausȱXMLȬDatenȱerforderlich.ȱ DerȱDatentypȱxs:base64Binaryȱverwendetȱnichtȱnurȱ16ȱsondernȱ64ȱZeichenȱfürȱdieȱ Codierungȱ vonȱ Binärdaten.ȱ Hierbeiȱ werdenȱ jeweilsȱ sechsȱ Bitsȱ derȱ Binärdatenȱ inȱ einemȱ Zeichen,ȱ z.ȱ B.ȱ inȱ ASCIIȬCodierungȱ dargestelltȱ [IET96].ȱ Dieȱ hierbeiȱ entsteȬ hendeȱZeichenreiheȱwirdȱsodannȱimȱDatenstromȱausȱXMLȬDatenȱzwischenȱeinemȱ SenderȱundȱEmpfängerȱübertragen.ȱȱ ȱ Beispielȱ DieȱfolgendenȱBinärdaten,ȱdieȱinȱ3ȱBytesȱgespeichertȱsind,ȱsollenȱübertragenȱwerȬ den.ȱ '000000001111111110101011'B
152ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ ImȱDatentypȱxs:hexBinaryȱwerdenȱjeweilsȱdieȱWerteȱeinesȱHalbbytesȱinȱeineȱHexaȬ dezimalzifferȱübersetzt.ȱDieȱBinärwerteȱvonȱsechsȱHalbbytesȱergebenȱsomitȱeinenȱ DatenstromȱvonȱsechsȱZeichen.ȱ Binärwerte:
0000
0001
1111
1110
1010
1011
Hexaziffern:
0
1
F
E
A
B
Imȱ Datentypȱ xs:base64Binaryȱ werdenȱ sechsȱ Binärzeichenȱ ausȱ denȱ Binärdatenȱ entȬ nommenȱ undȱ nachȱ derȱ Codierungȱ vonȱ RFCȱ2045ȱ denȱ hierinȱ festgelegtenȱ Base64Ȭ Zeichenȱzugeordnet.ȱDieȱfolgendeȱZuordnungȱzeigtȱdasȱbeispielhafteȱErgebnis.ȱ Binärwerte:
000000
Base64-Zeichen: A
011111
111010
101011
f
6
r
WieȱausȱdenȱbeidenȱBeispielenȱersichtlichȱist,ȱbestehtȱderȱDatenstromȱimȱDatentypȱ xs:hexBinaryȱausȱsechsȱZeichenȱumȱdieȱBits,ȱdieȱinȱdreiȱBytesȱstehen,ȱzuȱübertragen.ȱ Inȱ derȱ Codierungȱ xs:base64Binaryȱ bestehtȱ derȱ Datenstromȱ nurȱ nochȱ ausȱ vierȱ ZeiȬ chen.ȱ DieȱUmsetzungȱinȱXQueryȱzeigenȱdieȱfolgendenȱProgrammstücke.ȱHierinȱsindȱdieȱ jeweiligenȱ Konstruktorenȱ angewendet,ȱ umȱ dieȱ Datenwerteȱ derȱ jeweiligenȱ Typenȱ zuȱerzeugen.ȱ ȱ XQUERY xs:hexBinary( '01FEAB') Ergebnis 01FEAB XQUERY xs:base64Binary('Af6r') Ergebnis Af6r
XML-spezifische Datentypen DieȱXMLȬSchemaȬEmpfehlungȱführtȱnochȱdreiȱprimitiveȱDatentypenȱauf,ȱdieȱspeȬ zielleȱ XMLȬspezifischeȱ Eigenschaftenȱ haben,ȱ wobeiȱ sieȱ auchȱ Ähnlichkeitenȱ mitȱ Zeichendatenȱ aufweisen.ȱ Dieȱ Namenȱ derȱ Datentypenȱ sindȱ xs:anyURI,ȱ xs:QNameȱ undȱxs:NOTATION.ȱ Derȱ Typȱ xs:anyURIȱ beschreibtȱ möglicheȱ Werteȱ vonȱ einheitlichenȱ Bezeichnernȱ fürȱ Ressourcenȱ(UniformȱResourceȱIdentifierȱ–ȱURI).ȱDieȱVorschriftenȱfürȱihreȱtextförmiȬ genȱlexikalischenȱRepräsentationenȱsindȱimȱRFCȱ2396ȱ[NWG98]ȱfestgelegt.ȱ Imȱ folgendenȱ Beispielȱ wirdȱ mitȱ Hilfeȱ desȱ Konstruktorsȱ xs:anyURI()ȱ einȱ internerȱ URIȬWertȱausgeprägtȱundȱimȱErgebnisȱseineȱlexikalischeȱexterneȱkanonischeȱFormȱ dargestellt.ȱ
153ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY xs:anyURI('http://www.Alfred_Moos.de') Ergebnis http://www.Alfred_Moos.de
DerȱprimitiveȱDatentypȱxs:QNameȱdefiniertȱqualifizierteȱURIȬNamen.ȱSieȱbestehenȱ ausȱeinemȱWertȱdesȱTypsȱanyURI,ȱderȱvonȱeinemȱDoppelpunktȱ(:)ȱundȱeinemȱWertȱ desȱ Typsȱ xs:NCNameȱgefolgtȱwird.ȱHiermitȱ werdenȱqualifizierteȱXMLȬBezeichnerȱ ermöglicht.ȱ Beispielsweiseȱ könnteȱ mitȱ demȱ Namensraumpräfixȱ xsȱ derȱ Wertȱ www.Alfred_Moos.deȱvomȱTypȱxs:NCNameȱzuȱeinemȱqualifiziertenȱNamenȱzusamȬ mengebautȱwerden.ȱ XQUERY xs:QName( 'xs:www.Alfred_Moos.de') Ergebnis xs:www.Alfred_Moos.de
Derȱ primitiveȱ Datentypȱ xs:NOTATIONȱ istȱ einȱ abstrakterȱ Typ.ȱ Vonȱ ihmȱ kannȱ esȱ keineȱWerteȱgeben.ȱEsȱistȱjedochȱmöglich,ȱihnȱalsȱVorlageȱfürȱdieȱDeklarationȱvonȱ benutzerdefiniertenȱDatentypenȱzuȱverwenden.ȱSeineȱAnwendungȱwirdȱimȱKapiȬ telȱüberȱdieȱSpracheȱXMLȱSchemaȱbeschrieben.ȱ ȱ InȱTabelleȱ21ȱsindȱdieȱsechsȱsonstigenȱDatentypenȱsystematischȱdargestellt.ȱ NameȱdesȱTypsȱ
Eigenschaftȱ
DB2ȬSQLȱ
xs:booleanȱ
Wahrheitswertȱtrueȱoderȱfalse.ȱ
ȱ
xs:base64Binaryȱ
CodierungȱvonȱBinärdatenȱimȱCodeȱBase64.ȱ
ȱ
xs:hexBinaryȱ
Codierungȱ vonȱ Binärdatenȱ imȱ HexadezimalȬ code.ȱ
ȱ
xs:anyURIȱ
DefiniertȱURIȬWerte.ȱ
ȱ
xs:QNameȱ
Definiertȱ qualifizierteȱ Namen,ȱ dieȱ ausȱ einemȱ ȱ Namensraumpräfixȱ einemȱ Doppelpunktȱ undȱ einemȱlokalenȱNamenȱbestehen.ȱ
xs:NOTATIONȱ
IstȱeinȱabstrakterȱTyp.ȱ
Tabelleȱ21:ȱSonstigeȱDatentypenȱvonȱXQueryȱ
154ȱ
ȱ
6.3ȱȱDatentypenȱinȱXQueryȱ
6.3.6 Übungen Übungen zu numerischen Datentypen ErzeugenȱSieȱeinȱDatenobjektȱdesȱWertesȱzehnȱinȱdenȱfolgendenȱDatentypen:ȱ 1) xs:decimalȱ 2) xs:doubleȱ 3) xs:floatȱ 4) xs:integerȱ 5) xs:longȱ 6) xs:intȱ 7) xs:shortȱ 8) xs:byteȱ 9) xs:nonNegativeIntegerȱ 10) xs:positiveIntegerȱ 11) xs:unsignedLongȱ 12) xs:unsignedIntȱ 13) xs:unsignedShortȱ 14) xs:unsignedByteȱ ErzeugenȱSieȱeinȱDatenobjektȱdesȱWertesȱminusȱzehnȱinȱdenȱfolgendenȱDatenȬ typen:ȱ 15) xs:nonPositiveIntegerȱ 16) xs:negativeIntegerȱ 17) ErzeugenȱSieȱeinȱDatenobjektȱdesȱWertesȱzehnȱimȱDatentypȱxs:byteȱundȱwanȬ delnȱSieȱihnȱSchrittȱfürȱSchrittȱinȱeinenȱimmerȱumfangreicherenȱnumerischenȱ Datentypȱum.ȱ
Übungen zu zeichenförmigen Datentypen ErzeugenȱSieȱeinȱDatenobjektȱdesȱWertesȱȇdeȇȱinȱdenȱfolgendenȱDatentypen:ȱ 18) xs:stringȱ 19) xs:normalizedStringȱ 20) xs:tokenȱ 21) xs:Nameȱ 22) xs:languageȱ 23) xs:NMTOKENȱ 24) xs:NCNameȱ
155ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ 25) xs:IDȱ 26) xs:IDREFȱ 27) Erzeugenȱ Sieȱ einȱ Datenobjektȱ desȱ Wertesȱ ȇhalloȇȱ undȱ wandelnȱ Sieȱ ihnȱ Schrittȱ fürȱSchrittȱinȱeinenȱimmerȱumfangreicherenȱzeichenförmigenȱDatentypȱmitȱgeȬ ringererȱEinschränkungȱum.ȱ
Übungen zu Datum- und Zeittypen ErzeugenȱSieȱeinȱDatenobjektȱderȱfolgendenȱDatentypenȱ 28) xs:dateȱ 29) xs:timeȱ 30) xs:dateTimeȱ 31) xs:gYearMonthȱ 32) xs:gYearȱ 33) xs:gMonthȱ 34) xs:gMonthDayȱ 35) xs:gDayȱ 36) xs:durationȱ 37) xdt:yearMonthDurationȱ 38) xdt:dayTimeDurationȱ
Übungen zu sonstigen Datentypen ErzeugenȱSieȱeinȱDatenobjektȱderȱfolgendenȱDatentypenȱ 39) xs:booleanȱ 40) xs:base64Binaryȱ 41) xs:hexBinaryȱ 42) xs:anyURIȱ 43) xs:QNameȱ
6.4 Ausdrücke in XQuery EinȱAusdruckȱistȱeineȱWertermittlungsvorschrift.ȱAusdrückeȱkönnenȱunterschiedȬ lichȱkomplexȱsein.ȱEinȱsehrȱeinfacherȱAusdruckȱbestehtȱlediglichȱausȱeinemȱLiteral,ȱ z.ȱB.ȱdemȱLiteralȱȇhalloȇȱoderȱ1ȱbzw.ȱausȱeinerȱVariablen,ȱz.ȱB.ȱ$IchBinEineVariable.ȱ KompliziertereȱAusdrückeȱbestehenȱausȱOperatorenȱundȱOperandenȱbzw.ȱFunktiȬ onsaufrufenȱundȱderenȱArgumenten.ȱOperatorenȱundȱFunktionenȱsindȱImplemenȬ tierungenȱvonȱOperationen.ȱ
156ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ Inȱ XQueryȱ istȱ dasȱ Ergebnisȱ einesȱ Ausdrucksȱ einȱ Eintragȱ inȱ einerȱ Sequenz.ȱ Wieȱ schonȱ ausgeführt,ȱ istȱ dieȱ Sequenzȱ dieȱ zentraleȱ Datenstrukturȱ vonȱ XQuery.ȱ Sieȱ kannȱ leerȱ seinȱ oderȱ kannȱ vieleȱ Einträgeȱ gleicherȱ oderȱ unterschiedlicherȱ Typenȱ aufweisen.ȱDieseȱkönnenȱatomareȱWerteȱoderȱXDMȬKnotenȱbzw.ȱXDMȬBäumeȱinȱ beliebigerȱMischungȱsein.ȱ
6.4.1 Sequenzausdrücke EineȱSequenzȱkannȱanonymȱbleibenȱoderȱanȱeineȱXQueryȬVariableȱgebundenȱwerȬ den.ȱ Eineȱ XQueryȬVariableȱ istȱ eineȱ Referenzvariable,ȱ dieȱ aufȱ eineȱ Sequenzȱ verȬ weißt.ȱIhrȱNameȱbeginntȱmitȱeinemȱDollarzeichenȱ$.ȱZwischenȱdemȱDollarzeichenȱ undȱ demȱ eigentlichenȱ Namenȱ könnenȱ Leerzeichenȱ undȱ sogarȱ whiteȱspaceȬSteuerȬ zeichenȱ stehen,ȱz.ȱB.ȱ Wagenrücklaufȱ(CR),ȱTabulatorȱ(TAB)ȱ undȱNeueȱZeileȱ(LF).ȱ Einerȱ Referenzvariablenȱ kannȱ nurȱ einȱ malȱ eineȱ Sequenzȱ zugewiesenȱ werden.ȱ Hierdurchȱ istȱ sieȱ nurȱ eineȱ eingeschränkteȱ Variableȱ undȱ ihreȱ Verwendungȱ etwasȱ gewöhnungsbedürftig.ȱ Beispielȱ AnonymeȱSequenzȱ–ȱSchreibweiseȱohneȱKlammernȱmöglich.ȱ XQUERY 'hallo', 1 Ergebnis hallo 1
EineȱSequenz,ȱdieȱanȱeineȱReferenzvariableȱgebundenȱist.ȱEineȱSequenzȱausȱmehrȱ alsȱeinemȱEintragȱmussȱinȱKlammernȱgeschriebenȱwerden.ȱ XQUERY let $Referenzvariable := ('hallo', 1) return $Referenzvariable Ergebnis hallo 1
DieȱEinträgeȱderȱanonymenȱSequenzȱwerdenȱvonȱXQueryȱimplizit,ȱd.ȱh.ȱohneȱAnȬ wendungȱ derȱ Klauselȱ returnȱ zurȱ Verfügungȱ gestellt.ȱ Dieȱ Werteȱ einerȱ benanntenȱ Sequenz,ȱeinerȱSequenzȱalso,ȱdieȱüberȱeineȱReferenzvariableȱverwaltetȱwird,ȱwerȬ denȱmittelsȱderȱKlauselȱreturnȱvonȱXQueryȱausgegeben.ȱ FürȱdieȱBasisoperationenȱaufȱDaten,ȱnämlichȱ – – – –
schreibenȱ lesenȱ verändernȱundȱ löschenȱ
157ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ gibtȱesȱinȱXQueryȱdieȱzugehörigenȱOperationen.ȱSieȱsindȱeinȱTeilȱderȱDatenmaniȬ pulationsspracheȱ(DML)ȱaufȱSequenzenȱvonȱXQuery.ȱ DerȱOperatorȱzumȱweiterenȱeinfügenȱeinesȱEintragsȱinȱeineȱSequenzȱistȱderȱKomȬ maoperator.ȱErȱtrenntȱdenȱbereitsȱvorhandenenȱSequenzinhaltȱvonȱeinemȱneuȱhinȬ zukommendenȱ Wertȱ ab.ȱ Dieserȱ neueȱ Wertȱ kannȱ atomarȱ oderȱ ebenfallsȱ eineȱ SeȬ quenzȱsein.ȱ Beispieleȱ ȱ ȱAusdruckȱ
Ergebnisȱ
Beschreibungȱ
XQUERY 'hallo', 1 ȱXQUERY ('hallo', (1, 'a'))
hallo 1 hallo 1 a
ȱXQUERY
a b
Kommaoperatorȱschreibtȱdenȱ zweitenȱEintragȱhinterȱdenȱersten.ȱ KommaoperatorȱschreibtȱdieȱEinȬ trägeȱderȱzweitenȱSequenzȱhinterȱ denȱerstenȱEintrag.ȱ KommaoperatorȱschreibtȱdieȱbeiȬ denȱleerenȱSequenzenȱhinterȱdenȱ erstenȱEintrag.ȱ Kommaoperatorȱschreibtȱeinenȱ XMLȬElementknotenȱhinterȱdenȱ zweitenȱEintrag.ȱ
ȱ ȱ
('a', (), (), 'b')
ȱ ȱXQUERY ('a', ȱ ȱ
1, Frau
)
XQUERY let $Sequenz_1 := ('a', 1) $Sequenz_2 := ȱ let ($Sequenz_1, 'b') ȱ return $Sequenz_2 XQUERY ȱ let $Sequenz_1 := ('a', 1) let $Sequenz_2 := ȱ ($Sequenz_1, 'b') return ($Sequenz_2, 'fertig')
ȱ
a 1 Frau a 1 b a 1 b fertig
Kommaoperatorȱschreibtȱeinenȱ EintragȱhinterȱdieȱEinträgeȱeinerȱ Sequenz.ȱ Kommaoperatorȱschreibtȱeinenȱ EintragȱhinterȱdieȱEinträgeȱeinerȱ SequenzȱinȱderȱKlauselȱreturn.ȱ
ȱ
Tabelleȱ22:ȱKommaoperatorȱschreibtȱEintragȱinȱeineȱSequenzȱ
SollȱeineȱFolgeȱvonȱGanzzahlenȱinȱeineȱSequenzȱeingefügtȱwerden,ȱsoȱeignetȱsichȱ hierzuȱderȱOperatorȱto.ȱVonȱihmȱwirdȱeineȱSequenzȱausȱeinerȱaufsteigendenȱFolgeȱ vonȱGanzzahlenȱabȱeinemȱStartwertȱbisȱzuȱeinemȱEndwertȱgeneriert.ȱȱ ȱ ȱ ȱ ȱ ȱ ȱ
158ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ ȱ
Ausdruckȱ ȱ XQUERY ȱ
let $Sequenz := (1 to 3) return $Sequenz
Ergebnisȱ
Beschreibungȱ
1 2 3
DerȱOperatorȱtoȱgeȬ neriertȱganzzahligeȱ WerteȱinȱeinemȱWerteȬ intervall.ȱ WerteȱvonȱȬ1ȱbisȱ+1.ȱ
ȱ ȱ XQUERY let
$Sequenz := (-1 to +1) return $Sequenz ȱ XQUERY ȱ let $Sequenz := (1 to 2, -1 to +1) ȱ return $Sequenz
ȱ
-1 0 1 1 2 -1 0 1
ZweiȱWerteintervalleȱ
Tabelleȱ23:ȱOperatorȱtoȱzumȱGenerierenȱeinerȱSequenzȱausȱaufsteigendenȱGanzzahlenȱ
Dieȱ lesendeȱ Entnahmeȱ vonȱ Datenȱ ausȱ einerȱ Sequenzȱ kannȱ mitȱ Hilfeȱ einesȱ FilterȬ ausdrucksȱ erfolgen.ȱ Einȱ Filterausdruckȱ bestehtȱ ausȱ einemȱ Sequenzausdruckȱ undȱ einerȱ optionalenȱFolgeȱvonȱPrädikaten.ȱJederȱPrädikatsausdruckȱmussȱinȱeckigenȱ Klammernȱeingeschlossenȱwerden.ȱ Dieȱ Wahrheitswerteȱ mehrerȱPrädikatsausdrüȬ ckeȱwerdenȱmiteinanderȱdurchȱdasȱboolescheȱUndȱzuȱeinemȱGesamtwahrheitswertȱ verknüpft.ȱ ȱ
Sequenzausdruck [Prädikatsausdruck] ...
Syntaxȱ25:ȱFilterausdruckȱ
Einȱ Prädikatsausdruckȱ kannȱ einȱ numerischerȱ Ausdruckȱ oderȱ einȱ VergleichsausȬ druckȱsein,ȱderȱeinenȱWahrheitswertȱergibt.ȱ Imȱ Falleȱ einesȱ numerischenȱ Ausdrucksȱ bestimmtȱ derȱ ganzzahligeȱ Ergebniswertȱ dieȱ Positionȱ desȱ Sequenzeintrags,ȱ derȱ ausȱ derȱ Sequenzȱ gelesenȱ werdenȱ soll.ȱ Imȱ FalleȱeinesȱVergleichsausdrucksȱbestimmtȱderȱWahrheitswertȱjeȱuntersuchtenȱEinȬ trag,ȱobȱderȱEintragȱgelesenȱwerdenȱsollȱoderȱnicht.ȱ
159ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ
AusdruckȱundȱErgebnisȱ
XQUERY ȱ let $Sequenz := ('hallo', 'Freunde') let $Sequenz_zweiter_Wert := $Sequenz[ 2 ] ȱ return $Sequenz_zweiter_Wert
Beschreibung Dasȱ numerischeȱ Literalȱ 2ȱ imȱ Prädikatȱ besagt,ȱ dassȱ derȱ zweiteȱ Eintragȱzuȱlesenȱist.ȱ
ȱ Ergebnis ȱ Freunde
XQUERY let $Sequenz := ('hallo', 'Freunde') let $i := 1 ȱ let $Sequenz_zweiter_Wert := $Sequenz[ $i + 1 ] ȱ return $Sequenz_zweiter_Wert
ȱ
ȱ
Derȱ numerischeȱ Ausdruckȱ imȱ Prädikatȱ wirdȱ ausgewertet.ȱ Seinȱ ganzzahligerȱ Wertȱ bestimmtȱ dieȱ Nummerȱ desȱ auszuwählendenȱ Eintrags.ȱ
Ergebnis
ȱ Freundeȱ
XQUERY let $Sequenz_ganze_Zahlen := (1 to 6) let $Sequenz_gerade_Zahlen := ȱ $Sequenz_ganze_Zahlen[ . mod 2 eq 0] return $Sequenz_gerade_Zahlen ȱ
ȱ
ȱ Ergebnis 2
ȱ4 ȱ 6XQUERY let $Sequenz_ganze_Zahlen := (1 to 6) let $Sequenz_gerade_Zahlen := $Sequenz_ganze_Zahlen [ . mod 2 eq 0] [ . gt 4 ] return $Sequenz_gerade_Zahlen
ȱ ȱ ȱ ȱ
Dasȱ Prädikatȱ bestehtȱ ausȱ demȱ Punkt.ȱ Erȱ istȱ derȱ Kontextoperatorȱ undȱ repräsentiertȱ denȱ aktuellenȱ Eintragȱ derȱ Sequenz.ȱ Vomȱ OpeȬ ratorȱ modȱ wirdȱ derȱ aktuelleȱ EinȬ tragȱ durchȱ 2ȱ dividiert.ȱ Derȱ DiviȬ sionsrestȱ wirdȱ mitȱ 0ȱ aufȱ GleichȬ heitȱverglichen.ȱ Dieȱ beidenȱ Filterprädikateȱ werȬ denȱ implizitȱ mitȱ demȱ boolȇschenȱ OperatorȱUndȱverknüpft.ȱ
Ergebnis
ȱ 6ȱ ȱ
Tabelleȱ24:ȱSequenzenȱundȱFilterausdrückeȱ
Außerȱ demȱ Kommaoperator,ȱ demȱ Operatorȱ toȱ undȱ Filterausdrücken,ȱ stelltȱ XQueryȱeineȱReiheȱeingebauterȱFunktionenȱzurȱVerfügung,ȱmitȱdenenȱSequenzenȱ alsȱGanzesȱmanipulierbarȱsind.ȱTabelleȱ25ȱbeschreibtȱdieseȱFunktionen.ȱ
160ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ ȱ Ausdruckȱ ȱ XQUERY ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
let $Seq_1 := ('a') let $Seq_2 := fn:insertbefore( $Seq_1, 1, 'vor' ) return $Seq_2 XQUERY let $Seq_1 := ('a', 'b', 'c', 'd') let $Seq_2 := fn:subsequence( $Seq_1, 3, 2 ) return $Seq_2 XQUERY let $Seq_1 := ('a', 'b', 'c') let $Seq_2 := fn:remove( $Seq_1, 2 ) return $Seq_2 XQUERY let $Seq_1 := ('a', 'b', 'c') let $Seq_2 := fn:insertbefore( fn:remove( $Seq_1, 2 ) , 2, 'geändert' ) return $Seq_2 XQUERY let $Seq_1 := ('a', 'b', 'c') let $Seq_2 := fn:reverse( $Seq_1 ) return $Seq_2 XQUERY let $Seq_1 := (, ) let $Seq_2 := (, ) let $Seq_3 := fn:unordered( $Seq_1 union $Seq_2 ) return $Seq_3
Ergebnisȱ
Beschreibungȱ
vor a
DieȱFunktionȱ insertȬbefore()ȱschreibtȱ einenȱneuenȱEintragȱinȱdieȱSequenzȱ vorȱ denȱ vorhandenenȱ Eintragȱ anȱ einerȱangegebenenȱPosition,ȱhierȱ1.ȱ
c d
Dieȱ Funktionȱ subsequence()ȱ liestȱ eineȱ Teilsequenzȱ inȱ derȱ BasisseȬ quenzȱ abȱ einerȱ Positionȱ inȱ einerȱ Anzahlȱ anȱ Einträgen,ȱ hierȱ abȱ derȱ Positionȱ3ȱinȱderȱAnzahlȱ2.ȱ
a c
Dieȱ Funktionȱ remove()ȱ löschtȱ einenȱ Eintragȱ ausȱ derȱ Sequenzȱ anȱ einerȱ angegebenenȱPosition,ȱhierȱ2.ȱ
a geändert c
Fürȱ dasȱ Ändernȱ einesȱ Wertesȱ gibtȱ esȱ keineȱ eigeneȱ Funktionȱ inȱ XQuery.ȱ Deshalbȱ mussȱ zunächstȱ mitȱ derȱ Funktionȱ remove()ȱ derȱ vorhandeneȱWertȱgelöschtȱwerden.ȱ AnschließendȱwirdȱmitȱderȱFunktiȬ onȱ insertȬbefore()ȱ derȱ Ersatzwertȱ eingefügt.ȱ
c b a
Dieȱ Funktionȱ reverse()ȱ gibtȱ dieȱ EinȬ trägeȱ einerȱ Sequenzȱ inȱ umgekehrȬ terȱReihenfolgeȱzurück.ȱ
Dieȱ Funktionȱ unordered()ȱ istȱ eineȱ Optimierungsfunktion.ȱ Mitȱ ihrȱ wirdȱ derȱ Verzichtȱ aufȱ eineȱ SortieȬ rungȱzumȱAusdruckȱgebracht.ȱ
Tabelleȱ25:ȱEingebauteȱFunktionenȱzurȱManipulationȱvonȱSequenzenȱ
161ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Damitȱmanȱfeststellenȱkann,ȱȱ – obȱeineȱSequenzȱEinträgeȱenthältȱundȱȱ – anȱwelcherȱPositionȱinȱderȱSequenzȱdieseȱstehenȱundȱ – umȱwieȱvieleȱEinträgeȱesȱsichȱhandelt,ȱ gibtȱesȱinȱXQueryȱweitereȱOperationenȱinȱGestaltȱvonȱeingebautenȱFunktionen.ȱȱ ȱ Ausdruckȱ ȱ XQUERY ȱ
let $Sequenz := ('a', 'b') return fn:count($Sequenz )
Ergebnisȱ
Beschreibungȱ
2
Dieȱ Funktionȱ count()ȱ gibtȱ dieȱ Anzahlȱ derȱ Einträgeȱ einerȱ Sequenzȱ zurück,ȱ dieȱ inȱ ihremȱ Argumentȱangegebenȱist.ȱ Dieȱ Funktionȱ exactlyȬone()ȱ gibtȱ dieȱ Sequenzȱ ihresȱ Argumentsȱ zurück,ȱ wennȱ dieseȱ genauȱ ausȱ einemȱ Eintragȱ besteht.ȱ AnȬ sonstenȱwirdȱeinȱFehlerȱausgeȬ löst.ȱ
ȱ ȱ ȱ
XQUERY let $Sequenz := ('hallo') return fn:exactlyone( $Sequenz )
hallo
XQUERY let $Sequenz := (()) return fn:zero-orone( $Sequenz )
(*leere Sequenz*)
XQUERY let $Sequenz := ('hallo') return fn:zero-orone( $Sequenz )
hallo
XQUERY let $Sequenz := (('hallo', 1)) return fn:one-ormore( $Sequenz )
hallo 1
DieȱFunktionȱoneȬorȬmore()ȱgibtȱ dieȱ Sequenzȱ ihresȱ Argumentsȱ zurück,ȱ wennȱ dieseȱ mindesȬ tensȱausȱeinemȱEintragȱbesteht.ȱ Ansonstenȱ wirdȱ einȱ Fehlerȱ ausgelöst.ȱ
XQUERY let $Sequenz := (('hallo')) return fn:exists( $Sequenz )
true
Dieȱ Funktionȱ exists()ȱ gibtȱ denȱ Wahrheitswertȱ trueȱ zurück,ȱ wennȱ dieȱ Sequenzȱ imȱ ArguȬ mentȱmindestensȱeinenȱEintragȱ enthält.ȱ Istȱ sieȱ leer,ȱ wirdȱ falseȱ zurückgegeben.ȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
XQUERY let $Sequenz := (()) return fn:exists( $Sequenz ) XQUERY let $Sequenz := (('hallo')) return fn:empty( $Sequenz ) XQUERY let $Sequenz := (()) return fn:empty( $Sequenz )
ȱ ȱ
162ȱ
false false
true
Dieȱ Funktionȱ zeroȬorȬone()ȱ gibtȱ dieȱ Sequenzȱ ihresȱ Argumentsȱ zurück,ȱ wennȱ dieseȱ genauȱ ausȱ einemȱ Eintragȱ bestehtȱ oderȱ leerȱ ist.ȱ Ansonstenȱ wirdȱ einȱ Fehlerȱausgelöst.ȱ
Dieȱ Funktionȱ empty()ȱ gibtȱ denȱ Wahrheitswertȱ trueȱ zurück,ȱ wennȱ dieȱ Sequenzȱ imȱ ArguȬ mentȱ leerȱ ist.ȱ Istȱ sieȱ nichtȱ leer,ȱ wirdȱfalseȱzurückgegeben.ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ ȱ Ausdruckȱ ȱ
XQUERY let $Sequenz := ('a', 'b',
ȱ
1
DieȱFunktionȱindexȬof()ȱgibtȱeineȱ Sequenzȱ ausȱ Ganzzahlenȱ zuȬ rück.ȱEineȱZahlȱistȱdieȱNummerȱ einerȱ Fundstelleȱ inȱ derȱ durchȬ suchtenȱ Sequenz,ȱ derenȱ Wertȱ durchȱ dasȱ zweiteȱ Argumentȱ bestimmtȱwird.ȱ
3
'a')
ȱ
XQUERY
ȱ
a
let $Sequenz := ('a', 'b',
b
'a')
ȱ
return fn:distinctvalues($Sequenz)
ȱ ȱ
Beschreibungȱ
return fn:index-of( $Sequenz, 'a' )
ȱ ȱ
Ergebnisȱ
Dieȱ Funktionȱ distinctȬvalues()ȱ gibtȱ eineȱ Sequenzȱ ausȱ Wertenȱ zurück,ȱ dieȱ sichȱ voneinanderȱ unterscheiden.ȱ
ȱ
Tabelleȱ26:ȱEingebauteȱFunktionenȱzurȱAbfrageȱvonȱSequenzeigenschaftenȱ
DasȱKlassendiagrammȱinȱAbbildungȱ51ȱzeigtȱinȱeinerȱGesamtschauȱinȱderȱSpracheȱ UMLȱ dieȱ Namenȱ bzw.ȱ Signaturhinweiseȱ derȱ Operationenȱ aufȱ Sequenzenȱ inȱ GeȬ staltȱderȱinȱXQueryȱeingebautenȱFunktionen,ȱdemȱKommaoperatorȱundȱdemȱOperaȬ torȱto.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Sequenz , ( [in] Sequenz ) : Sequenz to ( [in] Obergrenze ) : Sequenz Filterausdruck ( [in] Sequenz ) : Sequenz insert-before ( [in] SequenzVorhanden , [in] Position , [in] SequenzNeu ) : Sequenz subsequence ( [in] Sequenz , [in] AbEintrag , [in] AnzahlEinträge ) : Sequenz remove ( [in] Sequenz , [in] NummerDesEintrags ) : Sequenz reverse ( [in] Sequenz ) : Sequenz unordered ( [in] Sequenz ) : Sequenz count ( [in] Sequenz ) : xs:integer exactly-one ( [in] Sequenz ) : Sequenz zero-or-one ( [in] Sequenz ) : Sequenz one-or-more ( [in] Sequenz ) : Sequenz exists ( [in] Sequenz ) : xs:boolean empty ( [in] Sequenz ) : xs:boolean index-of ( [in] Sequenz , [in] Wert ) : Sequenz distinct-values ( [in] Sequenz ) : Sequenz
ȱ ȱ ȱ
Die Funktionen befinden sich im Namensraum fn
ȱ
Abbildungȱ51:ȱOperationenȱaufȱSequenzenȱimplementiertȱmitȱOperatorenȱundȱeingebauȬ tenȱFunktionenȱ
163ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ
6.4.2 Arithmetische Ausdrücke Mitȱ Wertenȱ numerischerȱ Datentypenȱ könnenȱ inȱ XQueryȱ Rechenoperationenȱ mitȱ beträchtlicherȱ Komplexitätȱ durchgeführtȱ werden.ȱ Beiȱ ihnenȱ geltenȱ dieȱ gewöhnliȬ chenȱ Rechenregelnȱ hinsichtlichȱ Prioritätȱ undȱ Reihenfolgeȱ derȱ Abarbeitungȱ undȱ Klammerung.ȱVerfügbarȱsindȱfolgendeȱOperatorenȱinȱXQueryȱvonȱDB2.ȱȱ – Vorzeichenoperatorenȱ negativesȱVorzeichenȱ–ȱȱ positivesȱVorzeichenȱ+ȱ – OperatorenȱfürȱdieȱPunktrechnungȱ Multiplikationȱ*ȱ Divisionȱdivȱ ganzzahligeȱDivisionȱidivȱ Divisionsrestbildungȱ(Modulo)ȱmodȱ – OperatorenȱfürȱdieȱStrichrechnungȱ Additionȱ+ȱȱ Subtraktionȱ–ȱȱ Beispielȱ ZinsberechnungȱfürȱeinȱKapitalȱüberȱ1.000ȱEuroȱmitȱeinemȱZinssatzȱvonȱ4ȱProzentȱ undȱeinerȱLaufzeitȱvonȱ360ȱTagen.ȱ XQUERY let let let let
$Kapital $Zinssatz $Tage $Zins
:= := := :=
1000 4 360 ($Kapital * $Zinssatz * $Tage) div (100 * 360)
return $Zins
(1) (2) (3) (4) (5) (6) (7)
Programmȱ60:ȱZinsberechnung Ergebnis 40
ȱ Nebenȱ denȱ arithmetischenȱ Operatorenȱ bietetȱ XQueryȱ eineȱ Reiheȱ eingebauterȱ Funktionen,ȱmitȱdenenȱarithmetischeȱOperationenȱausgeführtȱwerdenȱkönnen.ȱ
164ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Ausdruckȱ
Istȱ
Beschreibungȱ
XQUERY let $Wert := -1 return fn:abs( $Wert )
1
XQUERY let $Wert := 3.1 return fn:ceiling( $Wert ) XQUERY fn:ceiling( -3.1 ) XQUERY let $Wert := 3.9 return fn:floor( $Wert ) XQUERY fn:floor( -3.9 ) XQUERY let $Wert := 1000000 return fn:number( $Wert )
4
Dieȱ Funktionȱ abs()ȱ gibtȱ denȱ absoluȬ tenȱ Wertȱ desȱ numerischenȱ ArguȬ mentsȱzurück.ȱ DieȱFunktionȱceiling()ȱgibtȱdieȱnächstȱ größereȱ Ganzzahlȱ desȱ ArgumentȬ wertesȱzurück.ȱ
XQUERY let $Wert := 3.49 return fn:round( $Wert ) XQUERY fn:round( 3.5 ) XQUERY fn:round( -3.5 ) XQUERY fn:round( -3.51 ) XQUERY let $Wert := 3.495 return fn:round-half-to-even( $Wert, 2 ) XQUERY fn:round-half-to-even(3.494, 2) XQUERY fn:round-half-to-even(-3.495, 2) XQUERY let $Sequenz := (1, 2, 3) return fn:sum( $Sequenz )
3
-3 3
-4 1E6
4 -3 -4 3.5
3.49 -3.5
Dieȱ Funktionȱ floor()ȱ gibtȱ dieȱ nächstȱ kleinereȱ Ganzzahlȱ desȱ ArgumentȬ wertesȱzurück.ȱ DieȱFunktionȱnumber()ȱkonvertiertȱ denȱWertȱdesȱArgumentsȱinȱeineȱ GleitpunktzahlȱdesȱTypsȱxs:double.ȱ Dieȱ Funktionȱ round()ȱ rundetȱ ganzȬ zahlig.ȱ Istȱ derȱ gebrocheneȱ Teilȱ desȱ Argumentsȱ kleinerȱ alsȱ 0,5ȱ wirdȱ abgerundet.ȱBeiȱ0,5ȱundȱgrößerȱwirdȱ aufgerundet.ȱ BeiȱȬ0.5ȱwirdȱaufȱdieȱnächsteȱnegatiȬ veȱGanzzahlȱabgerundet.ȱ Dieȱ Funktionȱ roundȬhalfȬtoȬeven()ȱ rundetȱ kommerziellȱ anȱ derȱ DeziȬ malstelle,ȱ dieȱ dasȱ zweiteȱ Argumentȱ angibt.ȱ Dasȱ zweiteȱ Argumentȱ kannȱ auchȱ eineȱ negativeȱ Zahlȱ sein.ȱ Dannȱ wirdȱ derȱganzzahligeȱTeilȱgerundet.ȱ
6
Dieȱ Funktionȱsum()ȱgibtȱ dieȱ Summeȱ derȱ Zahlenȱ derȱ Sequenzȱ inȱ ihremȱ Argumentȱzurück.ȱ
2
DieȱFunktionȱavg()ȱgibtȱdasȱarithmeȬ tischeȱ Mittelȱ derȱ Zahlenȱ derȱ SeȬ quenzȱinȱihremȱArgumentȱzurück.ȱ
XQUERY let $Sequenz := (1, 2, 3) return fn:min( $Sequenz )
1
Dieȱ Funktionȱ min()ȱ gibtȱ dieȱ kleinsteȱ Zahlȱ derȱ Zahlenȱ derȱ Sequenzȱ inȱ ihremȱArgumentȱzurück.ȱ
XQUERY let $Sequenz := (1, 2, -3) return fn:max( $Sequenz )
2
XQUERY let $Sequenz := (1, 2, 3) return fn:avg( $Sequenz )
Dieȱ Funktionȱ max()ȱ gibtȱ dieȱ größteȱ Zahlȱ derȱ Zahlenȱ derȱ Sequenzȱ inȱ ihremȱArgumentȱzurück.ȱ
ȱ Tabelleȱ27:ȱEingebauteȱFunktionenȱzurȱUnterstützungȱderȱArithmetikȱ
165ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ DasȱKlassendiagrammȱinȱAbbildungȱ52ȱzeigtȱinȱeinerȱGesamtschauȱinȱderȱSpracheȱ UMLȱdieȱNamenȱbzw.ȱSignaturhinweiseȱderȱOperationenȱaufȱatomareȱnumerischeȱ WerteȱundȱnumerischeȱSequenzenȱinȱGestaltȱderȱinȱXQueryȱvonȱDB2ȱverfügbarenȱ OperatorenȱundȱeingebautenȱFunktionen.ȱ ȱ
Numerische Daten
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
positives Vorzeichen + ( [in] Atom ) : Atom negatives Vorzeichen - ( [in] Atom ) : Atom Mulitplikation * ( [in] Atom ) : Atom Division div ( [in] Atom ) : Atom ganzzahlige Division idiv ( [in] Atom ) : Atom Modulo mod ( [in] Atom ) : Atom Addition + ( [in] Atom ) : Atom Subtraktion - ( [in] Atom ) : Atom abs ( [in] Atom ) : Atom ceiling ( [in] Atom ) : Atom floor ( [in] Atom ) : Atom number ( [in] Atom ) : Atom round ( [in] Atom ) : Atom round-half-to-even ( [in] Atom , [in] Position ) : Atom sum ( [in] Sequenz ) : Atom avg ( [in] Sequenz ) : Atom min ( [in] Sequenz ) : Atom max ( [in] Sequenz ) : Atom
ȱ ȱ
Die Funktionen befinden sich im Namensraum fn
ȱ
ȱ
Abbildungȱ52:ȱArithmetischeȱOperationenȱinȱGestaltȱvonȱOperatorenȱundȱFunktionenȱ
6.4.3 Datum- und Zeitausdrücke XQueryȱunterstütztȱinȱeleganterȱArtȱundȱWeiseȱdasȱRechnenȱmitȱWertenȱderȱDaȬ tumsȬȱ undȱ Zeittypen.ȱ Sieȱ sindȱ inȱ Tabelleȱ 20ȱ dargestellt.ȱ Folgendeȱ Werteȱ könnenȱ mitȱderȱDatumȬȱundȱZeitarithmetikȱermitteltȱwerdenȱ – ZeitraumȱzwischenȱzweiȱZeitpunktenȱ – ZeitpunktȱausȱeinemȱZeitpunktȱundȱeinemȱZeitraumȱ – ZeitraumȱausȱZeiträumenȱ – DatumȬȱundȱZeitkomponentenȱausȱeinemȱentsprechendenȱWert.ȱ DasȱFormatȱderȱKonstruktorenȱzurȱAusprägungȱvonȱDatumȬȱundȱZeitwertenȱistȱinȱ Abbildungȱ49ȱdargestellt.ȱ
166ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ
Zeitraum zwischen zwei Zeitpunkten EinȱZeitraumȱwirdȱberechnet,ȱindemȱvonȱeinemȱZeitpunktȱeinȱandererȱZeitpunktȱ subtrahiertȱ wird.ȱ Imȱ folgendenȱ Beispielȱ wirdȱ vonȱ einemȱ späterenȱ Zeitpunktwertȱ vomȱDatentypȱxs:dateȱeinȱfrühererȱZeitpunktwertȱabgezogen,ȱsieheȱProgrammzeileȱ (4)ȱundȱ(5).ȱȱ XQUERY let $Datum_vorher := xs:date('2007-05-14') let $Datum_nachher := xs:date('2008-06-15') let $Zeitraum := $Datum_nachher - $Datum_vorher return $Zeitraum
(1) (2) (3) (4) (5) (6)
Programmȱ61:ȱZeitraumȱinȱTagenȱergibtȱsichȱalsȱDifferenzȱzweierȱZeitpunkte Ergebnis P398D Bedeutung: P = period (Zeitdauer) D = days
Dasȱ Ergebnisȱzeigt,ȱdassȱeinȱZeitraumȱinȱTagenȱberechnetȱ wird.ȱDasȱ Ergebnisȱistȱ negativ,ȱz.ȱB.ȱȬP398D,ȱfallsȱderȱMinuendȱkleinerȱistȱalsȱderȱSubtrahend,ȱz.ȱB.ȱ$DaȬ tum_vorherȱ–ȱ$Datum_nachher.ȱ ImȱProgrammȱ62ȱwirdȱgezeigt,ȱwieȱeinȱZeitraumȱausȱZeitpunktwertenȱdesȱDatenȬ typsȱxs:timeȱberechnetȱwird,ȱalsoȱeineȱUhrzeitdauer.ȱ XQUERY let $Uhrzeit_vorher := xs:time('08:00:00') let $Uhrzeit_nachher := xs:time('13:30:30') let $Zeitraum := $Uhrzeit_nachher - $Uhrzeit_vorher return $Zeitraum
(1) (2) (3) (4) (5) (6)
Programmȱ62:ȱZeitraumȱinȱStunden,ȱMinutenȱundȱSekundenȱergibtȱsichȱalsȱDifferenzȱ zweierȱZeitpunkte Ergebnis PT5H30M30S Bedeutung: P = period (Zeitdauer) T = time H = hour M = minute S = second
Auchȱ zwischenȱ zweiȱ Zeitpunktwertenȱ vomȱ Datentypȱ xs:dateTime,ȱ alsoȱ ZeitstemȬ pelwerten,ȱkannȱdieȱZeitdauerȱberechnetȱwerden.ȱDasȱfolgendeȱBeispielȱzeigtȱdieȱ Vorgehensweise.ȱ
167ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY let $Zeitstempel_vorher := xs:dateTime('2007-01-01T01:02:03.123456') let $Zeitstempel_nachher := xs:dateTime('2008-12-31T23:59:59.654321') let $Zeitraum := $Zeitstempel_nachher - $Zeitstempel_vorher return $Zeitraum
(1) (2) (3) (4) (5) (6) (7) (8)
Programmȱ63:ȱZeitraumȱzwischenȱzweiȱZeitstempelwerten Ergebnis P730DT22H57M56.530865S
Zeitpunkt aus einem Zeitpunkt und einem Zeitraum Durchȱ dieȱ Additionȱ einesȱ Zeitraumesȱ zuȱ einemȱ Zeitpunktȱ bzw.ȱ derȱ Subtraktionȱ einesȱ Zeitraumsȱ vonȱ einemȱ Zeitpunktȱ wirdȱ einȱ neuerȱ Zeitpunktȱ berechnet.ȱ Imȱ folgendenȱBeispielȱwirdȱzuȱeinemȱZeitpunktwertȱvomȱTypȱxs:dateTimeȱ(ZeitstemȬ pel)ȱ einȱ Zeitraumwertȱ vomȱ Typȱ xdt:dayTimeDurationȱ hinzuaddiert.ȱ Dasȱ Ergebnisȱ istȱwiederȱeinȱZeitstempelwert.ȱ XQUERY let $Zeitpunkt_von := xs:dateTime('2007-01-01T01:02:03.123456') let $Zeitraum := xdt:dayTimeDuration('P730DT22H57M56.530865S') let $Zeitpunkt_bis := $Zeitpunkt_von + $Zeitraum return $Zeitpunkt_bis
(1) (2) (3) (4) (5) (6) (7) (8)
Programmȱ64:ȱZeitpunktȱausȱZeitpunktȱplusȱZeitraum Ergebnis 2008-12-31T23:59:59.654321
Zeitraum aus Zeiträumen MitȱZeiträumenȱkönnenȱdieȱvierȱGrundrechenartenȱdurchgeführtȱwerdenȱ – – – – –
Zeiträumeȱmiteinanderȱaddierenȱ Zeiträumeȱvoneinanderȱsubtrahierenȱ EinenȱZeitraumȱmitȱeinerȱZahlȱmultiplizierenȱ EinenȱZeitraumȱdurchȱeineȱZahlȱdividierenȱ EinenȱZeitraumȱdurchȱeinenȱZeitraumȱdividieren.ȱ
ImȱfolgendenȱBeispielȱwerdenȱzweiȱZeiträumeȱzusammenaddiert.ȱ XQUERY let $Zeitraum_einfach := xdt:dayTimeDuration('P730DT22H57M56.530865S') let $Zeitraum_zweifach := $Zeitraum_einfach + $Zeitraum_einfach return $Zeitraum_zweifach
Programmȱ65:ȱSummeȱvonȱzweiȱZeiträumen
168ȱ
(1) (2) (3) (4) (5) (6)
6.4ȱȱAusdrückeȱinȱXQueryȱ Ergebnis P1461DT21H55M53.06173S
InȱgleicherȱArtȱwirdȱvonȱeinemȱZeitraumȱeinȱandererȱZeitraumȱsubtrahiert.ȱ DieȱDivisionȱeinesȱZeitraumsȱdurchȱeineȱZahl,ȱsieheȱProgrammzeileȱ(5),ȱdemonsȬ triertȱdasȱfolgendeȱBeispiel.ȱ XQUERY let $Zeitraum_einfach := xdt:dayTimeDuration('P730DT22H57M56.530865S') let $Zeitraum_Haelfte := $Zeitraum_einfach div 2.5 return $Zeitraum_Haelfte
(1) (2) (3) (4) (5) (6)
Programmȱ66:ȱDivisionȱeinesȱZeitraumsȱdurchȱeineȱZahlȱ Ergebnis P292DT9H11M10.612346S
Sollȱermitteltȱwerden,ȱwieȱoftȱeinȱZeitraumȱinȱeinenȱanderenȱZeitraumȱpasst,ȱbietetȱ sichȱ hierzuȱ ebenfallsȱ dieȱ Divisionȱ an.ȱ Hierzuȱ wirdȱ derȱ eineȱ Zeitraumȱ durchȱ denȱ anderenȱZeitraumȱdividiert,ȱwieȱdasȱfolgendeȱBeispielȱzeigt.ȱUmȱzuȱdemonstrieren,ȱ dassȱhierbeiȱauchȱgebrocheneȱErgebniszahlenȱzulässigȱsind,ȱwirdȱinȱProgrammzeiȬ leȱ(7)ȱderȱDividendȱgeringfügigȱverkleinert.ȱ ȱ XQUERY let $Zeitraum_einfach := xdt:dayTimeDuration('P730DT22H57M56.530865S') let $Zeitraum_zweifach := $Zeitraum_einfach + $Zeitraum_einfach let $Zeitraum := $Zeitraum_zweifach - xdt:dayTimeDuration('PT1S') let $Anzahl := $Zeitraum div $Zeitraum_einfach return $Anzahl
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
Programmȱ67:ȱDivisionȱeinesȱZeitraumsȱdurchȱeinenȱZeitraum Ergebnis 1.9999999841
Datum- und Zeitkomponenten aus einem entsprechenden Wert MitȱdenȱeingebautenȱFunktionen,ȱdieȱimȱfolgendenȱBeispielȱabȱderȱProgrammzeileȱ (3)ȱbisȱ(9)ȱverwendetȱwerden,ȱkannȱinȱXQueryȱvonȱDB2ȱV9.5ȱausȱDatenwertenȱdesȱ Typsȱ xs:dateTimeȱ undȱ teilweiseȱ desȱ Typsȱ xs:dateȱ einigeȱ Bestandteileȱ abgegriffenȱ werden.ȱ ZurȱVereinfachungȱderȱErgebnisausgabeȱwirdȱinȱderȱKlauselȱ returnȱ eineȱ Ausgabesequenzȱ ausȱ denȱ einzelnenȱ Ergebnissenȱ zusammengebaut,ȱ sieheȱ ProȬ grammzeileȱ(10)ȱbisȱ(12).ȱ ȱ
169ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY let $Aktueller_Zeitstempel := fn:current-dateTime() let $Jahr := xs:gYear( $Aktueller_Zeitstempel let $Monat := xs:gMonth( $Aktueller_Zeitstempel let $Tag := xs:gDay( $Aktueller_Zeitstempel let $JahrMonat := xs:gYearMonth( $Aktueller_Zeitstempel let $MonatTag := xs:gMonthDay( $Aktueller_Zeitstempel let $Datum := xs:date( $Aktueller_Zeitstempel let $Uhrzeit := xs:time( $Aktueller_Zeitstempel Return ($Jahr, $Monat, $Tag, $JahrMonat, $MonatTag, $Datum, $Uhrzeit )
) ) ) ) ) ) )
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
Programmȱ68:ȱEntnahmeȱvonȱBestandteilenȱeinesȱZeitstempelwertesȱmitȱeingebautenȱ Funktionen Ergebnis 2008Z --02Z ---20Z 2008-02Z --02-20Z 2008-02-20Z 19:17:12.953Z
DasȱKlassendiagrammȱinȱAbbildungȱ53ȱzeigtȱinȱeinerȱabstraktenȱGesamtschauȱinȱ derȱ Spracheȱ UMLȱ dieȱ Namenȱ derȱ Operationenȱ aufȱ Werteȱ derȱ Typenȱ fürȱ Datumȱ undȱZeitȱsowieȱdieȱeingebautenȱFunktionenȱzurȱEntnahmeȱvonȱDatumȬȱundȱZeitȬ bestandteilenȱausȱDatumȬȱundȱZeitwerten.ȱ ȱ Datum- und Zeittypen Addition mit Operator + ( ) Subtraktion mit Operator - ( ) Multiplikation mit Operator * ( ) Division mit Operator div ( ) Jahr entnehmen mit Funktion gYear ( ) Monat entnehmen mit Funktion gMonth ( ) Tag entnehmen mit Funktion gDay ( ) Jahr und Monat entnehmen mit Funktion gYearMonth ( ) Monat und Tag entnehmen mit Funktion gMonthDay ( ) Datum entnehmen mit Funktion date ( ) Uhrzeit entnehmen mit Funktion time ( )
Die Funktionen befinden sich im Namensraum xs:
ȱ
ȱ
Abbildungȱ53:ȱDatumȬȱundȱZeitoperationenȱinȱGestaltȱvonȱOperatorenȱundȱeingebautenȱ Funktionenȱ
170ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ
6.4.4 Zeichenkettenausdrücke Operationenȱ mitȱ Zeichenkettenȱ sindȱ inȱ XQueryȱ inȱ eingebautenȱ Funktionenȱ impȬ lementiert.ȱDieseȱsindȱrechtȱumfangreich.ȱInȱderȱfolgendenȱTabelleȱsindȱihreȱFunkȬ tionsweisenȱkurzȱundȱbeispielhaftȱdargestellt.ȱ Ausdruckȱ
Ergebnisȱ
Beschreibungȱ
XQUERY let $Sequenz := ( 104, 97, 108, 108, 111 ) return fn:codepoints-to-string( $Sequenz )
hallo
Dieȱ Funktionȱ codepointsȬtoȬ string()ȱ gibtȱ einenȱ ZeichenketȬ tenwertȱ zurück.ȱ Ihrȱ Argumentȱ istȱ eineȱ Sequenzȱ ausȱ GanzzahȬ len.ȱ Einȱ Zeichenȱ derȱ ZeichenȬ ketteȱwirdȱdurchȱdenȱjeweiligenȱ Ganzzahlwertȱ derȱ Sequenzȱ inȱ derȱUnicodeȬTabelleȱadressiert.ȱ
XQUERY fn:compare( 'a', 'b')
-1
XQUERY fn:compare( 'b', 'a')
1
XQUERY fn:compare( 'a', 'a')
0
XQUERY let $Zk1 let $Zk2 let $Zk3 return $Zk3)
:= 'hallo' := ' ' := 'Freunde' fn:concat($Zk1,
hallo Freunde
Dieȱ Funktionȱ compare()ȱ verȬ gleichtȱ zweiȱ Zeichenkettenȱ hinȬ sichtlichȱderenȱWertigkeitȱunterȱ Berücksichtigungȱ derȱ SortierȬ reihenfolgeȱ derȱ Zeichen.ȱ Ihrȱ Rückgabewertȱ istȱ entwederȱ dieȱ Zahlȱ Ȭ1,ȱ 0ȱ oderȱ +1.ȱ Dieȱ Zahlȱ Ȭ1ȱ bedeutet,ȱ dasȱ ersteȱ Argumentȱ istȱ kleinerȱ alsȱ dasȱ zweite.ȱ Dieȱ Zahlȱ+1ȱdasȱGegenteil.ȱDieȱZahlȱ 0,ȱdassȱbeideȱgleichȱsind.ȱ Dieȱ Funktionȱ concat()ȱ verkettetȱ mehrereȱZeichenkettenȱzuȱeinerȱ Zeichenkette.ȱ
$Zk2,
XQUERY fn:contains('hallo', 'll')
true
XQUERY fn:contains('hallo', 'xx')
false
XQUERY let $Ort := 'Hemsbach' let $Endung := 'bach' return fn:ends-with($Ort, $Endung) XQUERY let $Zk := 'HALLO' return fn:lower-case ( $Zk )
true
hallo
Dieȱ Funktionȱ contains()ȱ prüft,ȱ obȱ inȱ einerȱ Zeichenketteȱ eineȱ andereȱ Zeichenketteȱ enthaltenȱ ist.ȱ Sieȱ gibtȱ einenȱ WahrheitsȬ wertȱzurück.ȱ Dieȱ Funktionȱ endsȬwith()ȱ prüft,ȱ obȱ eineȱ Zeichenketteȱ mitȱ einerȱ anderenȱZeichenketteȱendet.ȱSieȱ gibtȱ einenȱ Wahrheitswertȱ zuȬ rück.ȱ Dieȱ Funktionȱ lowerȬcase()ȱ transȬ formiertȱ dieȱ Zeichenȱ einerȱ ZeiȬ chenketteȱinȱKleinbuchstaben.ȱ
171ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ XQUERY ȱ
fn:matches ('hallo', '(ll)|(xx)')
ȱ XQUERY
fn:matches ('hallo', '(yy)|(xx)')
true false
ȱ ȱ XQUERY ȱ
let $Zk := 'hallo
Freunde' return fn:normalize-space ( $Zk )
hallo Freunde
ȱ ȱ XQUERY let $Zk := 'mn' let $Typ := 'NFC' ȱ return fn:normalize-unicode( $Zk, $Typ ȱ ) ȱ XQUERY let $Zk := 'daß' ȱ let $Muster := 'ß' let $Ersatz := 'ss' ȱ return fn:replace( $Zk, $Muster, $Ersatz ȱ )
ȱ
mn
dass
ȱ XQUERY ȱ ȱ ȱ
let $Ort := 'Hemsbach' let $Beginn := 'Hems' return fn:starts-with( $Ort, $Beginn )
ȱ XQUERY ȱ
ȱȱ ȱ ȱ ȱ ȱ
172ȱ
1
fn:string ( 1 )
XQUERY fn:concat( fn:string( fn:true() ), ȱ fn:string( 1 ) ) ȱ XQUERY ȱ let $Sequenz := ('a', 'b', 'a') let $Trennkette := ' ;' ȱ return fn:string-join( $Sequenz, $Trennkette ȱ )
ȱ
true
DieȱmächtigeȱFunktionȱmatches()ȱ prüft,ȱ obȱ inȱ einerȱ Zeichenketteȱ einȱ Musterȱ gefundenȱ wird.ȱ Dasȱ Musterȱwirdȱmitȱeinemȱregulärenȱ Ausdruckȱ beschrieben.ȱ Sieȱ gibtȱ einenȱWahrheitswertȱzurück.ȱ Dieȱ Funktionȱ normalizeȬspace()ȱ entferntȱ ausȱ einerȱ Zeichenketteȱ führendeȱ undȱ abschließendeȱ Leerzeichen.ȱ Ausȱ whiteȱ spacesȱ machtȱsieȱeinȱLeerzeichen.ȱ Dieȱ Funktionȱ normalizeȬunicode()ȱ normalisiertȱ eineȱ Zeichenketteȱ typgesteuertȱ nachȱ demȱ ZeichenȬ satzmodellȱ desȱ Worldȱ Wideȱ Webȱ 1.0ȱ Dieȱ mächtigeȱ Funktionȱ replace()ȱ ersetztȱ Zeichenȱ einerȱ ZeichenȬ ketteȱ mustergesteuertȱ durchȱ eineȱandereȱZeichenkette.ȱ
Dieȱ Funktionȱ startsȬwith()ȱ prüft,ȱ obȱ eineȱ Zeichenketteȱ mitȱ einerȱ anderenȱ Zeichenketteȱ beginnt.ȱ Sieȱ gibtȱ einenȱ Wahrheitswertȱ zurück.ȱ Dieȱ Funktionȱ string()ȱ gibtȱ eineȱ Zeichenketteȱ ausȱ einemȱ Wertȱ einesȱbeliebigenȱTypsȱzurück.ȱ
true1
a; b; a
Dieȱ Funktionȱ stringȬjoin()ȱ gibtȱ eineȱ Zeichenketteȱ ausȱ Wertenȱ einerȱSequenzȱzurückȱundȱtrenntȱ dieȱ Werteȱ inȱ derȱ Zeichenketteȱ durchȱeineȱTrennzeichenkette.ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ ȱ XQUERY ȱ
let $Zk := 'hallo' return fn:string-length( $Zk )
ȱ XQUERY ȱ ȱ ȱ
let $Zk := 'hallo' return fn:string-to-codepoints( $Zk )
5 104 97 108 108 111
ȱ XQUERY ȱ ȱ ȱ ȱ
let $Zk := 'hallo' let $Start := 3 let $Laenge := 2 return fn:substring( $Zk, $Start, $Laenge )
ll
ȱ ȱ XQUERY ȱ ȱ ȱ
let $Zk := 'hallöchen' let $Teilkette := 'll' return fn:substring-after( $Zk, $Teilkette )
öchen
ȱ XQUERY ȱ ȱ ȱ
let $Zk := 'hallöchen' let $Teilkette := 'll' return fn:substring-before( $Zk, $Teilkette )
XQUERY let $Zk := ('a; b; c') let $Muster := ';' ȱ return fn:tokenize( $Zk , $Muster ȱ )
ha
ȱ
a b c
ȱ
XQUERY let $Zk := 'hallo' let $VonZeichen := 'halo' ȱ let $NachZeichen := 'xyzu' ȱ return fn:translate( $Zk, $VonZeichen, ȱ $NachZeichen ȱ )
ȱ
xyzzu
Dieȱ Funktionȱ stringȬlength()ȱ gibtȱ dieȱ Längeȱ einerȱ ZeichenȬ ketteȱzurück.ȱ Dieȱ Funktionȱ stringȬtoȬcodeȬ points()ȱgibtȱdieȱNummerȱeinesȱ Zeichensȱ inȱ derȱ UnicodeȬ Tabelleȱ zurück.ȱ Sieȱ istȱ dieȱ Umkehrfunktionȱ vonȱ codepoints-to-string().ȱ Dieȱ Funktionȱ substring()ȱ gibtȱ ausȱ einerȱ Zeichenketteȱ eineȱ Teilzeichenketteȱ zurück.ȱ Dasȱ ersteȱ Argumentȱ istȱ dieȱ ZeiȬ chenkette,ȱdasȱzweiteȱdieȱStartȬ positionȱ undȱ dasȱ optionaleȱ dritteȱ Argumentȱ istȱ dieȱ Längeȱ derȱ zuȱ entnehmendenȱ TeilketȬ te.ȱ Dieȱ Funktionȱ substringȬafter()ȱ entnimmtȱ ausȱ einerȱ ZeichenȬ ketteȱ eineȱ Restketteȱ nachȱ einerȱ gefundenenȱTeilkette.ȱ Dieȱ Funktionȱ substringȬbefore()ȱ entnimmtȱ ausȱ einerȱ ZeichenȬ ketteȱ eineȱ Teilketteȱ vorȱ einerȱ gefundenenȱTeilketteȱ Dieȱ mächtigeȱ Funktionȱ tokeniȬ ze()ȱ zerlegtȱ eineȱ Zeichenketteȱ mustergesteuertȱ inȱ eineȱ SeȬ quenzȱ ausȱ Zeichenketten.ȱ Sieȱ istȱ dieȱ Umkehrfunktionȱ vonȱ stringȬjoin().ȱ Dieȱ Funktionȱ translate()ȱ überȬ setztȱ dieȱ Zeichenȱ einerȱ ZeiȬ chenketteȱ imȱ erstenȱ Argumentȱ nachȱ denȱ Vorgabenȱ einerȱ ÜȬ bersetzungsvorschriftȱimȱzweiȬ tenȱundȱdrittenȱArgument.ȱ
ȱ ȱ ȱ ȱ
173ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ ȱ
XQUERY let $Zk := 'hallo' return fn:upper-case($Zk)
HALLO
ȱ
Dieȱ Funktionȱ upperȬcase()ȱ transformiertȱdieȱZeichenȱeinerȱ Zeichenketteȱ inȱ GroßbuchstaȬ ben.ȱ
Tabelleȱ28:ȱEingebauteȱFunktionenȱzurȱUnterstützungȱderȱZeichenkettenverarbeitungȱ
DasȱKlassendiagrammȱinȱAbbildungȱ54ȱzeigtȱinȱeinerȱGesamtschauȱinȱderȱSpracheȱ UMLȱ dieȱNamenȱbzw.ȱSignaturhinweiseȱ derȱOperationenȱaufȱ Zeichenkettenȱundȱ zeichenkettenartigeȱ Sequenzenȱ inȱ Gestaltȱ derȱ inȱ XQueryȱ vonȱ DB2ȱ verfügbarenȱ eingebautenȱFunktionen.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Zeichenkette codepoints-to-string ( [in] Sequenz ) : xs:string compare ( [in] string_1 , [in] string_2 ) : xs:boolean concat ( [in] string_1 , [in] string_n ) : xs:string contains ( [in] string_1 , [in] string_2 ) : xs:boolean ends-with ( [in] string_1 , [in] string_2 ) : xs:boolean lower-case ( [in] string ) : xs:string matches ( [in] string_1 , [in] string_2 ) : xs:boolean normalize-space ( [in] string ) : xs:string normalize-unicode ( [in] string_1 , [in] string_2 ) : xs:string replace ( [in] string_1 , [in] string_2 , [in] string_3 ) : xs:string starts-with ( [in] string_1 , [in] string_2 ) : xs:string string ( [in] Wert ) : xs:string string-join ( [in] Sequenz , [in] string ) : xs:string string-length ( [in] string ) : xs:integer string-to-codepoints ( [in] string ) : Sequenz substring ( [in] string , [in] integer_1 , [in] integer_2 ) : xs:string substring-after ( [in] string_1 , [in] string_2 ) : xs:string substring-before ( [in] string_1 , [in] string_2 ) : xs:string tokenize ( [in] string_1 , [in] string_2 ) : Sequenz translate ( [in] string_1 , [in] string_2 , [in] string_3 ) : xs:string upper-case ( [in] string ) : xs:string
ȱ ȱ ȱ
Die Funktionen befinden sich im Namensraum fn
ȱ
Abbildungȱ54:ȱOperationenȱmitȱZeichenkettenȱinȱGestaltȱvonȱFunktionenȱ
174ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ
6.4.5 Vergleichsausdrücke InȱXQueryȱgibtȱesȱdreiȱgrundsätzlicheȱDatenarten:ȱ – DatenȱinȱGestaltȱvonȱatomarenȱWertenȱ – DatenȱinȱGestaltȱvonȱWertenȱinȱSequenzenȱundȱ – DatenȱinȱGestaltȱvonȱKnoten.ȱ FürȱjedeȱdieserȱdreiȱDatenartenȱgibtȱesȱinȱXQueryȱspezielleȱSchreibweisenȱderȱVerȬ gleichsoperatoren.ȱ
Wertevergleich InȱVergleichsausdrückenȱderȱArtȱWertevergleichȱwerdenȱatomareȱWerteȱmiteinanȬ derȱverglichen.ȱDasȱErgebnisȱistȱeinȱWahrheitswert.ȱVergleichsausdrückeȱfürȱWerȬ tevergleicheȱentsprechenȱ denȱgewohntenȱ Vergleichsausdrückenȱinȱ gängigenȱProȬ grammiersprachen.ȱDieȱVergleichsoperatorenȱlautenȱwieȱfolgt.ȱ – – – – – –
eqȱȱ neȱȱ ltȱȱ leȱȱ gtȱ geȱ
fürȱTestȱaufȱGleichheitȱ fürȱTestȱaufȱUngleichheitȱ fürȱTestȱaufȱkleinerȱalsȱ fürȱTestȱaufȱkleinerȱoderȱgleichȱ fürȱTestȱaufȱgrößerȱalsȱ fürȱTestȱaufȱgrößerȱoderȱgleichȱ
Dieȱ beidenȱ Operandenȱ desȱ dyadischenȱVergleichsoperatorsȱ (Relator)ȱ müssenȱ vonȱ kompatiblenȱ Datentypenȱ sein.ȱ Dieȱ folgendeȱ Tabelleȱ zeigtȱ einigeȱ grundlegendeȱ Beispiele.ȱ Vergleichsausdruckȱ Ergebnisȱ
Bemerkungȱ
XQUERY 1 eq 1 XQUERY 1 eq 2 XQUERY 'a' eq 'a' XQUERY 1 ne 2
Vergleichȱ aufȱGleichheitȱ mitȱ demȱ GleichheitsreȬ latorȱfürȱdenȱWertevergleich.
XQUERY 1 ne XQUERY 1 lt XQUERY 1 le XQUERY 1 gt XQUERY 1 ge
true false true true
1
false
2
true
2
true
2
false
2
false
VergleichȱaufȱUngleichheit.ȱ
Vergleichȱaufȱkleinerȱals.ȱ Vergleichȱaufȱkleinerȱoderȱgleich.ȱ Vergleichȱaufȱgrößerȱals.ȱ Vergleichȱaufȱgrößerȱoderȱgleich.ȱ
Tabelleȱ29:ȱVergleichsausdrückeȱfürȱWertevergleicheȱ
175ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ
Allgemeiner Vergleich InȱVergleichsausdrückenȱderȱArtȱallgemeinerȱVergleichȱwerdenȱdieȱWerteȱvonȱzweiȱ Sequenzenȱ miteinanderȱ verglichen.ȱDasȱErgebnisȱistȱeinȱWahrheitswert.ȱ EinȱVerȬ gleichsausdruckȱistȱdannȱwahr,ȱwennȱmindestensȱeinȱWertȱderȱeinenȱSequenzȱmitȱ einemȱ Wertȱ derȱ anderenȱ Sequenzȱ dieȱ Vergleichsbedingungȱ desȱ VergleichsoperaȬ torsȱerfüllt.ȱDieȱVergleichsoperatorenȱlautenȱwieȱfolgt.ȱ =ȱȱ !=ȱȱ =ȱ
fürȱTestȱaufȱGleichheitȱ fürȱTestȱaufȱUngleichheitȱ fürȱTestȱaufȱkleinerȱalsȱ fürȱTestȱaufȱkleinerȱoderȱgleichȱ fürȱTestȱaufȱgrößerȱalsȱ fürȱTestȱaufȱgrößerȱoderȱgleichȱ
DieȱbeidenȱOperandenȱdesȱdyadischenȱVergleichsoperatorsȱ(Relator)ȱmüssenȱvonȱ kompatiblenȱ Datentypenȱ sein.ȱ Dieȱ folgendeȱ Tabelleȱ zeigtȱ einigeȱ grundlegendeȱ Beispiele.ȱ Vergleichsausdruckȱ XQUERY (1, 2) = (2, 1) XQUERY (1, 2) = (3, 4) XQUERY ('a', 'b') = 'b' XQUERY (1, 2) != (3, 4) XQUERY ('a', 'b') != 'b' XQUERY (1, 2) < (2, 3) XQUERY (1, 2) (2, 3) XQUERY (1, –2) >= (2, 3)
Ergebnisȱ
Bemerkungȱ
true
Vergleichȱaufȱ Gleichheitȱmitȱdemȱ GleichheitsreȬ latorȱfürȱdenȱallgemeinenȱVergleich.
false true true
VergleichȱaufȱUngleichheit.ȱ
true true true false false
Vergleichȱaufȱkleinerȱals.ȱ Vergleichȱaufȱkleinerȱoderȱgleich.ȱ Vergleichȱaufȱgrößerȱals.ȱ Vergleichȱaufȱgrößerȱoderȱgleich.ȱ
Tabelleȱ30:ȱVergleichsausdrückeȱfürȱallgemeineȱVergleicheȱ
Knotenvergleich InȱVergleichsausdrückenȱderȱArtȱKnotenvergleichȱwerdenȱzweiȱKnotenȱmiteinanderȱ verglichen.ȱDasȱErgebnisȱistȱeinȱWahrheitswert.ȱ DieȱOperationenȱfürȱdenȱKnotenvergleichȱsindȱdurchȱdreiȱOperatorenȱinȱXQueryȱ implementiert.ȱ – ÜberprüfungȱderȱIdentitätȱmitȱdemȱOperatorȱisȱ
176ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ – ÜberprüfungȱderȱrelativenȱPositionȱeinesȱKnotensȱvorherȱoderȱnachherȱmitȱdenȱ beidenȱOperatorenȱ.ȱ ZumȱVergleichenȱderȱIdentitätȱvonȱKnotenȱdientȱderȱdyadischeȱOperatorȱis.ȱUnterȱ einemȱ dyadischenȱ Operatorȱ verstehtȱ manȱ inȱ derȱ Informatikȱ einenȱ Operatorȱ mitȱ zweiȱOperanden,ȱdieȱnormalerweiseȱvorȱundȱnachȱdemȱOperatorȱstehen.ȱȱ VomȱOperatorȱisȱwerdenȱnichtȱdieȱWerteȱderȱKnoten,ȱsondernȱderenȱReferenzwerȬ teȱ(Speicheradressen)ȱverglichen.ȱVerweisenȱdieȱbeidenȱOperandenȱaufȱdenselbenȱ Knoten,ȱ sindȱ somitȱ dieȱ Speicheradressenȱ identisch,ȱ soȱ istȱ dasȱ Ergebnisȱ desȱ VerȬ gleichsȱderȱWertȱtrue,ȱansonstenȱfalse.ȱ ImȱBeispielȱistȱdieȱIdentitätȱerfüllt,ȱdaȱbeideȱOperandenȱdenselbenȱKnotenȱadresȬ sieren.ȱ XQUERY let $Knoten_1 := Frau let $Knoten_2 := Frau return $Knoten_1 is $Knoten_1
(1) (2) (3) (4)
Programmȱ69:ȱIdentitätȱistȱgegeben Ergebnis true
ImȱfolgendenȱBeispielȱistȱdieȱIdentitätȱnichtȱerfüllt,ȱdaȱdieȱbeidenȱOperandenȱunȬ terschiedlicheȱKnotenȱadressieren.ȱDieȱWerteȱderȱKnotenȱspielenȱbeiȱderȱUntersuȬ chungȱaufȱIdentitätȱkeineȱRolle.ȱ XQUERY let $Knoten_1 := Frau let $Knoten_2 := Frau return $Knoten_1 is $Knoten_2
(1) (2) (3) (4)
Programmȱ70:ȱIdentitätȱistȱnichtȱgegeben Ergebnis false
Dieȱ Überprüfungȱ derȱ relativenȱ Positionȱ einesȱKnotensȱinȱ derȱ Dokumentordnungȱ derȱ eingefügtenȱ Knotenȱ inȱ einerȱ Sequenzȱ erfolgtȱ mitȱ denȱ beidenȱ Operatorenȱ .ȱDerȱOperatorȱȱimplementiertȱ dieȱOperationȱnachherȱinȱXQuery.ȱVergleichsausdrückeȱmitȱdenȱbeidenȱOperatorenȱ liefernȱdieȱWahrheitswerteȱtrueȱoderȱfalse.ȱ Zurȱ Darstellungȱ derȱ Wirkungsweiseȱ derȱ beidenȱ Operatorenȱ werdenȱ inȱ eineȱ SeȬ quenzȱ zweiȱ Elementknotenȱ mitȱ derȱ einfachenȱ Technikȱ derȱ direktenȱ Konstruktorenȱ eingefügt.ȱ Mitȱ zweiȱ Pfadausdrückenȱ werdenȱ sodannȱ dieȱ Speicheradressenȱ derȱ beidenȱ Knotenȱ inȱ jeȱ einerȱ Referenzvariablenȱ gespeichert.ȱ Aufȱ Pfadausdrückeȱ geȬ henȱ wirȱ inȱ denȱ folgendenȱ Kapitelnȱ detailliertȱ ein.ȱ Dieȱ beidenȱ Referenzvariablenȱ werdenȱsodannȱalsȱOperandenȱinȱdenȱPositionierungsausdrückenȱverwendet.ȱ
177ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ DasȱfolgendeȱProgrammȱ71ȱzeigtȱdenȱEinsatzȱdesȱOperatorsȱzumȱKnotenvergleichȱ vorherȱ 'b' and 1 = 1 XQUERY fn:not( fn:false() ) XQUERY fn:not( 2 < 1 or 'a' > 'b' and 1 = 1 )
Bemerkungȱ LogischerȱOperatorȱand.
true true
LogischerȱOperatorȱor.ȱ
true false false
true
LogischeȱOperatorenȱandȱundȱor.ȱ
LogischeȱFunktionȱnot().ȱ
true
Tabelleȱ31:ȱLogischeȱAusdrückeȱinȱXQueryȱ
6.4.7 Alternativausdrücke Inȱ XQueryȱ gibtȱ esȱ auchȱ dieȱ einfacheȱAlternativeȱ [DIN66262].ȱ Sieȱ beginntȱ mitȱ demȱ Schlüsselwortȱ if,ȱ demȱeinȱinȱrundenȱKlammernȱeingeschlossenerȱBedingungsausȬ druckȱfolgt.ȱAufȱdieȱKlammernȱfolgtȱdasȱSchlüsselwortȱthenȱmitȱeinemȱAusdruckȱ undȱdannȱelseȱmitȱebenfallsȱeinemȱAusdruck.ȱJederȱderȱbeidenȱAusdrückeȱkannȱeinȱ beliebigerȱXQueryȬAusdruckȱsein.ȱ
179ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ
if( Bedingungsausdruck ) then Ausdruck else Ausdruck
ȱ Syntaxȱ26:ȱAlternativausdruckȱifȬthenȬelseȱ
DaȱjederȱAusdruckȱselbstȱwiederȱeinȱAlternativausdruckȱseinȱkann,ȱkönnenȱauchȱ Alternativausdrückeȱineinanderȱ geschachteltȱwerden.ȱ Hierdurchȱentstehenȱ MehrȬ fachalternativenȱinȱGestaltȱvonȱifȬthenȬelseȬifȬKonstrukten.ȱ InȱdenȱfolgendenȱBeispielenȱwerdenȱdieȱdreiȱSpielartenȱderȱAlternativeȱnachȱDINȱ 66262ȱdargestellt,ȱdieȱ – bedingteȱVerarbeitungȱ – einfacheȱAlternativeȱ – Mehrfachalternativeȱ
Bedingte Verarbeitung BeiȱderȱbedingtenȱVerarbeitungȱerzeugtȱnurȱeinȱZweigȱderȱAlternativeȱNutzdaten.ȱ Derȱ andereȱ Zweigȱ erzeugtȱ eineȱ leereȱ Sequenz.ȱ Imȱ folgendenȱ Programmȱ 73ȱ wirdȱ untersucht,ȱ obȱ eineȱ Satzartȱ gleichȱ demȱ Wertȱ 1ȱ ist.ȱ Inȱ gegebenemȱ Falleȱ wirdȱ eineȱ SequenzȱmitȱeinerȱNachrichtȱerzeugt.ȱAnsonstenȱwirdȱeineȱleereȱSequenzȱgeneriert.ȱ XQUERY let $Satzart := 1 let $Ergebnis := if ( $Satzart = 1 ) then 'Die Satzart ist 1' else () return $Ergebnis
(1) (2) (3) (4) (5) (6) (7)
Programmȱ73:ȱBedingteȱVerarbeitung Ergebnis Die Satzart ist 1
Einfache Alternative BeiȱderȱeinfachenȱAlternativeȱenthältȱsowohlȱderȱthenȬȱalsȱauchȱderȱelseȬZweigȱderȱ AlternativeȱeineȱSequenzȱmitȱNutzdaten.ȱImȱfolgendenȱProgrammȱ74ȱsollȱdeshalbȱ dieȱ Sequenzȱ imȱ elseȬZweigȱ nichtȱ leerȱ sein,ȱ sondernȱ ebenfallsȱ eineȱ Nachrichtȱ entȬ halten.ȱ
180ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ ȱ
XQUERY let $Satzart := 2 let $Ergebnis := if ( $Satzart = 1 ) then ('Die Satzart ist 1') else ('Die Satzart ist nicht 1') return $Ergebnis
(1) (2) (3) (4) (5) (6) (7)
Programmȱ74:ȱEinfachalternativeȱmitȱzweiȱNutzdatenzweigen Ergebnis Die Satzart ist nicht 1
Mehrfachalternative BeiȱderȱMehrfachalternativeȱgibtȱesȱmehrȱalsȱzweiȱZweige,ȱinȱdenenȱNutzdatenȱinȱ jeȱ einerȱ Sequenzȱ erzeugtȱ werden.ȱ Imȱ folgendenȱ Beispielȱ sollenȱ dreiȱ Satzartenȱ erȬ laubtȱsein.ȱBeiȱjederȱsollȱderȱAlternativausdruckȱeineȱentsprechendeȱMeldungȱausȬ geben.ȱAnsonstenȱsollȱderȱAlternativausdruckȱeinenȱFehlertextȱerzeugen.ȱ XQUERY let $Satzart := 4 let $Ergebnis := if ( $Satzart = 1 ) then ('Die Satzart ist 1') else if ( $Satzart = 2 ) then ('Die Satzart ist 2') else if ( $Satzart = 3 ) then ('Die Satzart ist 3') else ('Die Satzart ist unzulässig') return $Ergebnis
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
Programmȱ75:ȱMehrfachalternativeȱmitȱdreiȱZweigenȱfürȱNutzdatenȱundȱeinemȱZweigȱ fürȱFehlerdaten Ergebnis Die Satzart ist unzulässig
6.4.8 Quantifizierende Ausdrücke QuantifizierendeȱAusdrückeȱgestattenȱeineȱübersichtlicheȱundȱsprechendeȱFormuȬ lierungȱbeliebigȱundȱdynamischȱvielerȱGleichheitsvergleiche,ȱderenȱWahrheitswerȬ teȱentwederȱmitȱdemȱbooleschenȱUndȬȱbzw.ȱOderȬOperatorȱverknüpftȱwerden.ȱDieȱ dynamischeȱ OderȬVerknüpfungȱ derȱ Wahrheitswerteȱ wirdȱ auchȱ alsȱ existenzielleȱ Quantifizierungȱ undȱ dieȱ dynamischeȱ UndȬVerknüpfungȱ alsȱ universelleȱQuantifizieȬ rungȱbezeichnet.ȱQuantifizierendeȱAusdrückeȱzählenȱinȱderȱInformatikȱundȱLogikȱ zuȱdenȱPrädikaten.ȱ EinȱquantifizierenderȱAusdruckȱbestehtȱausȱmehrerenȱTeilenȱundȱzwarȱ – demȱQuantifiziererȱ(entwederȱsomeȱoderȱevery)ȱ – mindestensȱeinerȱKlauselȱin,ȱdieȱeineȱSequenzȱanȱeineȱReferenzvariableȱbinȬ det,ȱundȱ
181ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ – einerȱKlauselȱsatisfies,ȱdieȱeinenȱTestausdruckȱenthält.ȱ MitȱdemȱQuantifiziererȱsomeȱwirdȱdieȱdynamischeȱUndierungȱundȱmitȱdemȱQuanȬ tifiziererȱeveryȱdieȱdynamischeȱOderierungȱderȱWahrheitswerteȱeingeleitet.ȱ DieȱSyntaxȱsiehtȱfolgendermaßenȱaus.ȱ ȱ
some | every
ȱ
Variable in Ausdruck [, Variable in Ausdruck] ...
ȱ
satisfies Ausdruck
Syntaxȱ27:ȱQuantifizierenderȱAusdruckȱ
Dynamisches Oder Imȱ Programmȱ 76ȱ wirdȱ gezeigt,ȱ wieȱ derȱ Quantifiziererȱ someȱ zurȱ Verwirklichungȱ einerȱ dynamischenȱ OderȬVerknüpfungȱ vonȱ beliebigȱ vielenȱ Wahrheitswertenȱ einȬ gesetztȱwird.ȱȱ Beispielȱ Inȱ einerȱ Sequenzȱ sindȱ dieȱ dreiȱ Ortsnamenȱ Heidelberg,ȱ Hemsbachȱ undȱ Mannheimȱ enthalten.ȱDieseȱWerteȱkönntenȱauchȱausȱderȱDatenbankȱinȱdieȱSequenzȱeingetraȬ genȱwordenȱsein.ȱDieȱSequenzȱwirdȱdurchȱdieȱVariableȱ$Orteȱreferenziert.ȱInȱderȱ KlauselȱreturnȱwirdȱderȱQuantifiziererȱsomeȱeingesetzt,ȱumȱzuȱprüfen,ȱobȱmindesȬ tensȱeinerȱderȱOrtsnamenȱinȱderȱSequenzȱderȱWertȱHemsbachȱist.ȱBeiȱderȱAbarbeiȬ tungȱdesȱAusdrucksȱwerdenȱdieȱEinträgeȱnacheinanderȱausȱderȱSequenzȱ$Orteȱinȱ dieȱ Variableȱ $Ortȱ übertragen.ȱ Nachȱ jederȱ Übertragungȱ wirdȱ dasȱ Prädikatȱ nachȱ satisfiesȱ getestetȱ undȱ seinȱ Wahrheitswertȱ fürȱ denȱ jeweiligenȱ Testȱ festgestellt.ȱ Alleȱ WahrheitswerteȱwerdenȱzumȱSchlussȱmitȱdemȱ booleschenȱ OderȱmiteinanderȱverȬ knüpf.ȱ Dasȱ Verknüpfungsergebnisȱ istȱ dasȱ Endergebnisȱ desȱ quantifizierendenȱ Ausdrucks.ȱ XQUERY let $Orte = ('Heidelberg', 'Hemsbach', 'Mannheim') return some $Ort in $Orte satisfies $Ort = 'Hemsbach'
(1) (2) (3) (4) (5)
Programmȱ76:ȱQuantifizierenderȱAusdruckȱsomeȱ–ȱdynamischesȱOder Ergebnis true
Dynamisches Und EinȱeinfachesȱBeispielȱinȱProgrammȱ77ȱsollȱdieȱWirkungsweiseȱdesȱQuantifizierersȱ everyȱundȱdieȱmitȱihmȱverbundeneȱLogikȱdemonstrieren.ȱWieȱschonȱerwähnt,ȱverȬ knüpftȱderȱQuantifiziererȱeveryȱdieȱeinzelnenȱWahrheitswerteȱderȱKlauselȱsatisfiesȱ
182ȱ
6.4ȱȱAusdrückeȱinȱXQueryȱ mitȱdemȱbooleschenȱUnd.ȱDieȱAnzahlȱderȱWahrheitswerteȱergibtȱsichȱausȱderȱAnȬ zahlȱderȱzuȱtestendenȱEinträgeȱinȱderȱAusgangssequenz.ȱ Beispielȱ Inȱ einerȱ Ausgangssequenzȱ sindȱ dieȱ dreiȱ Zahlenȱ 5,ȱ 7,ȱ 9ȱ enthalten.ȱ Dieseȱ Sequenzȱ wirdȱmitȱderȱVariablenȱ$Zahlenȱreferenziert.ȱInȱderȱKlauselȱsatisfiesȱwirdȱgetestet,ȱ obȱderȱaktuellȱzuȱtestendeȱEintragȱzwischenȱ3ȱundȱ10ȱliegt.ȱWeilȱdieȱzuȱtestendenȱ EinträgeȱinȱderȱSequenzȱdreiȱZahlenȱsind,ȱwerdenȱdurchȱdieȱKlauselȱsatisfiesȱauchȱ dreiȱ Wahrheitswerteȱ generiert.ȱ Dieseȱ werdenȱ aufgrundȱ desȱ Quantifizierersȱ everyȱ mitȱdemȱbooleschenȱUndȱmiteinanderȱverknüpft.ȱDerȱErgebniswertȱwirdȱvonȱderȱ Klauselȱreturnȱausgegeben.ȱ ȱ XQUERY let $Zahlen := (5, 7, 9) return every $Zahl in $Zahlen satisfies $Zahl >= 3 and $Zahl ȱK2ȱ–>ȱK4–>ȱK5ȱ–>ȱK3ȱ–>ȱK6ȱ–>ȱK7ȱ ȱ – LevelorderȬAusgabeȱ–ȱEbeneȱfürȱEbeneȱ Beispiel:ȱK1ȱ–>ȱK2ȱ–>ȱK3–>ȱK4ȱ–>ȱK5ȱ–>ȱK6ȱ–>ȱK7ȱ ȱ – InorderȬAusgabeȱ–ȱLinksȬWurzelȬRechtsȱ Beispiel:ȱK4ȱ–>ȱK2ȱ–>ȱK5ȱ–>ȱK1ȱ–>ȱK6ȱ–>ȱK3ȱ–>ȱK7ȱ ȱ – PostorderȬAusgabeȱ Beispiel:ȱK4ȱ–>ȱK5ȱ–>ȱK2–>ȱK6ȱ–>ȱK7ȱ–>ȱK3ȱ–>ȱK1ȱ DieȱinȱDB2ȬXQueryȱverwendeteȱTerminologieȱDokumentordnung,ȱmitȱderȱdieȱReiȬ henfolgeȱ derȱ Ausgabeȱ vonȱ Knotenȱ ausȱ einemȱ XDMȬBaumȱ bezeichnetȱ wird,ȱ istȱ gleichbedeutendȱ mitȱ derȱ inȱ derȱ Informatikȱ üblicherweiseȱ gebrauchtenȱ BezeichȬ nungȱ Preorderȱ (Präordnungȱ [NB04],ȱ hierarchischeȱ Ordnung).ȱ Auchȱ dieȱ AbarbeiȬ tungsstrategieȱ vonȱ Bäumenȱ mitȱ derȱ Bezeichnungȱ Levelorderȱ [SS06]ȱ (EbenenordȬ nung)ȱwirdȱinȱXQueryȱangewendet,ȱumȱdieȱAbarbeitungȱvonȱZugriffspfadenȱpaȬ rallelerȱBaumstrukturenȱzuȱbenennen.ȱ InȱderȱfolgendenȱAbbildungȱ57ȱistȱeinȱXDMȬBaumȱdargestellt.ȱDieȱNamenȱseinerȱ Knotenȱ enthaltenȱdenȱ Hinweisȱaufȱ ihreȱ hierarchischeȱ StellungȱimȱBaum.ȱHierausȱ istȱdirektȱdieȱhierarchischeȱOrdnung,ȱd.ȱh.ȱdieȱDokumentordnung,ȱzuȱersehen.ȱMitȱ denȱNamenȱvonȱStereotypenȱwirdȱnochȱangegeben,ȱvonȱwelcherȱArtȱderȱjeweiligeȱ Knotenȱgrundsätzlichȱist.ȱ
190ȱ
6.5ȱȱPfadȬAusdrückeȱ MitȱdemȱfolgendenȱProgrammȱ83ȱwirdȱderȱXDMȬBaumȱinȱAbbildungȱ57ȱmitȱseiȬ nenȱsprechendȱbenanntenȱKnotenȱinȱdieȱSpalteȱDokumentȱderȱTabelleȱKunde_XMLȱ geladen.ȱ INSERT INTO Kunde_XML (Kunde_XML_Nr, Dokument) VALUES ('D002', ' Knoten_6 Knoten_8 Knoten_10 Knoten_12 Knoten_17 Knoten_19 Knoten_21 Knoten_23 ' ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25)
Programmȱ83:ȱDokumentȱmitȱsprechendȱbenanntenȱKnotenȱinȱDokumentordnungȱ
191ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ
Abbildungȱ57:ȱXDMȬBaumȱmitȱKnotenȱinȱhierarchischerȱDokumentordnungȱ
InȱderȱDokumentordnung,ȱdieȱdurchȱdasȱLadenȱzustandeȱgekommenȱist,ȱwirdȱdasȱ Dokumentȱ mitȱ SQLȬSprachmittelnȱ undȱ impliziterȱ Serialisierungȱ inȱ Programmȱ 84ȱ auchȱwiederȱausgegeben.ȱ ȱ
192ȱ
6.5ȱȱPfadȬAusdrückeȱ SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = 'D002' ;
(1) (2) (3) (4)
Programmȱ84:ȱDokumentȱinȱDokumentordnungȱlesenȱ Ergebnis Knoten_6 Knoten_8 Knoten_10 Knoten_12 Knoten_17 Knoten_19 Knoten_21 Knoten_23
6.5.2 Eingebaute Funktionen zum Lesen von XML-Dokumenten Inȱ XQueryȱ gibtȱ esȱ zweiȱ eingebauteȱ Funktionenȱ zumȱ Lesenȱ vonȱ XMLȬDaten,ȱ dieȱ sichȱinȱeinerȱSQLȬSpalteȱvomȱTypȱXMLȱbefinden.ȱSieȱheißenȱ – db2Ȭfn:xmlcolumn()ȱundȱ – db2Ȭfn:sqlquery()ȱ BeideȱFunktionenȱsindȱimȱNamensraumȱdb2Ȭfnȱenthalten.ȱ Dieȱ Funktionȱ db2Ȭfn:xmlcolumn()ȱ gibtȱ eineȱ Sequenzȱ zurück.ȱ Jederȱ Eintragȱ derȱ SeȬ quenzȱbestehtȱausȱeinemȱXDMȬBaum.ȱEinȱsolcherȱEintragȱistȱeinȱXDMȬWert,ȱderȱinȱ derȱangegebenenȱXMLȬSpalteȱeinerȱTabelleȱgespeichertȱist.ȱ DieȱSyntaxȱderȱXQueryȬFunktionȱdb2Ȭfn:xmlcolumn()ȱlautet.ȱ ȱ
db2-fn:xmlcolumn(Zeichenkettenliteral)
Syntaxȱ28:ȱDieȱFunktionȱdb2Ȭfn:xmlcolumn()ȱ
Dasȱ Zeichenkettenliteralȱ bestehtȱ ausȱ demȱ qualifiziertenȱ Namenȱ derȱ Tabelleȱ undȱ ihrerȱ XMLȬSpalteȱ inȱ derȱ Syntaxȱ vonȱ SQL.ȱ Deshalbȱ istȱ derȱ Qualifikationsoperatorȱ hierȱderȱPunktȱundȱnichtȱderȱDoppelpunktȱwieȱinȱXQuery.ȱBeideȱNamenȱmüssenȱ
193ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ inȱ Großbuchstabenȱ geschriebenȱ werden,ȱ weilȱ sieȱ inȱ dieserȱ Schreibweiseȱ auchȱ imȱ KatalogȱvonȱDB2ȱvermerktȱsind.ȱ Dasȱ mitȱ Programmȱ 83ȱ geladeneȱ XMLȬDokumentȱ wirdȱ somitȱ durchȱ dieȱ AnwenȬ dungȱderȱeingebautenȱFunktionȱxmlcolumn()ȱvonȱXQueryȱgelesenȱundȱalsȱEintragȱ inȱ einerȱSequenzȱgespeichert.ȱ Dieseȱwirdȱ mitȱderȱReferenzvariablenȱ$Sequenzȱ adȬ ressiert,ȱsieheȱZeileȱ(2)ȱdesȱfolgendenȱProgramms.ȱ XQUERY let $Sequenz := db2-fn:xmlcolumn('KUNDE_XML.DOKUMENT') return $Sequenz
(1) (2) (3)
Programmȱ85:ȱLesenȱderȱXMLȬDokumenteȱinȱderȱSpalteȱDokumentȱderȱTabelleȱKunȬ de_XMLȱ
Dieȱ Klauselȱ returnȱ$Sequenzȱ gibtȱ sodannȱ dasȱ geleseneȱ XMLȬDokumentȱ inȱ serialiȬ sierterȱFormȱaus.ȱImȱErgebnisȱistȱdieȱDokumentordnungȱwiederȱeinfachȱzuȱerkenȬ nen.ȱ Ergebnis Knoten_6 Knoten_8 Knoten_10 Knoten_12 Knoten_17 Knoten_19 Knoten_21 Knoten_23
ȱ
Ergebnisȱ1:ȱLinksȱimȱXMLȬFormatȱundȱrechtsȱinȱgrafischerȱDarstellungȱmitȱdemȱWerkȬ zeugȱDB2ȬBefehlseditorȱ
194ȱ
6.5ȱȱPfadȬAusdrückeȱ Dieȱ Funktionȱdb2Ȭfn:sqlquery()ȱgibtȱebenfallsȱ eineȱSequenzȱzurück,ȱderenȱEinträgeȱ ausȱXDMȬBäumenȱbestehen.ȱDieseȱsindȱinȱeinerȱanzugebendenȱXMLȬSpalteȱeinerȱ Tabelleȱgespeichert.ȱ DieȱSyntaxȱderȱXQueryȬFunktionȱdb2Ȭfn:sqlquery()ȱlautet.ȱ ȱ
db2-fn:sqlquery(Zeichenkettenliteral)
Syntaxȱ29:ȱDieȱFunktionȱdb2Ȭfn:sqlquery()ȱ ImȱGegensatzȱzurȱFunktionȱdb2Ȭfn:xmlcolumn()ȱbestehtȱdasȱZeichenkettenliteralȱimȱ ArgumentȱderȱFunktionȱdb2Ȭfn:sqlquery()ȱausȱeinemȱvollȱausgebautenȱSQLȬBefehl.ȱ ErȱmussȱebenfallsȱWerteȱeinerȱXMLȬSpalteȱzurückgeben.ȱDasȱZeichenkettenliteralȱ mussȱjedochȱnichtȱinȱGroßbuchstabenȱgeschriebenȱwerden.ȱ XQUERY let $Sequenz := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D002'' ' ) return $Sequenz
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ86:ȱLesenȱdesȱXMLȬDokumentsȱinȱderȱSpalteȱDokumentȱundȱderȱZeileȱmitȱ demȱSchlüsselȱD002
DasȱErgebnisȱistȱidentischȱmitȱdemȱvonȱProgrammȱ85.ȱȱ Inȱ derȱ Programmzeileȱ (6)ȱ desȱ obigenȱ Programmsȱ mussȱ derȱ Primärschlüsselwertȱ D001ȱinȱzweiȱHochkommasȱeingefasstȱwerden.ȱDiesȱistȱerforderlich,ȱweilȱdasȱArȬ gumentȱ derȱFunktionȱdb2Ȭfn:sqlquery()ȱeinȱZeichenkettenliteralȱist,ȱ fürȱdessenȱAbȬ grenzungȱbereitsȱHochkommasȱ eingesetztȱ sind.ȱEinȱHochkommaȱ innerhalbȱ einesȱ Zeichenkettenliteralsȱmuss,ȱwieȱinȱdenȱmeistenȱProgrammiersprachenȱüblich,ȱauchȱ inȱXQueryȱdoppeltȱgeschriebenȱwerden.ȱ Nachdemȱ dieȱ allgemeineȱ Knotenstrukturȱ einesȱ XDMȬBaumesȱ inȱ Abbildungȱ 57ȱ architektonischȱ entwickeltȱ undȱ anschließendȱ alsȱ XDMȬWertȱ inȱ dieȱ Tabelleȱ KunȬ de_XMLȱ eingefügtȱ undȱ wiederȱ gelesenȱwurde,ȱ wirdȱGleichesȱ nunȱ mitȱ denȱ Datenȱ einesȱanwendungsspezifischenȱXDMȬBaumesȱbewerkstelligt.ȱ DerȱneueȱXDMȬBaumȱsollȱanschließendȱdazuȱverwendetȱwerden,ȱdieȱPfadspracheȱ vonȱ XQueryȱ anȱ einemȱ einleuchtendenȱ undȱ praxisangelehntenȱ Beispielȱ zuȱ deȬ monstrieren.ȱDasȱneueȱDokumentȱenthältȱeinigeȱDatenȱderȱbeidenȱKundenentitäȬ tenȱ HugoȱMüllerȱmitȱ derȱKundennummerȱK001ȱundȱEvaȱSchulzeȱmitȱderȱKundenȬ nummerȱ K003.ȱ Dasȱ Dokumentȱ inȱ derȱ Spracheȱ UMLȱ inȱ seinenȱ unterschiedlichenȱ KnotenartenȱdargestelltȱzeigtȱdieȱfolgendeȱAbbildungȱ58.ȱ ȱ
195ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ 1
ȱ
«Element» Kunde
ȱ ȱ ȱ ȱ
«Attribut» Kunde_Nr
«Element» Alle_Kunden
1 1
1
1
«Wert» K001 «Element» Anrede «Element» Name
ȱ ȱ
1 1
«Wert» Herr «Wert» Mueller, Hugo
1
«Element» Vorname
1
«Element» Zuname
«Wert» Hugo
1 1
«Wert» Mueller
ȱ ȱ 1
ȱ ȱ
1
«Attribut» Kunde_Nr
«Element» Kunde
1
«Wert» K003
1
«Element» Anrede
1
«Element» Name
ȱ ȱ ȱ ȱ ȱ
1 1
«Wert» Frau «Wert» Schulze, Eva
1
«Element» Vorname
1
«Element» Zuname
1
1
«Wert» Eva «Wert» Schulze
ȱ Abbildungȱ58:ȱBauplanȱdesȱDokumentsȱinȱUMLȱ
DasȱLadeprogramm,ȱwelchesȱdasȱbauplankonformeȱXMLȬDokumentȱinȱdieȱSpalteȱ Dokumentȱ derȱ Tabelleȱ Kunde_XMLȱ lädt,ȱ siehtȱ folgendermaßenȱ aus.ȱ Derȱ PrimärȬ schlüsselwertȱdesȱDokumentsȱlautetȱD001.ȱ INSERT INTO Kunde_XML (Kunde_XML_Nr, Dokument) VALUES ('D001', ' Herr Mueller, Hugo Hugo Mueller Frau Schulze, Eva Eva
196ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17)
ȱ
6.5ȱȱPfadȬAusdrückeȱ
' ;
Schulze
)
(18) (19) (20) (21) (22) (23) (24)
Programmȱ87:ȱLadeprogrammȱdesȱDokumentsȱ
Mitȱ demȱ folgendenȱ XQueryȬProgrammȱ Programmȱ 88,ȱ dasȱ dieȱ Funktionȱ db2Ȭ fn:sqlquery()ȱeinsetzt,ȱwirdȱdasȱDokumentȱwiederȱinȱseinerȱexternenȱTextformȱseriȬ alisiertȱausgegeben.ȱ XQUERY let $Sequenz := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' ) return $Sequenz
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ88:ȱXQueryȬProgrammȱzumȱLesenȱdesȱDokumentsȱ
DasselbeȱkannȱmitȱeinemȱeinfachenȱSQLȬProgrammȱerreichtȱwerden.ȱDasȱfolgendeȱ Programmȱ89ȱgibtȱdenȱXDMȬWertȱaus,ȱderȱsichȱinȱderȱSpalteȱDokumentȱderȱTabelleȱ Kunde_XMLȱbefindet.ȱDieȱZeileȱwirdȱdurchȱdenȱPrimärschlüsselwertȱD001ȱidentiȬ fiziert.ȱDerȱXDMȬWertȱwirdȱhierbeiȱimplizitȱserialisiert.ȱ SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = 'D001' ;
(1) (2) (3) (4)
Programmȱ89:ȱSQLȬProgrammȱzumȱLesenȱdesȱDokumentsȱ
DieȱAusgabenȱbeiderȱProgrammeȱsindȱimȱErgebnisȱ2ȱdargestellt.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
197ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Herr Mueller, Hugo Hugo Mueller Frau Schulze, Eva Eva Schulze
ȱ
Ergebnisȱ2:ȱDasȱXMLȬDokumentȱlinksȱwurdeȱvonȱXQueryȱundȱdieȱrechtsȱstehendeȱAusȬ gabeȱvonȱSQLȱimȱWerkzeugȱDB2ȬEditorȱerstelltȱ
6.5.3 Pfadausdruck Dieȱ Konzeptionȱ desȱ XQueryȱ Pfadausdrucksȱ stammtȱ ursprünglichȱ vonȱ XPathȱ 2.0.ȱ Einȱ Pfadausdruckȱ beschreibt,ȱ wieȱ XQueryȱ durchȱ einenȱ XDMȬBaumȱ einesȱ XMLȬ Dokumentesȱ hindurchnavigierenȱ soll,ȱ umȱ Datenȱ zuȱ finden.ȱ Einȱ Pfadausdruckȱ bestehtȱ ausȱ Lokalisierungsschrittenȱ (step),ȱ dieȱ durchȱ Schrägstricheȱ voneinanderȱ getrenntȱwerden.ȱ PfadausdrückeȱsindȱausȱderȱBetriebssystemtechnikȱwohlȱbekannt.ȱBeiȱderȱNavigaȬ tionȱmittelsȱBetriebssystemȬPfadausdrückenȱwirdȱinȱderȱWindowsȬWeltȱderȱRückȬ schrägerȱ Ȉ\Ȉȱ zurȱ Trennungȱ derȱ einzelnenȱ Lokalisierungsschritteȱ inȱ einemȱ PfadȬ ausdruckȱverwendet.ȱZ.ȱB.:ȱC:\Programme\IBM\SQLLIB\BINȱ Inȱ derȱ UnixȬWeltȱ istȱ esȱ derȱ Schrägstich,ȱ derȱ dieȱ Angabeȱ derȱ Navigationsschritteȱ voneinanderȱtrennt.ȱZ.ȱB.:ȱC:/Programme/IBM/SQLLIB/BINȱ InȱPfadausdrückenȱvonȱXQueryȱwirdȱebenfallsȱderȱSchrägstrichȱȈ/ȈȱdazuȱverwenȬ det,ȱdieȱeinzelnenȱNavigationsschritteȱvoneinanderȱzuȱtrennen.ȱ
198ȱ
6.5ȱȱPfadȬAusdrückeȱ Pfadausdrückeȱwerdenȱunterschiedenȱinȱ – absoluteȱPfadausdrückeȱundȱ – relativeȱPfadausdrücke.ȱ
Absoluter Pfadausdruck EinȱabsoluterȱPfadausdruckȱbeginntȱbeiȱeinerȱSequenz,ȱderenȱEinträgeȱaufȱdieȱ DokumentknotenȱderȱXDMȬBäumeȱverweisen.ȱErȱwirdȱmitȱeinemȱSchrägstrichȱ(ȱ/ȱ)ȱ eingeleitet.ȱ Beispielȱ $Sequenz/Alle_Kunden/Kunde/Name/Vorname Derȱ Pfadausdruckȱ beschreibtȱ denȱ Zugriffspfadȱ aufȱ dieȱ Artȱ desȱ Zielknotens,ȱ hierȱ Vorname,ȱabȱdemȱexternenȱWurzelknotenȱeinesȱXMLȬBaumes.ȱDerȱexternȱsichtbareȱ Wurzelknotenȱ istȱ vomȱ Typȱ XMLȬElement.ȱ Derȱ interneȱ Wurzelknoten,ȱ derȱ jedochȱ externȱnichtȱinȱErscheinungȱtritt,ȱistȱseinȱDokumentknoten.ȱDerȱDokumentknotenȱ hatȱ keinenȱ Namen.ȱ Dieȱ Zielknotenȱ derȱ spezifiziertenȱ Artȱ sindȱ dasȱ Ergebnisȱ derȱ AuswertungȱdesȱPfadausdrucksȱundȱwerdenȱsodannȱinȱeinerȱErgebnissequenzȱzurȱ Verfügungȱgestellt.ȱ Imȱ Beispielȱ heißtȱ dieȱ Zielknotenartȱ Vornameȱ undȱ dieȱ Elementknotenartȱ unmittelȬ barȱ unterhalbȱ desȱ Dokumentknotensȱ heißtȱ Alle_Kunden.ȱ Zwischenȱ beidenȱ befinȬ denȱsichȱdieȱZwischenknotenartenȱKundeȱundȱName.ȱBeideȱKnotenartenȱsindȱXMLȬ Elementknoten.ȱ EinȱPfadausdruckȱwirdȱvonȱXQueryȱvonȱlinksȱnachȱrechtsȱSchrittȱfürȱSchrittȱausȬ gewertet.ȱ Beiȱ jedemȱ Auswertungsschrittȱ wirdȱ eineȱ jeweiligeȱ internȱ verwendeteȱ Sequenzȱerstellt.ȱIhreȱEinträgeȱsindȱdieȱKnotenȱderȱKnotenart,ȱderenȱArtnameȱimȱ PfadausdruckȱfürȱdiesenȱjeweiligenȱAuswertungsschrittȱangegebenȱist.ȱ Diesesȱ Sammelnȱ derȱ Knotenȱ derȱ jeweiligenȱ Knotenartȱ jeȱ Arbeitsschrittȱ inȱ jeweilsȱ einerȱ eigenenȱ internenȱSequenzȱ wirdȱsoȱ langeȱfortgesetzt,ȱ bisȱdieȱKnotenȱderȱ amȱ weitestenȱ rechtsȱ imȱ Pfadausdruckȱ stehendenȱ Knotenartȱ inȱ derȱ letztendlichenȱ ErȬ gebnissequenzȱgesammeltȱsind.ȱImȱBeispielȱsindȱdiesȱdieȱKnotenȱderȱArtȱVorname.ȱ DieȱKnotenȱdesȱXDMȬBaumes,ȱwelcheȱdurchȱdiesenȱhierarchischenȱSelektionsproȬ zessȱ betroffenȱ sind,ȱ werdenȱ imȱfolgendenȱKnotendiagrammȱmitȱ derȱUMLȱ dargeȬ stellt.ȱ Derȱ hierarchischeȱ Selektionsprozessȱ erfolgtȱ inȱ derȱ Ebenenordnung,ȱ dieȱ engȬ lischȱmitȱLevelorderȱbezeichnetȱwird.ȱȱ
199ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Pfadausdruck mit seinen Lokalisierungsschritten / Alle_Kunden / Kunde / Name
«Dokument» anonym
«Element» Alle_Kunden
/
Vorname
1
«Element» Kunde
1
«Element» Name
1
«Element» Vorname
1
«Wert» Hugo
1
«Element» Kunde
1
«Element» Name
1
«Element» Vorname
1
«Wert» Eva
1
Sequenz für Knoten der Art: Alle_Kunden Kunde
Name
Vorname
Abbildungȱ59:ȱPfadausdruckȱoperiertȱaufȱXDMȬBaumȱundȱerzeugtȱSequenzenȱ
Derȱ ersteȱ Suchschrittȱ startetȱ beimȱ Kontextknotenȱ derȱ Artȱ Dokumentȱ undȱ findetȱ einenȱ Knotenȱ derȱ Artȱ Alle_Kunden.ȱ Erȱ istȱ derȱ Wurzelknotenȱ desȱ externenȱ XMLȬ Dokuments.ȱDieserȱwirdȱinȱeineȱersteȱnurȱinternȱverfügbareȱSequenzȱeingetragen.ȱ FürȱdenȱnächstenȱSuchschrittȱistȱdieserȱKnotenȱderȱKontextknoten.ȱInȱseinemȱKonȬ textȱwerdenȱzweiȱKnotenȱderȱArtȱKundeȱimȱXDMȬBaumȱgefunden.ȱDieseȱwerdenȱ inȱ eineȱ weitereȱ interneȱ Sequenzȱ eingetragen.ȱ Nacheinanderȱ fungiertȱ jederȱ dieserȱ beidenȱ Knotenȱ alsȱ Kontextknotenȱ fürȱ denȱ nächstenȱ Suchschritt.ȱ Hierbeiȱ werdenȱ wiederȱ zweiȱ Knotenȱ derȱ Artȱ Nameȱ gefunden.ȱ Auchȱ sieȱ werdenȱ inȱ einerȱ weiterenȱ internenȱ Sequenzȱ eingetragen.ȱ Fürȱ denȱ nächstenȱ Suchschrittȱ dienenȱ sieȱ nacheinȬ anderȱ alsȱ Kontextknoten.ȱDasȱErgebnisȱdesȱ letztenȱSuchschrittesȱ sindȱsodannȱdieȱ beidenȱKnotenȱderȱArtȱVorname.ȱAuchȱsieȱwerdenȱinȱeineȱneueȱSequenzȱeingetraȬ gen.ȱ DieseȱSequenzȱistȱsodannȱdieȱErgebnissequenz.ȱSieȱwirdȱvomȱ Pfadausdruckȱ zurückgegeben.ȱDieȱvonȱXQueryȱangewandteȱSuchstrategieȱistȱsomitȱdieȱTechnikȱ mitȱdemȱNamenȱLevelorder.ȱ Inȱ derȱ Ergebnissequenzȱ sindȱ somitȱ zweiȱ Einträgeȱ inȱ Gestaltȱ vonȱ Knotenȱ derȱ Artȱ Vornameȱ vorhanden.ȱ Sieȱ verweisenȱ jeweilsȱ aufȱ ihreȱ Wertknotenȱ mitȱ denȱ Wertenȱ HugoȱundȱEva.ȱȱ Imȱ Programmȱ 90ȱ wirdȱ dieȱ programmtechnischeȱ Umsetzungȱ derȱ dargestelltenȱ KonzeptionȱinȱXQueryȱgezeigt.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
200ȱ
ȱ
6.5ȱȱPfadȬAusdrückeȱ XQUERY let $Sequenz_Dokument := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' ) let $Sequenz_Vorname := $Sequenz_Dokument/Alle_Kunden/Kunde/Name/Vorname return $Sequenz_Vorname
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
Programmȱ90:ȱPfadausdruckȱnavigiertȱinȱXDMȬBaumȱundȱermitteltȱdieȱKnotenȱderȱArtȱ Vornameȱ
Inȱ derȱ Programmzeileȱ (2)ȱ bisȱ (8)ȱ wirdȱ mitȱ Hilfeȱ derȱ XQueryȬFunktionȱ db2Ȭ fn:sqlquery()ȱderȱXDMȬBaumȱinȱderȱSpalteȱDokumentȱderȱTabelleȱKunde_XMLȱinȱderȱ Datenzeileȱ mitȱ demȱ Primärschlüsselwertȱ D001ȱ gelesen.ȱ Derȱ XDMȬBaumȱ wirdȱ alsȱ Eintragȱ inȱ eineȱ Sequenzȱ gespeichert.ȱ Dieseȱ Sequenzȱ wirdȱ vonȱ derȱ XQueryȬ Variablenȱ$Sequenz_Dokumentȱreferenziert.ȱInȱderȱProgrammzeileȱ(10)ȱwerdenȱmitȱ demȱ absolutenȱ Pfadausdruckȱ $Sequenz_Dokument/Alle_Kunden/Kunde/Name/Vornameȱ alleȱKnotenȱderȱArtȱVornameȱausȱdemȱXDMȬBaumȱherausselektiert.ȱDieseȱKnotenȱ werdenȱalsȱEinträgeȱinȱeinerȱErgebnissequenzȱgespeichert,ȱdieȱinȱderȱProgrammȬ zeileȱ (9)ȱ derȱ Referenzvariablenȱ $Sequenz_Vornameȱ zugewiesenȱ wird.ȱ Jederȱ dieserȱ beidenȱKnotenȱverweistȱsodannȱaufȱseinenȱabhängigenȱKnotenȱderȱKnotenartȱWert.ȱ MitȱderȱKlauselȱreturnȱinȱderȱProgrammzeileȱ(11)ȱwerdenȱsodannȱdieȱVornamenȬ knotenȱundȱihreȱabhängigenȱWertknotenȱimplizitȱserialisiertȱundȱdamitȱausgegeȬ ben.ȱ Ergebnis Hugo Eva
201ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ
Relativer Pfadausdruck Einȱ relativerȱ Pfadausdruckȱ beginntȱ nichtȱ beimȱ Dokumentknotenȱ einesȱ XDMȬ Baumes,ȱsondernȱbeiȱZwischenknotenȱderȱArtȱElementknoten.ȱDieseȱwurdenȱmitȱ einemȱvorherigenȱabsolutenȱPfadausdruckȱinȱeinerȱSequenzȱgesammelt.ȱ Beispielȱ VorherigerȱabsoluterȱPfadausdruck:ȱ let $Sequenz_Kunde := $Sequenz_Dokument/Alle_Kunden/Kunde UndȱnunȱderȱrelativeȱPfadausdruck:ȱ $Sequenz_Kunde/Name/Vorname Einȱ relativerȱ Pfadausdruckȱ beschreibtȱ somitȱ denȱ Zugriffspfadȱ aufȱ Knotenȱ einerȱ gewünschtenȱArtȱaufȱBasisȱderȱinȱeinerȱSequenzȱeingetragenenȱElementknoten,ȱdieȱ aufgrundȱ einesȱ vorherigenȱ absolutenȱ Pfadausdrucksȱ inȱ dieȱ Sequenzȱ eingetragenȱ wurden.ȱ Einȱ solcherȱ Elementknotenȱ definiertȱ denȱ Kontext,ȱ aufȱ demȱ derȱ relativeȱ PfadausdruckȱdieȱweitereȱSucheȱbeschreibt.ȱFürȱdieȱjeweiligeȱweitereȱSucheȱistȱerȱ derȱKontextknoten.ȱ Lokalisierungsschritteȱ einesȱ relativenȱ Pfadausdrucksȱ werdenȱ ebenfallsȱ vonȱ linksȱ nachȱ rechtsȱ schrittweiseȱ ausgewertet.ȱ Einȱ Pfadausdruckȱ gewinntȱ dabeiȱ ausȱ derȱ aktuellenȱ Sequenzȱ Schrittȱ fürȱ Schrittȱ Folgesequenzenȱ inȱ derȱ LevelorderȬSuchstraȬ tegie.ȱDieȱletzteȱSequenzȱdieserȱFolgeȱsindȱdieȱgesuchtenȱKnoten,ȱdieȱmitȱderȱArtȱ derȱZielknotenȱdesȱPfadausdrucksȱübereinstimmen.ȱ Dasȱ Ergebnisȱ derȱ Abarbeitungȱ einesȱ Pfadausdrucksȱ istȱ somitȱ dieȱ Sequenzȱ vonȱ XDMȬEinträgen,ȱ dieȱ durchȱ denȱ amȱ weitestenȱ rechtsȱ stehendenȱ LokalisierungsȬ schrittȱ desȱ Pfadausdrucksȱ gefundenȱ wurden.ȱ Dieȱ derartȱ sichȱ ergebendeȱ Sequenzȱ kannȱentwederȱnurȱausȱKnotenȱoderȱnurȱausȱatomarenȱWertenȱbestehen.ȱEinȱPfadȬ ausdruck,ȱderȱzuȱeinerȱMischungȱvonȱKnotenȱundȱatomarenȱWertenȱführt,ȱergibtȱ einenȱFehler.ȱ XQUERY let $Sequenz_Dokument := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' ) let $Sequenz_Alle_Kunden := $Sequenz_Dokument/Alle_Kunden Let $Sequenz_Kunde := $Sequenz_Alle_Kunden/Kunde
202ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15)
6.5ȱȱPfadȬAusdrückeȱ let $Sequenz_Name := $Sequenz_Kunde/Name let $Sequenz_Vorname := $Sequenz_Name/Vorname return $Sequenz_Vorname
(16) (17) (18) (19) (20) (21) (22)
Programmȱ91:ȱFolgeȱvonȱrelativenȱPfadausdrückenȱzumȱNavigierenȱinȱeinemȱXDMȬBaum
AbȱderȱProgrammzeileȱ(2)ȱbisȱ(8)ȱvonȱProgrammȱ91ȱwirdȱderȱXDMȬBaumȱausȱderȱ ZeileȱmitȱdemȱPrimärschlüsselwertȱD001ȱderȱTabelleȱKunde_XMLȱundȱihrerȱSpalteȱ Dokumentȱ gelesen.ȱ Derȱ hierbeiȱ gefundeneȱ Dokumentknotenȱ wirdȱ alsȱ Eintragȱ inȱ einerȱ Sequenzȱ gespeichert.ȱ Dieȱ Sequenzȱ wirdȱ mitȱ derȱ Referenzvariablenȱȱ $Sequenz_Dokumentȱreferenziert.ȱȱ InȱdenȱProgrammzeilenȱ(10)ȱundȱ(11)ȱwirdȱmitȱdemȱabsolutenȱPfadausdruckȱ$SeȬ quenz_Dokument/Alle_KundenȱderȱElementknotenȱdesȱXMLȬElementesȱAlle_Kundenȱ ausȱdemȱXDMȬBaumȱselektiertȱundȱalsȱEintragȱinȱeineȱSequenzȱeingetragen.ȱDieseȱ wirdȱmitȱderȱReferenzvariablenȱ$Sequenz_Alle_Kundenȱreferenziert.ȱ DerȱrelativeȱPfadausdruckȱinȱdenȱProgrammzeilenȱ(13)ȱundȱ(14)ȱselektiertȱdieȱbeiȬ denȱKnotenȱderȱArtȱKundeȱmitȱHilfeȱdesȱKontextknotensȱderȱArtȱAlle_Kundenȱausȱ derȱ Sequenz,ȱ dieȱ vonȱ derȱ Referenzvariablenȱ $Sequenz_Alle_Kundenȱ referenziertȱ wird.ȱ DerȱrelativeȱPfadausdruckȱinȱdenȱProgrammzeilenȱ(16)ȱundȱ(17)ȱselektiertȱdieȱbeiȬ denȱKnotenȱderȱArtȱNameȱmitȱHilfeȱderȱbeidenȱKontextknotenȱderȱArtȱKundeȱausȱ derȱSequenz,ȱdieȱvonȱderȱReferenzvariablenȱ$Sequenz_Kundenȱreferenziertȱwird.ȱ ZumȱSchlussȱselektiertȱderȱrelativeȱPfadausdruckȱinȱdenȱProgrammzeilenȱ(19)ȱundȱ (20)ȱ dieȱ beidenȱ Knotenȱ derȱ Artȱ Vornameȱ mitȱ Hilfeȱ derȱ beidenȱ Kontextknotenȱ derȱ ArtȱNameȱausȱderȱSequenz,ȱdieȱvonȱderȱReferenzvariablenȱ$Sequenz_NameȱreferenȬ ziertȱwird.ȱ Würdenȱ beimȱ schrittweisenȱ Sammelnȱ vonȱ Knotenȱ inȱ denȱ jeweiligenȱ Sequenzenȱ identischeȱ Knotenȱ gefundenȱ werden,ȱ soȱ würdeȱ nurȱ einerȱ derȱ zueinanderȱ identiȬ schenȱ Knotenȱ erhaltenȱ bleiben.ȱ Dieȱ redundantenȱ würdenȱ ausȱ derȱ Sequenzȱ autoȬ matischȱentfernt.ȱ Ergebnis Hugo Eva
ȱ
203ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Inȱ denȱ beidenȱ vorhergehendenȱ Programmenȱ Programmȱ 90ȱ undȱ Programmȱ 91ȱ wurdenȱdieȱWirkungsweisenȱderȱPfadausdrückeȱerklärt,ȱindemȱderȱPfadausdruckȱ inȱeinzelneȱSchritteȱaufgelöstȱwurde.ȱInȱXQueryȬProgrammenȱistȱesȱjedochȱdurchȬ ausȱüblich,ȱPfadausdrückeȱauchȱkompakterȱzuȱschreiben.ȱDasȱfolgendeȱProgrammȱ zeigtȱ eineȱ solcheȱ kompakteȱ Schreibweiseȱ mitȱ einerȱ Referenzvariablenȱ undȱ einerȱ Klauselȱreturn.ȱ XQUERY let $Sequenz_Vorname := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/Alle_Kunden/Kunde/Name/Vorname return $Sequenz_Vorname
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ92:ȱKompakteȱSchreibweiseȱmitȱbenannterȱSequenzȱ
Verzichtetȱ manȱ nochȱ aufȱ dieȱ Benennungȱ derȱ Sequenzȱ mitȱ Hilfeȱ einerȱ XQueryȬ Variablen,ȱdannȱentfallenȱnochȱdieȱKlauselnȱletȱundȱreturn.ȱ DieseȱnochȱkürzereȱSchreibweiseȱzeigtȱProgrammȱ93.ȱ XQUERY db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' ) /Alle_Kunden/Kunde/Name/Vorname
(1) (2) (3) (4) (5) (6) (7) (8)
Programmȱ93:ȱKompakteȱSchreibweiseȱmitȱanonymerȱSequenzȱ Ergebnis von beiden Programmen Hugo Eva
6.5.4 Struktur des Pfadausdrucks BeiȱdenȱeinführendenȱBeispielenȱistȱlediglichȱeineȱverkürzteȱSchreibweiseȱderȱLoȬ kalisierungsschritteȱ verwendetȱ worden,ȱ dieȱ denȱ StandardȬMechanismusȱ vonȱ XQueryȱ nutzt.ȱ Dieȱ Formulierungȱ einesȱ jedenȱ Lokalisierungsschrittsȱ kannȱ jedochȱ ausȱbisȱzuȱdreiȱBestandteilenȱbestehen,ȱausȱ
204ȱ
6.5ȱȱPfadȬAusdrückeȱ – demȱAchsennamenȱ – derȱKnotenbezeichnungȱundȱ – einemȱPrädikat.ȱ DieȱKnotenbezeichnungȱmussȱangegebenȱwerden.ȱSieȱkannȱȱ – derȱNameȱeinesȱXMLȬElementesȱ(ArtȱdesȱKnotens)oderȱȱ – derȱNameȱeinesȱKnotentypsȱȱ sein.ȱ
6.5.5 Achse Unterȱ einerȱ Achseȱ wirdȱ eineȱ Navigationsrichtungȱ imȱ XDMȬBaumȱ verstanden.ȱ Generellȱkannȱmanȱvorwärtsȱoderȱrückwärtsȱnavigieren.ȱBeiȱderȱVorwärtsnavigaȬ tionȱ kannȱ mitȱ derȱ Angabeȱ derȱ entsprechendenȱ Achseȱ bestimmtȱ werden,ȱ welcherȱ Teileȱ desȱ XDMȬBaumesȱ zuȱ durchsuchenȱ ist.ȱ Dieȱ Sucheȱ beginntȱ immerȱ ausȱ derȱ Perspektiveȱ desȱ aktuellenȱ Kontextknotens.ȱ Derȱ Kontextknotenȱ istȱ derȱ Knotenȱ imȱ XDMȬBaum,ȱaufȱdemȱdieȱaktuelleȱPositionȱeingestelltȱist.ȱVonȱXQueryȱinȱDB2ȱVerȬ sionȱ 9.5ȱ werdenȱ derzeitȱ folgendeȱ Achsenȱ unterstützt.ȱ Inȱ derȱ XQueryȬNormȱ sindȱ nochȱweitereȱaufgeführt.ȱ ȱ AchsenȬ nameȱ
RichȬ tungȱ
Ergebnisȱ
Bemerkungȱ
childȱ
vorwärtsȱ
AlleȱKnotenȱderȱ angegebenenȱ Artȱ undȱ allȱihreȱ abhängigenȱ Knoten.ȱ
childȱistȱdieȱStandardachse.ȱSieȱwirdȱ vonȱ XQueryȱ implizitȱ verwendet,ȱ wennȱ eineȱ Achsenangabeȱ inȱ derȱ Beschreibungȱ einesȱ LokalisierungsȬ schrittesȱfehlt.ȱ DieȱSucheȱnachȱKnotenȱderȱangegeȬ benenȱArtȱwirdȱnurȱimȱKontextȱdesȱ aktuellenȱ Kontextknotensȱ durchgeȬ führt.ȱ
descendantȱ
vorwärtsȱ
AlleȱKnotenȱderȱ angegebenenȱ Artȱ undȱ allȱihreȱ abhängigenȱ Knoten.ȱ
selfȱ
vorwärtsȱ
AlleȱKnotenȱderȱ DieȱSucheȱnachȱKnotenȱderȱangegeȬ angegebenenȱ benenȱ Artȱ beziehtȱ sichȱ nurȱ aufȱ denȱ Artȱ undȱ allȱihreȱ aktuellenȱKontextknotenȱselbst.ȱ abhängigenȱ Knoten.ȱ
DieȱSucheȱnachȱKnotenȱderȱangegeȬ benenȱ Artȱ wirdȱ imȱ Kontextȱ desȱ aktuellenȱ Kontextknotensȱ undȱ inȱ denȱ Kontextenȱ allȱ derȱ vonȱ ihmȱ abȬ hängigenȱKnotenȱdurchgeführt.ȱ
205ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ vorwärtsȱ AlleȱKnotenȱderȱ descenȬ dantȬorȬselfȱ angegebenenȱ Artȱundȱ allȱihreȱ abhängigenȱ Knoten.ȱ
DieȱSucheȱnachȱKnotenȱderȱangegeȬ benenȱ Artȱ wirdȱ imȱ Kontextȱ desȱ aktuellenȱ Kontextknotensȱ undȱ inȱ denȱ Kontextenȱ allȱ derȱ vonȱ ihmȱ abȬ hängigenȱKnotenȱdurchgeführt.ȱ
attributeȱ
vorwärtsȱ Derȱ AttributȬ knoten.ȱ
DieȱSucheȱ nachȱ einemȱAttributknoȬ tenȱ wirdȱ innerhalbȱ derȱ zugeordneȬ tenȱAttributknotenȱdesȱKontextknoȬ tensȱdurchgeführt.ȱ
parentȱ
rückȬ wärtsȱ
Dieȱ Sucheȱ nachȱ demȱ Knotenȱ derȱ angegebenenȱArtȱwirdȱnurȱimȱKonȬ textȱ desȱ aktuellenȱ Kontextknotensȱ durchgeführt.ȱ
AlleȱKnotenȱderȱ angegebenenȱ Artȱundȱallȱihreȱ abhängigenȱ Knoten.ȱ
Tabelleȱ32:ȱNavigationsachsenȱinȱXQueryȱvonȱDB2ȱV9.5ȱ
Dieȱ folgendeȱ Abbildungȱ 60ȱ zeigtȱ dieȱ Achsenȱ vonȱ XQueryȱ inȱ DB2ȱ V9.5ȱ ausȱ derȱ PerspektiveȱdesȱKontextknotens.ȱ
206ȱ
6.5ȱȱPfadȬAusdrückeȱ ȱ ȱ ȱ
parent::ȱ
ȱ
attribute::
Parentknoten
ȱ
Attributknoten
ȱ ȱ ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ ȱ child::ȱ ȱ ȱ Childknotenȱ ȱ ȱ ȱ ȱ
ȱ
ȱ ȱ
ȱ ȱ
self::ȱ Kontextknoten
Childknoten
ȱ
Descendantknoten ȱ ȱ ȱ descendant::ȱ
ȱ
descendantȬorȬself::ȱ
ȱ
ȱ Abbildungȱ60:ȱAchsenȱausȱderȱPerspektiveȱdesȱKontextknotensȱ
Inȱ denȱ folgendenȱ Programmenȱ werdenȱ mitȱ einemȱ absolutenȱ Pfadausdruckȱ dieȱ KnotenȱderȱArtȱKundeȱalsȱKontextknotenȱpositioniert.ȱAusȱderenȱPerspektiveȱwerȬ denȱsodannȱdieȱverfügbarenȱAchsenȱinȱihrerȱWirkungȱdemonstriert.ȱ Wieȱschonȱerwähnt,ȱkannȱeinȱPfadausdruckȱausȱvielenȱTeilausdrücken,ȱdenȱNaviȬ gationsschritten,ȱbestehen.ȱEinȱNavigationsschrittȱbestehtȱprinzipiellȱausȱdreiȱTeiȬ len,ȱȱ – derȱAngabeȱderȱNavigationsachseȱ – derȱAngabeȱderȱArtȱderȱzuȱsuchendenȱKnotenȱ – derȱAngabeȱeinesȱPrädikatesȱ(Bedingung),ȱdasȱderȱoderȱdieȱKnotenȱerfüllenȱ müssen.ȱ Syntaktischȱ wirdȱ dieȱ Achsenangabeȱ vonȱ derȱ Angabeȱ derȱ Artȱ desȱ Knotensȱ durchȱ zweiȱDoppelpunkteȱ::ȱgetrennt.ȱDasȱPrädikatȱstehtȱinȱeckigenȱKlammernȱ[]ȱhinterȱ derȱKnotenart.ȱEineȱAchseȱmussȱnichtȱangegebenȱwerden.ȱWirdȱihreȱAngabeȱwegȬ
207ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ gelassen,ȱnimmtȱXQueryȱdieȱAchseȱchildȱan.ȱAuchȱaufȱdieȱAngabeȱeinesȱPrädikatesȱ kannȱverzichtetȱwerden.ȱInȱdiesemȱFallȱerfolgtȱkeineȱStandardannahme.ȱ DieȱSyntaxȱeinesȱNavigationsschrittesȱlautetȱdannȱwieȱfolgt.ȱ ȱ ȱ
/Achse::Knotenart[Prädikat]
Syntaxȱ30:ȱNavigationsschrittȱ
Achse child Mitȱ Angabeȱ derȱ Achseȱ childȱ werdenȱ dieȱ vomȱ jeweiligenȱ Kontextknotenȱ abhängiȬ genȱ Knotenȱ derȱ imȱ Navigationsschrittȱ angegebenenȱ Artȱ aufȱ derȱ nächstȱ tieferenȱ hierarchischenȱ Ebeneȱ desȱ XDMȬBaumesȱ gesucht.ȱ Sieȱ werdenȱ inȱ derȱ ErgebnisseȬ quenzȱzurückgegeben.ȱDaȱdieȱvonȱihnenȱabhängigenȱundȱihnenȱuntergeordnetenȱ KnotenȱintegralerȱBestandteilȱderȱgefundenenȱKnotenȱinȱderȱSequenzȱsind,ȱzählenȱ auchȱdieseȱzumȱSuchergebnis.ȱ Beispielȱ Imȱ aktuellenȱ relativenȱ Navigationsschrittȱ inȱ derȱ Programmzeileȱ (9)ȱ desȱ ProȬ grammsȱProgrammȱ94ȱwerdenȱdieȱKnotenȱderȱArtȱNameȱgesucht.ȱSieȱsindȱKinderȱ (children)ȱ derȱ Kontextknotenȱ derȱ Artȱ Kunde.ȱ Dieseȱ werdenȱ mitȱ demȱ absolutenȱ Pfadausdruckȱ inȱ Programmzeileȱ (8)ȱ gefundenȱ undȱ inȱ eineȱ Sequenzȱ eingetragen.ȱ DieȱReferenzȱaufȱdieȱSequenzȱwirdȱinȱderȱProgrammzeileȱ(2)ȱinȱdieȱVariableȱ$SeȬ quenz_Kundeȱeingetragen.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/child::Name
Programmȱ94ȱ:ȱNavigationsschrittȱmitȱderȱAchseȱchildȱ Ergebnis Mueller, Hugo Hugo Mueller
208ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9)
6.5ȱȱPfadȬAusdrückeȱ Schulze, Eva Eva Schulze
Wieȱ ausȱ demȱ Ergebnisȱ ersichtlichȱ ist,ȱ werdenȱzweiȱ Knotenȱ derȱ Artȱ Nameȱ beiȱ derȱ Auswertungȱ desȱ relativenȱ Navigationsschrittesȱ /child::Nameȱ gefunden.ȱ Diesȱ istȱ auchȱ inȱ Abbildungȱ 59ȱ ersichtlich.ȱ Daȱ dieȱ vonȱ diesenȱ Namensknotenȱ abhängigenȱ Teilbäumeȱzuȱdiesenȱ Knotenȱ gehören,ȱwerdenȱauchȱdieȱ Datenȱderȱ Knotenȱ dieserȱ Teilbäumeȱ(Vorname,ȱZunameȱundȱWerte)ȱimȱErgebnisȱausgegeben.ȱ
Achse descendant Mitȱ Angabeȱ derȱ Achseȱ descendantȱ werdenȱ dieȱ vomȱ jeweiligenȱ Kontextknotenȱ abȬ hängigenȱ Knotenȱ derȱ imȱ Navigationsschrittȱ angegebenenȱ Artȱ aufȱ allenȱ tieferenȱ hierarchischenȱ Ebenenȱ desȱ XDMȬBaumesȱ gesucht.ȱ Sieȱ werdenȱ inȱ derȱ ErgebnisseȬ quenzȱzurückgegeben.ȱDaȱdieȱvonȱihnenȱabhängigenȱundȱihnenȱuntergeordnetenȱ KnotenȱintegralerȱBestandteilȱderȱgefundenenȱKnotenȱinȱderȱSequenzȱsind,ȱzählenȱ auchȱdieseȱzumȱSuchergebnis.ȱ Beispielȱ Imȱ aktuellenȱ relativenȱ Navigationsschrittȱ inȱ derȱ Programmzeileȱ (9)ȱ desȱ ProȬ grammsȱ Programmȱ 95ȱ werdenȱ dieȱ Knotenȱ derȱ Artȱ Vornameȱ gesucht.ȱ Sieȱ sindȱ Nachkommenȱ(descendant)ȱderȱKontextknotenȱderȱArtȱKunde.ȱDieseȱKontextknoȬ tenȱwerdenȱmitȱdemȱabsolutenȱPfadausdruckȱinȱProgrammzeileȱ(8)ȱgefundenȱundȱ inȱ eineȱ Sequenzȱ eingetragen.ȱ Dieȱ Referenzȱ aufȱ dieȱ Sequenzȱ derȱ Kundeneinträgeȱ wirdȱinȱderȱProgrammzeileȱ(2)ȱinȱdieȱVariableȱ$Sequenz_Kundeȱeingefügt.ȱ ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/descendant::Vorname
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ95:ȱNavigationsschrittȱmitȱderȱAchseȱdescendant
209ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Ergebnis Hugo Eva
WieȱausȱdemȱErgebnisȱersichtlichȱist,ȱwerdenȱzweiȱKnotenȱderȱArtȱVornameȱbeiȱderȱ Auswertungȱ desȱ relativenȱ Navigationsschrittesȱ /descendant::Vonameȱ gefunden.ȱ DiesȱistȱauchȱausȱAbbildungȱ59ȱzuȱentnehmen.ȱDaȱdieȱvonȱdiesenȱVornamensknoȬ tenȱabhängigenȱTeilbäumeȱzuȱdiesenȱKnotenȱgehören,ȱwerdenȱauchȱdieȱDatenȱderȱ Textknotenȱ dieserȱ Teilbäumeȱ imȱ Ergebnisȱ ausgegeben,ȱ alsoȱ dieȱ Werteȱ Hugoȱ undȱ Eva.ȱ
Achse self MitȱAngabeȱderȱAchseȱselfȱwirdȱderȱfolgendeȱNavigationsschritt,ȱderȱaufȱdenȱNaȬ vigationsschrittȱmitȱderȱAchseȱselfȱfolgt,ȱbeiȱdemȱaktuellenȱKontextknotenȱfortgeȬ setzt.ȱ Inȱ derȱ Achseȱ selfȱ mussȱ derȱ Nameȱ desȱ aktuellenȱ Kontextknotensȱ nochmalsȱ angegebenȱ werden.ȱ Dieseȱ Funktionalitätȱ dürtfeȱ etwasȱ seltenerȱ erforderlichȱ sein.ȱ SieȱwirdȱjedochȱinȱeinemȱspäterenȱBeispielȱfürȱdieȱAchseȱattributeȱbenötigt.ȱ ImȱfolgendenȱProgrammȱ96ȱwirdȱbeiȱdenȱKontextknotenȱderȱArtȱKundeȱdieȱNaviȬ gationȱdurchȱdenȱXDMȬBaumȱzunächstȱnochmalsȱexplizitȱmitȱdenȱKnotenȱderȱArtȱ self::KundeȱfortgesetztȱundȱderenȱabhängigeȱKindknotenȱderȱArtȱAnredeȱinȱdieȱErȬ gebnissequenzȱ eingetragen.ȱ Zumȱ selbenȱ Ergebnisȱ würdeȱ auchȱ derȱ Ausdruckȱ reȬ turnȱ$Sequenz_Kunde/child::Anredeȱführen.ȱ ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/self::Kunde/child::Anrede
Programmȱ96:ȱNavigationsschrittȱmitȱderȱAchseȱself Ergebnis Herr Frau
210ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9)
6.5ȱȱPfadȬAusdrückeȱ
Achse descendant-or-self MitȱAngabeȱderȱAchseȱdescendantȬorȬselfȱwirdȱderȱaktuelleȱKontextknotenȱundȱdieȱ vonȱ ihmȱ abhängigenȱ Knotenȱ nachȱ derȱ imȱ Navigationsschrittȱ angegebenenȱ KnoȬ tenartȱ durchsucht.ȱGefundeneȱKnotenȱwerdenȱinȱderȱErgebnissequenzȱzurückgeȬ geben.ȱDaȱdieȱvonȱihnenȱabhängigenȱundȱihnenȱuntergeordnetenȱKnotenȱintegraȬ lerȱBestandteilȱderȱgefundenenȱKnotenȱinȱderȱSequenzȱsind,ȱzählenȱauchȱsieȱzumȱ Suchergebnis.ȱ Beispielȱ Umȱ dieȱ Wirkungsweiseȱ derȱ Achseȱ descendantȬorȬselfȱ eindrücklichȱ demonstrierenȱ zuȱ können,ȱ wirdȱ einȱ weiteresȱ Dokumentȱ mitȱ demȱ Primärschlüsselȱ D003ȱ inȱ dieȱ TabelleȱKunde_XMLȱmitȱdemȱProgrammȱ97ȱgeladen.ȱInȱihmȱgibtȱesȱzweiȱElementȬ knotenȱderȱArtȱAnrede.ȱDerȱersteȱwirdȱinȱProgrammzeileȱ(6)ȱundȱderȱzweiteȱinȱ(11)ȱ eingefügt.ȱ INSERT INTO Kunde_XML VALUES ('D003', ' Herr Mueller, Hugo Hugo Mueller falsch platziert ' ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17)
Programmȱ97:ȱEinȱKundeȱmitȱzweiȱElementenȱderȱArtȱAnrede
ImȱfolgendenȱProgrammȱ98ȱwirdȱdieȱAchseȱdescendantȬorȬselfȱinȱderȱProgrammzeiȬ leȱ (9)ȱ eingesetzt.ȱ Aufgrundȱ ihrerȱ Navigationseigenschaftȱ werdenȱ alleȱ Knotenȱ derȱ ArtȱAnredeȱgefunden,ȱgleichgültigȱobȱdieseȱdirektȱoderȱindirektȱvonȱdenȱaktuellenȱ Kontextknotenȱ derȱ Artȱ Kundeȱ abhängigȱ sind.ȱ Dieseȱ Kontextknotenȱ werdenȱ mitȱ demȱabsolutenȱPfadausdruckȱinȱProgrammzeileȱ(8)ȱgefundenȱundȱinȱeineȱSequenzȱ eingetragen.ȱ Dieȱ Referenzȱ aufȱ dieȱ Sequenzȱ derȱ Kundeneinträgeȱ wirdȱ inȱ derȱ ProȬ grammzeileȱ(2)ȱinȱdieȱVariableȱ$Sequenz_Kundeȱeingefügt.ȱ ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML
(1) (2) (3) (4) (5)
211ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ WHERE Kunde_XML_Nr = ''D003'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/descendant-or-self::Anrede
(6) (7) (8) (9)
Programmȱ98:ȱNavigationsschrittȱmitȱderȱAchseȱdescendantȬorȬself Ergebnis Herr falsch platziert
WieȱausȱdemȱErgebnisȱersichtlichȱist,ȱwerdenȱzweiȱKnotenȱderȱArtȱAnredeȱbeiȱderȱ Auswertungȱ desȱ relativenȱ Navigationsschrittesȱ /descendantȬorȬself::Anredeȱ gefunȬ den.ȱ Dieseȱ stammenȱ ausȱ demȱ XDMȬBaum,ȱ derȱ ausȱ demȱ XMLȬDokumentȱ inȱ denȱ Programmzeilenȱ(6)ȱundȱ(11)ȱvonȱProgrammȱ97ȱerzeugtȱwird.ȱJederȱAnredeknotenȱ leitetȱeinenȱTeilbaumȱein.ȱDieserȱbestehtȱausȱdemȱAnredeknotenȱundȱdemȱzuȱihmȱ gehörendenȱTextknoten.ȱSomitȱwerdenȱauchȱdieȱWerteȱHerrȱundȱfalschȱplatziertȱinȱ dasȱErgebnisȱübernommen.ȱ
Achse attribute MitȱAngabeȱderȱAchseȱattributeȱwirdȱaufȱeinenȱKnotenȱderȱArtȱElementattributȱimȱ XDMȬBaumȱnavigiert.ȱȱ Beispielȱ ImȱVorgriffȱaufȱdieȱspätereȱDarstellungȱderȱAnwendungȱvonȱPrädikatenȱwirdȱimȱ folgendenȱBeispielȱdieȱAchseȱattributeȱangewendet,ȱumȱXQueryȱmitzuteilen,ȱdassȱ derȱ Nameȱ Kunde_Nrȱ einȱ XMLȬAttributȱ undȱ keinȱ XMLȬElementȱ ist.ȱ Derȱ TeilausȬ druckȱ Kunde_Nrȱ =ȱ ȇK001ȇȱ istȱ einȱ Gleichheitsprädikat.ȱ Mitȱ Hilfeȱ dieserȱ FormulieȬ rungȱ wirdȱ XQueryȱ mitgeteilt,ȱ dassȱ nurȱ derȱ Kontextknoten,ȱ beiȱ demȱ dasȱ Attributȱ Kunde_Nrȱ gleichȱ K001ȱ ist,ȱ fürȱ dieȱ folgendeȱ Navigationȱ aufȱ Kindknotenȱ derȱ Artȱ Anredeȱverwendetȱwerdenȱsoll.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/self::Kunde [attribute::Kunde_Nr = 'K001']/child::Anrede
Programmȱ99:ȱNavigationsschrittȱmitȱderȱAchseȱattribute
212ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
6.5ȱȱPfadȬAusdrückeȱ Ergebnis Herr
Achse parent Mitȱ Angabeȱ derȱ Achseȱ parentȱ wirdȱ aufȱ einenȱ Elementknotenȱ navigiert,ȱ derȱ demȱ aktuellenȱ Kontextknotenȱ hierarchischȱ unmittelbarȱ übergeordnetȱ ist.ȱ Dieserȱ überȬ geordneteȱ Knotenȱ wirdȱ inȱ dieȱ Ergebnissequenzȱ eingetragen.ȱ Alleȱ diesemȱ ElternȬ knotenȱ unmittelbarȱ undȱ mittelbarȱ untergeordnetȱ Knotenȱ werdenȱ sodannȱ beiȱ derȱ AusgabeȱderȱErgebnissequenzȱmitȱausgegeben.ȱȱ Beispielȱ MitȱderȱAchseȱparentȱwirdȱvonȱdenȱbeidenȱaktuellenȱKontextknotenȱderȱArtȱKundeȱ aufȱ derenȱ gemeinsamenȱ undȱ unmittelbarenȱ hierarchischenȱ Vorgängerȱ navigiert.ȱ Diesȱ istȱ derȱ Knotenȱ derȱ Artȱ Alle_Kunden.ȱ Inȱ derȱ Ausgabeȱ erscheinenȱ deshalbȱ dieȱ DatenȱallerȱKnotenȱdesȱgesamtenȱXDMȬBaumes.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/parent::Alle_Kunden
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ100:ȱNavigationsschrittȱmitȱderȱAchseȱparent Ergebnis Herr Mueller, Hugo Hugo Mueller
213ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Frau Schulze, Eva Eva Schulze
6.5.6 Knotenbezeichnung Eineȱ Knotenbezeichnungȱ erfolgteȱ inȱ denȱ vorangehendenȱ Beispielenȱ durchȱ dieȱ Angabeȱ desȱ Namensȱ einesȱ XMLȬElementesȱ oderȱ einesȱ XMLȬAttributes.ȱ Dieseȱ Technikȱ wirdȱ auchȱalsȱ Namenstestȱ (engl.ȱ nameȱ test)ȱbezeichnet.ȱ XQueryȱ vonȱ DB2ȱ V9.5ȱ gestattetȱ alternativȱ zuȱ dieserȱ Navigationstechnik,ȱ dieȱ sichȱ aufȱ dieȱ imȱ XMLȬ Dokumentȱ verwendetenȱ Namenȱ stützt,ȱ eineȱ Navigationȱ mitȱ Angabeȱ desȱ KnotenȬ typs.ȱDieseȱbezeichnenȱwirȱfortanȱalsȱKnotentyptestȱ(engl.ȱkindȱtest).ȱDamitȱXQueryȱ dieȱ Bezeichnerȱ derȱ Knotentypenȱ vonȱ denenȱ fürȱ ElementȬȱ undȱ Attributnamenȱ (Namenstest)ȱunterscheidenȱkann,ȱendenȱdieȱNamenȱderȱKnotentypenȱmitȱeinemȱ rundenȱKlammernpaar.ȱ Knotentypȱ
Ergebnisȱ
Bemerkungȱ
node()ȱ
Alleȱ Knotenȱ allerȱ Knotentypenȱinȱderȱ angegebenenȱ AchȬ se.ȱ
Dieȱ Sucheȱ nachȱ Knotenȱ beliebigenȱ Typsȱ wirdȱ imȱ Kontextȱ desȱ aktuellenȱ Knotensȱ durchgeführt.ȱ
text()ȱ
Beispielȱ /child::node()ȱ
Alleȱ Wertknotenȱ inȱ Dieȱ Sucheȱ nachȱ Knotenȱ desȱ Typsȱ ȱ derȱ angegebenenȱ wirdȱ imȱ Kontextȱ desȱ aktuellenȱ Knotensȱ Achse.ȱ unterȱ Berücksichtigungȱ derȱ Achsenangabeȱ durchgeführt.ȱ Beispieleȱ /child::text()ȱ /descendant::text()ȱ
comment()ȱ
214ȱ
Alleȱ KommentarȬ knotenȱ inȱ derȱ anȬ gegebenenȱAchse.ȱ
Dieȱ Sucheȱ nachȱ Knotenȱ desȱ Typsȱ ȱ wirdȱ imȱ Kontextȱ desȱ aktuellenȱ Knotensȱ unterȱ Berücksichtigungȱ derȱ AchȬ senangabeȱdurchgeführt.ȱ
6.5ȱȱPfadȬAusdrückeȱ Beispieleȱ /child::comment()ȱ /descendant::comment()ȱ processingȬ instruction()ȱ
AlleȱVerarbeitungsȬ hinweisknotenȱ inȱ derȱ angegebenenȱ Achse.ȱ
Dieȱ Sucheȱ nachȱ Knotenȱ desȱ Typsȱ ȱ wirdȱ imȱ Kontextȱ desȱ aktuellenȱ Knotensȱ unterȱ Berücksichtigungȱ derȱAchsenangabeȱdurchgeführt.ȱ Beispieleȱ /child::ȱprocessingȬinstruction()ȱ /self::ȱprocessingȬinstruction()ȱ
element()ȱȱ oderȱ element(*)ȱ
AlleȱElementknotenȱ Dieȱ Sucheȱ nachȱ Knotenȱ desȱ Typsȱ ȱwirdȱimȱKontextȱdesȱaktuellenȱKnoȬ Achse.ȱ tensȱ unterȱ Berücksichtigungȱ derȱ AchsenanȬ gabeȱdurchgeführt.ȱ Beispieleȱ /child::ȱelement()ȱ /self::ȱelement(*)ȱ
attribute()ȱȱ oderȱȱ attribute(*)ȱ
AlleȱAttributknotenȱ Dieȱ Sucheȱ nachȱ Knotenȱ desȱ Typsȱ ȱ wirdȱ imȱ Kontextȱ desȱ aktuellenȱ KnoȬ Achse.ȱ tensȱ unterȱ Berücksichtigungȱ derȱ AchsenanȬ gabeȱ/attributeȱdurchgeführt.ȱ Beispielȱ /attribute::attribute()ȱ
documentȬ node()ȱ
Alleȱ DokumentȬ knotenȱ inȱ derȱ anȬ gegebenenȱAchse.ȱ
Dieȱ Sucheȱ nachȱ Knotenȱ desȱ Typsȱ ȱwirdȱimȱKontextȱdesȱaktuellenȱKnoȬ tensȱ unterȱ Berücksichtigungȱ derȱ AchsenanȬ gabeȱ/parentȱdurchgeführt.ȱ Beispielȱ /parent::documentȬnode()ȱ
Tabelleȱ33:ȱBezeichnerȱfürȱKnotentyptestsȱ
Inȱ denȱfolgendenȱProgrammenȱwerdenȱdieȱBezeichnerȱfürȱdieȱFormulierungȱ vonȱ Knotentyptestsȱangewendet.ȱ
215ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ
Knotentyp node() ImȱfolgendenȱProgrammȱ101ȱwerdenȱalleȱKnotenȱgesucht,ȱdieȱvonȱdenȱKnotenȱderȱ Artȱ Nameȱ hierarchischȱ abhängigȱ sind.ȱ Derȱ KnotentypȬBezeichnerȱ node()ȱ wirdȱ imȱ letztenȱPfadschrittȱinȱProgrammzeileȱ(9)ȱverwendet.ȱ ȱ XQUERY let $Sequenz_Name := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde/child::Name return $Sequenz_Name/child::node()
Programmȱ101:ȱSucheȱmitȱdemȱKnotentypȱnode() Ergebnis Mueller, Hugo Hugo Mueller Schulze, Eva Eva Schulze
216ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9)
6.5ȱȱPfadȬAusdrückeȱ
Knotentyp text() ImȱfolgendenȱProgrammȱ102ȱwerdenȱalleȱWertknotenȱgesucht,ȱdieȱvonȱdenȱKnotenȱ derȱArtȱNameȱunmittelbarȱhierarchischȱabhängigȱsind.ȱDerȱKnotentypȬBezeichnerȱ text()ȱwirdȱimȱletztenȱPfadschrittȱinȱProgrammzeileȱ(9)ȱverwendet.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/child::Name/child::text()
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ102:ȱSucheȱmitȱdemȱKnotentypȱtext() Ergebnis Mueller, Hugo Schulze, Eva
Knotentyp comment() ImȱfolgendenȱProgrammȱ103ȱwerdenȱalleȱKommentarknotenȱgesucht,ȱdieȱvonȱdenȱ Knotenȱ derȱ Artȱ Nameȱ unmittelbarȱ hierarchischȱ abhängigȱ sind.ȱ Derȱ KnotentypȬ Bezeichnerȱcomment()ȱwirdȱimȱletztenȱPfadschrittȱinȱProgrammzeileȱ(9)ȱverwendet.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/child::Name/child::comment()
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ103:ȱSucheȱmitȱdemȱKnotentypȱcomment()ȱ
Daȱ imȱ durchsuchtenȱ Dokumentȱ keineȱ Kommentareȱ vorhandenȱ sind,ȱ erzeugtȱ dieȱ AusgabeȱeineȱleereȱSequenz.ȱ
Knotentyp processing-instruction() Imȱ folgendenȱ Programmȱ 104ȱ werdenȱ alleȱ Verarbeitungshinweisknotenȱ gesucht,ȱ dieȱ vonȱ denȱ Knotenȱ derȱ Artȱ Nameȱ unmittelbarȱ hierarchischȱ abhängigȱ sind.ȱ Derȱ KnotentypȬBezeichnerȱ processingȬinstruction()ȱ wirdȱ imȱ letztenȱ Pfadschrittȱ inȱ ProȬ grammzeileȱ(9)ȱverwendet.ȱ ȱ
217ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/self::processing-instruction()
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ104:ȱSucheȱmitȱdemȱKnotentypȱprocessingȬinstruction()ȱ
Daȱ imȱ durchsuchtenȱ Dokumentȱ keineȱ Verarbeitungshinweiseȱ vorhandenȱ sind,ȱ erzeugtȱdieȱAusgabeȱeineȱleereȱSequenz.ȱ
Knotentyp element() Imȱ folgendenȱ Programmȱ 105ȱ werdenȱ alleȱ Elementknotenȱ gesucht,ȱ dieȱ vonȱ denȱ Knotenȱ derȱ Artȱ Nameȱ unmittelbarȱ hierarchischȱ abhängigȱ sind.ȱ Derȱ KnotentypȬ Bezeichnerȱelement()ȱwirdȱimȱletztenȱPfadschrittȱinȱProgrammzeileȱ(9)ȱverwendet.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde return $Sequenz_Kunde/child::Name/child::element()
Programmȱ105:ȱSucheȱmitȱdemȱKnotentypȱelement() Ergebnis Hugo Mueller Eva Schulze
218ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9)
6.5ȱȱPfadȬAusdrückeȱ
Knotentyp attribute() Imȱ folgendenȱ Programmȱ 106ȱ werdenȱ alleȱ Attributknotenȱ gesucht,ȱ dieȱ vonȱ denȱ Knotenȱ derȱ Artȱ Kundeȱ unmittelbarȱ attributivȱ abhängigȱ sind.ȱ Derȱ KnotentypȬ Bezeichnerȱattribute()ȱwirdȱinȱderȱProgrammzeileȱ(10)ȱverwendet.ȱȱ DaȱesȱimȱDokumentȱzweiȱAttributeȱmitȱdemȱNamenȱKunde_Nrȱgibt,ȱwerdenȱihreȱ AttributknotenȱzunächstȱinȱdieȱSequenzȱ$Sequenz_Attributeȱeingetragen.ȱAttributȬ namenȱ mitȱ ihrenȱ Wertenȱ könnenȱ nurȱ ausgegebenȱ werden,ȱ wennȱ sieȱ inȱ einemȱ XMLȬElementȱeingebettetȱ sind.ȱDeshalbȱwirdȱinȱ derȱKlauselȱ returnȱzunächstȱ eineȱ Ausgabesequenzȱ gebildet.ȱ Ihreȱ Einträgeȱ sindȱ dieȱ beidenȱ Hilfselementeȱ ȱ undȱ .ȱDerȱElementinhaltȱvonȱȱistȱderȱersteȱAttributknotenȱinȱderȱSequenzȱ$SeȬ quenz_Attribute.ȱ Erȱ wirdȱ mitȱ demȱ Filterausdruckȱ [1]ȱ inȱ eckigenȱ Klammernȱ adresȬ siert.ȱ Dieȱ geschweiftenȱ KlammernȱumȱdenȱSequenzentnahmeausdruckȱbewirken,ȱ dassȱ dieserȱ nichtȱ alsȱ Text,ȱ sondernȱ seinȱ Ausführungsergebnisȱ alsȱ Elementinhaltȱ eingesetztȱwird.ȱMitȱderȱ eingebautenȱFunktionȱfn:distinctȬvalues()ȱschließlichȱwerȬ denȱdieȱAttributwerteȱausȱdenȱAttributknotenȱentnommenȱundȱinȱdieȱAusgabeseȬ quenzȱeingetragen.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde let $Sequenz_Attribute := $Sequenz_Kunde/attribute::attribute() return ({$Sequenz_Attribute [1]}, {$Sequenz_Attribute [2]}, fn:distinct-values($Sequenz_Attribute) )
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ106:ȱSucheȱmitȱdemȱKnotentypȱattribute() Ergebnis K001 K003
Knotentyp document-node() ImȱfolgendenȱProgrammȱ107ȱwirdȱmitȱdemȱKnotentypȬBezeichnerȱdocumentȬnode()ȱ zunächstȱinȱProgrammzeileȱ(11)ȱaufȱdenȱDokumentknotenȱpositioniert.ȱDamitȱdieȱ auszugebendeȱDatenmengeȱ nichtȱ zuȱumfangreichȱwird,ȱerfolgtȱzumȱSchlussȱeineȱ SammlungȱderȱKnotenȱderȱArtȱZunameȱinȱderȱAusgabesequenz.ȱ ȱ ȱ
219ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde let $Sequenz_Dokument := $Sequenz_Kunde /parent::Alle_Kunden /parent::document-node() let $Sequenz_Zuname := $Sequenz_Dokument /descendant::Zuname return $Sequenz_Zuname
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ107:ȱSucheȱmitȱdemȱKnotentypȱdocumentȬnode()
Ergebnisȱ Mueller Schulze
6.5.7 Prädikat Inȱ einemȱ Lokalisierungsschrittȱ bildetȱ dasȱ Prädikatȱ denȱ drittenȱ undȱ optionalenȱ Bestandteil.ȱEinȱLokalisierungsschrittȱbesteht,ȱwieȱobenȱdargestellt,ȱausȱȱ – demȱAchsennamenȱ – derȱKnotenbezeichnungȱundȱ – demȱPrädikat.ȱ Aufȱ Prädikateȱ wurdeȱ bereitsȱ imȱ Zusammenhangȱ mitȱ Filterausdrückenȱ beiȱ SeȬ quenzenȱeinführendȱeingegangen.ȱ Einȱ Prädikatsausdruckȱ mussȱinȱ eckigenȱ Klammernȱ eingeschlossenȱ werden.ȱ Seineȱ AuswertungȱergibtȱeinenȱWahrheitswertȱvonȱwahrȱ(true)ȱoderȱfalschȱ(false).ȱStehenȱ mehrereȱ solchermaßenȱ geklammerteȱ Prädikatsausdrückeȱ inȱ einemȱ zusammenȬ gesetztenȱPrädikatȱhintereinander,ȱsoȱwerdenȱihreȱWahrheitswerteȱdurchȱdasȱbooȬ lescheȱUndȱzuȱeinemȱGesamtwahrheitswertȱverknüpft.ȱ Derȱ Begriffȱ Prädikatȱ istȱ inȱ XQueryȱ weitȱ gefasst.ȱ Einȱ Prädikatsausdruckȱ kannȱ inȱ XQueryȱ einȱ numerischerȱ Ausdruckȱ oderȱ einȱ Vergleichsausdruckȱ sein,ȱ derȱ einenȱ Wahrheitswertȱergibt.ȱDieȱletztereȱSpielartȱistȱdieȱüblicheȱinȱderȱInformatik.ȱ Imȱ Falleȱ einesȱ numerischenȱ Ausdrucksȱ bestimmtȱ derȱ ganzzahligeȱ Ergebniswert,ȱ derȱ größerȱ alsȱ nullȱ (0)ȱ seinȱ muss,ȱ dieȱ Positionȱ desȱ Sequenzeintrags,ȱ derȱ ausȱ derȱ ErgebnissequenzȱdesȱaktuellenȱPfadausdrucksȱgelesenȱwerdenȱsoll.ȱȱ
220ȱ
6.5ȱȱPfadȬAusdrückeȱ Istȱ derȱ Ergebniswertȱ etwasȱ anderesȱ alsȱ eineȱ Zahl,ȱ welcheȱ dieȱ Positionȱ einesȱ vorȬ handenenȱEintragsȱinȱderȱuntersuchtenȱSequenzȱangibt,ȱsoȱwirdȱseinȱsoȱgenannterȱ effektiverȱ Wahrheitswertȱ vonȱ XQueryȱ ermittelt.ȱ Dieserȱ effektiveȱ Wahrheitswertȱ istȱ entwederȱ derȱ Wertȱ wahrȱ (true)ȱ oderȱ derȱ Wertȱ falschȱ (false).ȱ Derȱ effektiveȱ WahrȬ heitswertȱfalschȱwirdȱfestgestellt,ȱwennȱdasȱPrädikatsergebnisȱeinerȱderȱfolgendenȱ Werteȱistȱ – – – – –
derȱWertȱfalseȱvomȱTypȱxs:booleanȱ dieȱZahlȱkleinerȱoderȱgleichȱnullȱoderȱderȱWertȱNaNȱ(notȱaȱnumber)ȱ eineȱZahl,ȱdieȱgrößerȱistȱalsȱdieȱAnzahlȱderȱEinträgeȱinȱderȱSequenzȱ eineȱZeichenketteȱderȱLängeȱnullȱ eineȱleereȱSequenz.ȱ
IstȱderȱeffektiveȱWahrheitswertȱwahr,ȱsoȱwirdȱderȱaktuellȱuntersuchteȱWertȱinȱdieȱ Ergebnissequenzȱübernommen.ȱImȱFalleȱvonȱfalschȱwirdȱerȱverworfen.ȱ Imȱ folgendenȱ Programmȱ 108ȱ wirdȱ alsȱ Prädikatȱ inȱ Programmzeileȱ (8)ȱ dieȱ Zahlȱ 1ȱ verwendet,ȱumȱdenȱKnotenȱanȱderȱerstenȱPositionȱderȱSequenz,ȱdieȱvonȱderȱeingeȬ bautenȱ Funktionȱ db2Ȭfn:sqlquery()ȱ zurückgegebenȱ wird,ȱ derȱ Ergebnissequenzȱ zuȬ zuweisen.ȱDieseȱwirdȱsodannȱvonȱderȱXQueryȬVariablenȱ$Sequenz_KundeȱreferenȬ ziert.ȱ XQUERY let $Sequenz_Kunde := db2-fn:sqlquery( 'SELECT Dokument FROM Kunde_XML WHERE Kunde_XML_Nr = ''D001'' ' )/child::Alle_Kunden/child::Kunde[ 1 ] return $Sequenz_Kunde
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ108ȱ:ȱPrädikatȱbestehtȱausȱeinerȱZahlȱgrößerȱnull,ȱd.ȱh.ȱ1 Ergebnis Herr Mueller, Hugo Hugo Mueller
221ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Werdenȱ anstelleȱ desȱ Wertesȱ 1ȱ inȱ derȱ Prädikatsklammerȱ Werteȱ eingesetzt,ȱ dieȱ zuȱ demȱ effektivenȱ Wahrheitswertȱ falschȱ führen,ȱ soȱ wirdȱ keinȱ Knotenȱ derȱ Artȱ Kundeȱ ausȱdemȱgelesenenȱDokumentȱentnommen.ȱBeispieleȱfürȱdenȱInhaltȱderȱZeileȱ(8)ȱinȱ Programmȱ108ȱsindȱinȱfolgenderȱTabelleȱangegeben.ȱȱ ȱ Beispielȱ
effektiverȱWahrheitswertȱ
/child::Alle_Kunden/child::Kunde[ȱ0ȱ]ȱ
falschȱ
/child::Alle_Kunden/child::Kunde[ȱ–1ȱ]ȱ
falschȱ
/child::Alle_Kunden/child::Kunde[ȱ3ȱ]ȱ
falschȱ
/child::Alle_Kunden/child::Kunde[ȱNaNȱ]ȱ
falschȱ
/child::Alle_Kunden/child::Kundeȱ[ȈȈȱ]ȱ
falschȱ
/child::Alle_Kunden/child::Kunde[ȱ()ȱ]ȱ
falschȱ
/child::Alle_Kunden/child::Kunde[ȱfn:false()ȱ]ȱ
falschȱ
/child::Alle_Kunden/child::Kunde[ȱ2ȱ]ȱ
wahrȱ
/child::Alle_Kunden/child::Kunde[ȱfn:true()ȱ]ȱ
wahrȱ
/child::Alle_Kunden/child::Kunde[ȱȈȱȈ]ȱ
wahrȱ
/child::Alle_Kunden/child::Kunde[ȱȈhalloȈ]ȱ
wahrȱ
/child::Alle_Kunden/child::Kunde[ȱ1ȱ=ȱ1ȱ]ȱ
wahrȱ
/child::Alle_Kunden/child::Kunde[ȱ1ȱ=ȱ1ȱ][ȱ1ȱ R003 K002 2008-04-05 5000.00
ȱ
Ergebnisȱ4:ȱRechnungenȱgelesenȱmitȱXQueryȱundȱSQLȱ
Aggregatsfunktion fn:count() Dieȱ Aggregatsfunktionȱ fn:count()ȱ stelltȱ dieȱ Anzahlȱ derȱ Einträgeȱ inȱ einerȱ Sequenzȱ fest.ȱ Sieȱ wirdȱ imȱ folgendenȱ Beispielȱ eingesetzt,ȱ umȱ dieȱ Anzahlȱ derȱ XMLȬ DokumenteȱinȱderȱSpalteȱDokumentȱderȱTabelleȱRechnung_XMLȱzuȱzählen.ȱ
244ȱ
6.6ȱȱFLWORȬAusdruckȱ Inȱ Programmȱ 131ȱ fügtȱ derȱ FLWORȬAusdruck,ȱ derȱ inȱ Programmzeileȱ (3)ȱ bisȱ (5)ȱ steht,ȱ inȱ seinerȱ Klauselȱ returnȱ$Rechnungȱ dreiȱ Rechnungseinträgeȱ inȱ seineȱ ErgebȬ nissequenzȱein.ȱDieseȱSequenzȱwirdȱinȱderȱZeileȱ(2)ȱanȱdieȱReferenzvariableȱ$RechȬ nungenȱgebunden.ȱInȱderȱKlauselȱreturnȱabȱderȱZeileȱ(6)ȱbisȱ(8)ȱstehenȱdieȱEinträgeȱ derȱ Sequenz,ȱ welcheȱ anȱ dieȱ Variableȱ $Rechnungenȱ gebundenenȱ ist,ȱ sodannȱ zurȱ Verfügung.ȱMitȱderȱFunktionȱfn:count()ȱinȱZeileȱ(7)ȱwirdȱdieȱAnzahlȱdieserȱEinträȬ geȱ festgestellt.ȱ Damitȱ dieȱ Funktionȱ fn:count()ȱ ausgeführtȱ wird,ȱ mussȱ sieȱ inȱ geȬ schweifteȱKlammernȱeingefasstȱwerden.ȱAnsonstenȱwäreȱihrȱTextȱalsȱElementwertȱ zurückgegebenȱworden.ȱ XQUERY let $Rechnungen := for $Rechnung in db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') return $Rechnung return {fn:count($Rechnungen)}
(1) (2) (3) (4) (5) (6) (7) (8)
Programmȱ131:ȱAnzahlȱderȱRechnungenȱfeststellen Ergebnis 3
SollȱnurȱdieȱAnzahlȱderȱRechnungenȱvonȱKundeȱK001ȱfestgestelltȱwerden,ȱsoȱbietetȱ sichȱ zurȱ Lösungȱ dieserȱ Selektionsaufgabeȱ dieȱ Klauselȱ whereȱ desȱ FLWORȬ Ausdrucksȱ an.ȱ Inȱ denȱ Programmzeilenȱ (5)ȱ undȱ (6)ȱ vonȱ Programmȱ 132ȱ wirdȱ zuȬ nächstȱ mitȱ Hilfeȱ desȱ Pfadausdrucksȱ dieȱ jeweiligeȱ Kundennummerȱ desȱ aktuellenȱ Kundenȱ ermitteltȱ undȱ alsȱ linkerȱ Operandȱ desȱ Vergleichsausdrucksȱ Kunde_Nrȱ =ȱ ȇK001ȇȱ verwendet.ȱBeiȱ einemȱ WahrheitswertȱwahrȱwirdȱderȱEintragȱderȱaktuellenȱ Rechnungȱ mitȱ derȱ Klauselȱ returnȱ inȱ dieȱ Ergebnissequenzȱ aufgenommen.ȱ Dieseȱ wirdȱinȱderȱZeileȱ(2)ȱanȱdieȱReferenzvariableȱ$RechnungenȱgebundenȱundȱinȱZeileȱ (9)ȱausgezählt.ȱ XQUERY let $Rechnungen := for $Rechnung in db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') where $Rechnung/child::Rechnung /child::Kunde_Nr = 'K001' return $Rechnung return {fn:count($Rechnungen)}
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
Programmȱ132:ȱAnzahlȱderȱRechnungenȱvonȱKundeȱK001ȱfeststellen
245ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Ergebnis 2
Aggregatsfunktion fn:sum() Mitȱ derȱ Aggregatsfunktionȱ fn:sum()ȱ wirdȱ dieȱ Summeȱ derȱ numerischenȱ Einträgeȱ einerȱSequenzȱermittelt.ȱ ImȱfolgendenȱProgrammȱ133ȱwirdȱdasȱGesamtobligoȱ(Gesamtschulden)ȱausȱallenȱ Rechnungenȱ berechnet.ȱ Imȱ FLWORȬAusdruckȱ inȱ denȱ Programmzeilenȱ (3)ȱ bisȱ (8)ȱ werdenȱzunächstȱdieȱBetragsknotenȱausȱdenȱRechnungsdokumentenȱentnommen.ȱ InȱdenȱZeilenȱ(6)ȱundȱ(7)ȱwerdenȱdieseȱKnotenȱatomisiert,ȱd.ȱh.ȱihreȱWerteȱwerdenȱ vonȱ derȱ Funktionȱ xs:decimal()ȱ extrahiertȱ undȱ alsȱ Dezimalzahlenȱ zurückgegeben.ȱ BeiȱjedemȱDurchlaufȱdesȱFLWORȬAusdrucksȱwirdȱderȱjeweiligeȱWertȱanȱdieȱRefeȬ renzvariableȱ$Einzelobligo_Wertȱgebunden.ȱMitȱderȱKlauselȱreturnȱinȱZeileȱ(8)ȱwirdȱ erȱ sodannȱ inȱ dieȱ Ergebnissequenzȱ alsȱ Eintragȱ eingespeist.ȱ Dieseȱ Sequenzȱ wirdȱ nachȱdemȱletztenȱDurchlaufȱvomȱFLWORȬAusdruckȱzurückgegebenȱundȱinȱZeileȱ (2)ȱ anȱ dieȱ Referenzvariableȱ $Gesamtobligo_Sequenzȱ gebunden.ȱ Ihreȱ Werteȱ werdenȱ inȱderȱZeileȱ(10)ȱsodannȱvonȱderȱeingebautenȱFunktionȱfn:sum()ȱzusammenaddiertȱ undȱalsȱErgebniswertȱinȱdenȱstatischenȱKonstruktorȱdesȱXMLȬElementsȱȱeingebaut.ȱDamitȱdieȱFunktionȱauchȱausgeführtȱwird,ȱmussȱsieȱinȱgeschweifteȱ Klammernȱeingeklammertȱwerden.ȱ XQUERY let $Gesamtobligo_Sequenz := for $Betragsknoten in db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') /child::Rechnung/child::Betrag let $Einzelobligo_Wert := xs:decimal($Betragsknoten) return $Einzelobligo_Wert return {fn:sum($Gesamtobligo_Sequenz)}
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
Programmȱ133:ȱGesamtobligoȱallerȱKundenȱmitȱAggregatsfunktionȱfn:sum() Ergebnis 20000
Aggregatsfunktion fn:min(), fn:max() und fn:avg() NebenȱdenȱobenȱdargestelltenȱAggregatsfunktionenȱfn:count()ȱundȱfn:sum()ȱleistenȱ dieȱdreiȱweiterenȱAggregatsfunktionenȱfn:min(),ȱfn:max()ȱundȱfn:avg()ȱhäufigȱbenöȬ tigteȱwertvolleȱDienste.ȱSieȱwerdenȱgenauȱsoȱeingesetztȱwieȱdieȱFunktionȱfn:sum().ȱ Dasȱ heißt,ȱ dassȱ sieȱ oftȱ dieȱ numerischenȱ Einträgeȱ inȱ Sequenzenȱ auswerten.ȱ Dieȱ
246ȱ
6.6ȱȱFLWORȬAusdruckȱ beidenȱFunktionenȱfn:min()ȱundȱfn:max()ȱkönnenȱauchȱaufȱnichtnumerischeȱDatenȱ angewendetȱwerden.ȱ ImȱfolgendenȱProgrammȱ134ȱwerdenȱinȱdenȱProgrammzeilenȱ(8)ȱbisȱ(10)ȱdieȱFunkȬ tionenȱ eingesetzt,ȱ umȱ denȱ minimalen,ȱ maximalenȱ undȱ durchschnittlichenȱ RechȬ nungsbetragȱ zuȱ ermitteln.ȱ Ihreȱ inȱ geschweiftenȱ Klammernȱ eingeklammertenȱ ErȬ gebnisseȱ werdenȱsodannȱinȱdenȱZeilenȱ(13),ȱ(16)ȱundȱ(19)ȱimȱstatischenȱ ElementȬ konstruktorȱverwendet.ȱ XQUERY let $Einzelobligo_Sequenz := for $Betragsknoten in db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') /child::Rechnung/child::Betrag let $Einzelobligo_Wert := xs:decimal($Betragsknoten) return $Einzelobligo_Wert let $MinimalBetrag := fn:min($Einzelobligo_Sequenz) let $MaximalBetrag := fn:max($Einzelobligo_Sequenz) let $DurchschnittBetrag := fn:avg($Einzelobligo_Sequenz) return {$MinimalBetrag} {$MaximalBetrag} {$DurchschnittBetrag}
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21)
Programmȱ134:ȱEinsatzȱderȱFunktionenȱfn:min(),ȱfn:max()ȱundȱfn:avg() Ergebnis 2000 13000 6666.666666666666666666666666
6.6.3 Zusammenfassungen in FLWOR-Ausdrücken Oftȱ werdenȱ Dokumenteȱ inȱ Gruppenȱ gruppiertȱ benötigt.ȱ Beispielsweiseȱ könnteȱ eineȱAnwendungȱdieȱRechnungsdatenȱgruppiertȱnachȱKundennummernȱerfordern.ȱ Auchȱ zurȱ Lösungȱ dieserȱ Anforderungȱ könnenȱ geschachtelteȱ FLWORȬAusdrückeȱ sinnvollȱeingesetztȱwerden.ȱ
247ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ Imȱ folgendenȱ Programmȱ 135ȱ werdenȱ dieȱ Rechnungsdokumenteȱ nachȱihrenȱ KunȬ dennummernȱ gruppiertȱ undȱ innerhalbȱ derselbenȱ Kundennummerȱ nachȱ RechȬ nungsnummernȱ sortiertȱ ausgegeben.ȱ Hierzuȱ werdenȱ vonȱ Programmzeileȱ (2)ȱ bisȱ (6)ȱ zunächstȱ alleȱ Kundennummernȱ ausȱ denȱ Dokumentenȱ inȱ derȱ Tabellenspalteȱ Dokumentȱ derȱ Tabelleȱ Rechnung_XMLȱ ausgelesen.ȱ Mitȱ derȱ Funktionȱ fn:distinctȬ values()ȱwerdenȱdieȱhierbeiȱmehrfachȱgelesenenȱKundennummernȱeliminiert.ȱDerȱ äußereȱFLWORȬAusdruckȱvonȱZeileȱ(7)ȱbisȱ(12)ȱwirdȱjeȱgefundenerȱKundennumȬ merȱ durchlaufen.ȱ Inȱ Zeileȱ (8)ȱ bisȱ (10)ȱ werdenȱ alleȱ Rechnungsdokumenteȱ ausȱ derȱ SpalteȱDokumentȱgelesen,ȱdieȱzurȱGruppeȱdesȱKundenȱmitȱderȱaktuellenȱKundenȬ nummerȱgehören.ȱDieȱDokumentknotenȱstehenȱsodannȱinȱderȱSequenzȱzurȱVerfüȬ gung,ȱ welcheȱ anȱ dieȱ Referenzvariableȱ $Rechnungen_des_Kundenȱ gebundenȱ ist.ȱ Inȱ derȱKlauselȱreturnȱinȱZeileȱ(12)ȱstehtȱderȱdirekteȱKonstruktorȱfürȱdasȱXMLȬElementȱ .ȱ Derȱ Inhaltȱ diesesȱ Elementesȱ wirdȱ vomȱ geschachteltenȱ FLWORȬ AusdruckȱinȱZeileȱ(13)ȱbisȱ(17)ȱerzeugt.ȱDerȱFLWORȬAusdruckȱmussȱinȱgeschweifȬ tenȱ Klammernȱ eingeschlossenȱ sein,ȱ damitȱ erȱ ausgewertetȱ undȱ seinȱ Ergebnisȱ alsȱ Inhaltȱ desȱ Elementsȱ ȱ eingestelltȱ wird.ȱ Imȱ Zugeȱ seinerȱ Auswertungȱ werȬ denȱdieȱRechnungenȱdesȱaktuellenȱKundenȱdurchȱdieȱKlauselȱreturnȱinȱZeileȱ(16)ȱ eingefügt.ȱVorȱdemȱEinfügenȱwirdȱnochȱdieȱKlauselȱorderȱbyȱinȱZeileȱ(14)ȱundȱ(15)ȱ ausgeführt.ȱ ȱ XQUERY let $Alle_Kundennummern := fn:distinct-values( db2-fn:xmlcolumn(ƍRECHNUNG_XML.DOKUMENTƍ) /child::Rechnung/child::Kunde_Nr ) for $Kundennummer_der_Gruppe in $Alle_Kundennummern let $Rechnungen_des_Kunden := db2-fn:xmlcolumn(ƍRECHNUNG_XML.DOKUMENTƍ) /child::Rechnung[Kunde_Nr = $Kundennummer_der_Gruppe] order by $Kundennummer_der_Gruppe return {for $Rechnung_aktuell in $Rechnungen_des_Kunden order by $Rechnung_aktuell /child::Rechnung/Rechnung_NR return $Rechnung_aktuell }
Programmȱ135:ȱGruppierenȱderȱRechnungenȱnachȱKundennummern Ergebnis R001 K001 2008-04-04 13000.00
248ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18)
6.6ȱȱFLWORȬAusdruckȱ R002 K001 2008-04-05 2000.00 R003 K002 2008-04-05 5000.00
Ergebnisȱ5ȱ:ȱResultatȱderȱGruppierungȱderȱRechnungenȱnachȱihrenȱKundennummern
Auswertung gruppierter Daten und Gruppenselektion Oftȱ istȱ esȱ erforderlich,ȱ dassȱ Dokumenteȱ nichtȱ nurȱ zuȱ gruppierenȱ sind,ȱ sondernȱ dassȱjedeȱGruppeȱfürȱsichȱauszuwertenȱist.ȱManchmalȱmüssenȱdieȱAuswertungsȬ ergebnisseȱ einerȱ Gruppeȱ nochȱ Bedingungenȱ erfüllen,ȱ damitȱ dieȱ Gruppeȱ inȱ dasȱ Endergebnisȱübernommenȱwerdenȱkann.ȱ Imȱ folgendenȱ Programmȱ 136ȱ werdenȱ jeȱ Rechnungsgruppe,ȱ dieȱ nachȱ identischenȱ Kundennummernȱ gebildetȱ werden,ȱ derenȱ Kundenobligo,ȱ kleinster,ȱ größterȱ undȱ durchschnittlicherȱ Rechnungsbetragȱ gebildet.ȱ Weiterhinȱ mussȱ eineȱ solchermaßenȱ ausgewerteteȱ Gruppeȱ nochȱ dieȱ Bedingungȱ erfüllen,ȱ dassȱ ihrȱ Obligoȱ größerȱ alsȱ 5.000ȱEuroȱbeträgt.ȱErfülltȱsieȱdieseȱBedingungȱnicht,ȱwirdȱsieȱnichtȱinȱdasȱEnderȬ gebnisȱübernommen.ȱ ZurȱErfüllungȱdieserȱAufgabeȱwerdenȱinȱdenȱZeilenȱ(11)ȱbisȱ(15)ȱdieȱRechnungsbeȬ tragsknotenȱ ausȱ denȱ Rechnungsdokumentenȱ entnommenȱ undȱ inȱ Dezimalzahlenȱ konvertiert.ȱ Dieȱ einzelnenȱ Dezimalzahlenȱ werdenȱ alsȱ Einträgeȱ inȱ einerȱ Sequenzȱ gesammeltȱundȱinȱZeileȱ(11)ȱanȱdieȱReferenzvariableȱ$Rechnungsbeträgeȱgebunden.ȱ HierausȱwerdenȱinȱdenȱZeilenȱ(16)ȱbisȱ(19)ȱdieȱgefordertenȱAggregationenȱgebildet.ȱ Inȱ derȱ Zeileȱ (20)ȱ wirdȱ inȱ derȱ Klauselȱ whereȱ geprüft,ȱ obȱ dieȱ aktuelleȱ RechnungsȬ gruppeȱ dasȱ Kriteriumȱ fürȱ ihreȱ Aufnahmeȱ inȱ dasȱ Endergebnisȱ erfüllt.ȱ Mitȱ diesenȱ FormulierungenȱkannȱinȱXQueryȱdasȱgleicheȱerreichtȱwerdenȱwieȱinȱSQL,ȱwennȱinȱ SQLȱdieȱKlauselnȱGROUPȱBYȱundȱHAVINGȱeingesetztȱwerden.ȱ ȱ ȱ ȱ ȱ
249ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ XQUERY let $Alle_Kundennummern := distinct-values( db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') /child::Rechnung/child::Kunde_Nr ) for $Kundennummer_der_Gruppe in $Alle_Kundennummern let $Rechnungen_des_Kunden := db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') /child::Rechnung[Kunde_Nr = $Kundennummer_der_Gruppe] let $Rechnungsbetraeg := for $Rechnungsbetragsknoten in $Rechnungen_des_Kunden//Betrag let $Rechnungsbetrag := xs:decimal($Rechnungsbetragsknoten) return $Rechnungsbetrag let $Kundenobligo := sum($Rechnungsbetraeg) let $Kleinster_Betrag := min($Rechnungsbetraeg) let $Groesster_Betrag := max($Rechnungsbetraeg) let $Durchschnitts_Betrag := avg($Rechnungsbetraeg) where $Kundenobligo > 5000 order by $Kundennummer_der_Gruppe return {for $Rechnung_aktuell in $Rechnungen_des_Kunden order by $Rechnung_aktuell /child::Rechnung/Rechnung_NR return $Rechnung_aktuell }
Programmȱ136:ȱAuswertungȱderȱRechnungsgruppenȱeinesȱjedenȱKunden
250ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33)
6.6ȱȱFLWORȬAusdruckȱ Ergebnis R001 K001 2008-04-04 13000.00 R002 K001 2008-04-05 2000.00
Ergebnisȱ6:ȱResultatȱderȱgruppiertenȱAuswertung
6.6.4 Verbunde in FLWOR-Ausdrücken Dieȱ ausȱ derȱ relationalenȱ Datenbanktechnikȱ geläufigenȱ Verbundartenȱ könnenȱȱ ebenfallsȱ mitȱ FLWORȬAusdrückenȱ verwirklichtȱ werden.ȱ Hierbeiȱ werdenȱ Datenȱ einesȱDokumentsȱmitȱDatenȱeinesȱoderȱmehrerȱandererȱDokumenteȱzusammengeȬ führt.ȱInȱdenȱfolgendenȱAusführungenȱwerdenȱderȱinnereȱGleichheitsverbundȱundȱ derȱ einseitigȱ äußereȱ Gleichheitsverbundȱ dargestellt.ȱ Fürȱ weiterführendeȱ TechniȬ kenȱkannȱ[LS04]ȱempfohlenȱwerden.ȱ
Innerer Gleichheitsverbund Imȱ RahmenȱeinesȱinnerenȱGleichheitsverbundesȱwirdȱeinȱbetrachtetesȱDokumentȱ mitȱ einemȱ oderȱ mehrerenȱ anderenȱ Dokumentenȱ zusammengeführt.ȱ Dieȱ VerȬ bindungȱ erfolgtȱ aufgrundȱ desȱ Vorhandenseinsȱ einesȱ inȱ allenȱ Beteiligtenȱ vorhanȬ denenȱ Verbindungsdatums.ȱ Imȱ hierȱ behandeltenȱ Beispielȱ sollenȱ dieȱ KundendoȬ kumenteȱ mitȱ ihrenȱ Rechnungsdokumentenȱ verbundenȱ werden.ȱ Dasȱ VerbinȬ dungsdatumȱistȱderȱgemeinsameȱKundennummernwertȱbeiȱallenȱBeteiligten.ȱȱ Dieȱ Kundendokumenteȱ sindȱ inȱ Abbildungȱ 61ȱ undȱ dieȱ Rechnungsdokumenteȱ inȱ Abbildungȱ 63ȱ dargestellt.ȱ Dasȱ Verbunddokumentȱ istȱ inȱ folgenderȱ Abbildungȱ 64ȱ zuȱsehen.ȱ ȱ ȱ ȱ ȱ
251ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ
Der Verbund erfolgt aufgrund des selben Kundennummernwertes in allen Dokumenten.
ȱ ȱ
«Element» Kunde_ mit_ Rechnungen
ȱ ȱ ȱ
1
ȱ ȱ
1
«Attribut» Kunde_Nr
«Element» Kunde
1 1
ȱ 1
ȱ
«Wert» K001 «Element» Anrede «Element» Name
ȱ
1 1
ȱ ȱ
1
«Element» Alle_Rechnungen
«Element» R001:Rechnung
«Element» Vorname
1
«Element» Zuname
1
ȱ ȱ ȱ
1
«Element» Rechnung_Nr
«Wert» Hugo
1
«Wert» Mueller
1
1
«Wert» R001
1
«Element» Kunde_Nr
1
«Element» Datum
1
«Wert» 2008-04-04
1
«Element» Betrag
1
«Wert» 13000.00
«Element» Rechnung_Nr
1
«Wert» R002
ȱ ȱ
«Wert» Mueller, Hugo
1
ȱ ȱ
«Wert» Herr
1
«Wert» K001
ȱ «Element» R002:Rechnung
ȱ ȱ ȱ ȱ ȱ ȱ
1
1 1
«Element» Kunde_Nr «Element» Datum
1
«Wert» 2008-04-05
1
«Element» Betrag
1
«Wert» 2000.00
Abbildungȱ64:ȱVerbunddokumentȱKundeȱK001ȱmitȱseinenȱRechnungenȱ
252ȱ
«Wert» K001
1
ȱ
ȱ
1
ȱ
6.6ȱȱFLWORȬAusdruckȱ DasȱfolgendeȱProgrammȱ137ȱgeneriertȱdasȱbauplankonformeȱXMLȬDokument.ȱDasȱ ProgrammȱbestehtȱausȱdenȱdreiȱTeilenȱȱ – DatenȱausȱderȱDatenbankȱlesenȱ – innerenȱGleichheitsverbundȱdurchführenȱ – hierarchischȱstrukturiertesȱErgebnisdokumentȱausgeben.ȱ DieȱDatenȱausȱderȱDatenbankȱwerdenȱvonȱProgrammzeileȱ(2)ȱbisȱ(5)ȱgelesen.ȱIhreȱ Eingabesequenzenȱ werdenȱ hierbeiȱ vonȱ denȱ beidenȱ Referenzvariablenȱ $AlȬ le_Kundenȱundȱ$Alle_Rechnungenȱreferenziert.ȱ Derȱ Gleichheitsverbundȱ erfolgtȱ vonȱ Zeileȱ (6)ȱ bisȱ (16).ȱ Derȱ äußereȱ FLWORȬ Ausdruckȱ machtȱ inȱ Zeileȱ (7)ȱ denȱ aktuellenȱ Kundenknotenȱ verfügbar.ȱ Derȱ innereȱ FLWORȬAusdruckȱ wirdȱ sodannȱ jeȱ Eintragȱ derȱ Sequenzȱ $Alle_Rechnungenȱ durchȬ laufen.ȱ Inȱ derȱ Klauselȱ whereȱ vonȱ Zeileȱ (9)ȱ bisȱ (12)ȱ wirdȱ geprüft,ȱ obȱ dieȱ KundenȬ nummerȱdesȱaktuellenȱKundeneintragsȱidentischȱistȱmitȱderȱKundennummerȱdesȱ aktuellenȱ Rechnungseintrags.ȱ Hierbeiȱ erfolgtȱ eineȱ impliziteȱ Atomisierungȱ derȱ Kundennummernwerte.ȱInȱZeileȱ(13)ȱbisȱ(15)ȱwerdenȱdieȱVerbundergebnisseȱnochȱ aufȱ denȱ Kundenȱ mitȱ derȱ Kundennummerȱ K001ȱ eingeschränkt.ȱ Inȱ Zeileȱ (16)ȱ werȬ denȱschließlichȱinȱderȱKlauselȱreturnȱdieȱbeidenȱzusammengehörigenȱKundenȬȱundȱ Rechnungseinträge,ȱalsoȱdasȱVerbundergebnisȱinȱdieȱErgebnissequenzȱeingestellt.ȱ DieseȱwirdȱinȱderȱZeileȱ(6)ȱanȱdieȱReferenzvariableȱ$Kunde_und_seine_Rechnungenȱ gebunden.ȱ DieȱeinzelnenȱVerbundeȱvonȱKundenȬȱundȱRechnungsknotenȱsindȱjetztȱnochȱnachȱ denȱVergabenȱdesȱDokumentbauplansȱinȱAbbildungȱ64ȱinȱeinemȱhierarchischȱorȬ ganisiertenȱXMLȬDokumentȱzusammenzuführenȱundȱauszugeben.ȱDiesȱgeschiehtȱ abȱ Programmzeileȱ (17)ȱ bisȱ (38).ȱ Inȱ derȱ Zeileȱ (17)ȱ undȱ (18)ȱ werdenȱ ausȱ demȱ VerȬ bundergebnisȱ zunächstȱ dieȱ Kundenknotenȱ herausgefiltert.ȱ Daȱ hierbeiȱ keineȱ UnȬ terdrückungȱ identischerȱ Knotenȱ erfolgt,ȱ wirdȱ inȱ derȱ Zuweisungȱ inȱ Zeileȱ (19)ȱ dieȱ EliminierungȱderȱDuplikateȱbewirkt.ȱ InȱdenȱstatischenȱKonstruktorȱ,ȱderȱabȱZeileȱ(21)ȱbeginntȱ undȱ dasȱ Wurzelelementȱ desȱ Ergebnisdokumentsȱ generiert,ȱ wirdȱ derȱ äußereȱ FLWORȬAusdruckȱ inȱ geschweiftenȱ Klammernȱ eingefügt.ȱ Dieserȱ gibtȱ inȱ seinerȱ KlauselȱreturnȱvonȱZeileȱ(24)ȱbisȱ(36)ȱeineȱSequenzȱzurück,ȱdieȱausȱdemȱaktuellenȱ Kundenknotenȱ undȱ allenȱ Rechnungsknotenȱ besteht,ȱ dieȱ mitȱ diesemȱ KundenknoȬ tenȱ inȱ Verbindungȱ stehen.ȱ Dieseȱ Rechnungsknotenȱ werdenȱ imȱ innerenȱ FLWORȬ AusdruckȱausȱderȱVerbundsequenzȱentnommen.ȱInȱderȱKlauselȱwhereȱinȱZeileȱ(29)ȱ bisȱ (32)ȱ werdenȱ diejenigenȱ Rechnungsknotenȱ herausgefiltert,ȱ dieȱ zumȱ aktuellenȱ Kundenȱgehören.ȱMitȱderȱKlauselȱreturnȱinȱZeileȱ(33)ȱwerdenȱdieseȱKundenknotenȱ inȱ dieȱ temporäreȱ Ergebnissequenzȱ eingefügt,ȱ derenȱ Rechnungsknotenȱ sodannȱ demȱstatischenȱKonstruktorȱȱinȱZeileȱ(25)ȱuntergeordnetȱwerden.ȱ ȱ ȱ
253ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ XQUERY let $Alle_Kunden := db2-fn:xmlcolumn('KUNDE_XML.DOKUMENT') let $Alle_Rechnungen := db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') let $Kunde_und_seine_Rechnungen := for $Kunde in $Alle_Kunden for $Rechnung in $Alle_Rechnungen where $Kunde/child::Kunde /attribute::Kunde_Nr = $Rechnung /child::Rechnung/child::Kunde_Nr and $Kunde/child::Kunde /attribute::Kunde_Nr = 'K001' return ($Kunde, $Rechnung) let $Kunden := $Kunde_und_seine_Rechnungen /child::Kunde let $Kunden_einmalig := $Kunden return {for $Kunde_einmalig in $Kunden_einmalig return ($Kunde_einmalig, {for $Rechnung_des_Kunden in $Kunde_und_seine_Rechnungen /child::Rechnung where $Kunde_einmalig /attribute::Kunde_Nr = $Rechnung_des_Kunden /child::Kunde_Nr return $Rechnung_des_Kunden } ) }
Programmȱ137:ȱInnererȱGleichheitsverbundȱundȱhierarchischeȱAusgabeȱ Herr Mueller, Hugo Hugo Mueller R001 K001 2008-04-04 13000.00
254ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38)
6.6ȱȱFLWORȬAusdruckȱ R002 K001 2008-04-05 2000.00
Ergebnisȱ7:ȱErgebnisȱdesȱinnerenȱVerbundesȱundȱhierarchischeȱAusgabe
Einseitig äußerer Gleichheitsverbund Beimȱ einseitigȱ äußerenȱ Gleichheitsverbundȱ (engl.ȱ outerȱ join)ȱ werdenȱ dieȱ DokuȬ menteȱ derȱ einenȱ Artȱ vollständigȱ inȱ dasȱ Verbundergebnisȱ übernommen.ȱ Vonȱdenȱ Dokumentenȱ derȱ anderenȱ Artȱ werdenȱ nurȱ diejenigenȱ mitȱ übernommen,ȱ dieȱ mitȱ denȱersterenȱimȱRahmenȱeinesȱGleichheitsverbundesȱverbundenȱsind.ȱ Imȱ folgendenȱ Beispiel,ȱ dasȱ inȱ Abbildungȱ 65ȱ inȱ derȱ Spracheȱ UMLȱ dargestelltȱ ist,ȱ werdenȱalleȱKundenȱinȱdasȱErgebnisȱeingebaut.ȱVonȱdenȱRechnungenȱwerdenȱnurȱ dieȱübernommen,ȱdieȱmitȱdemȱjeweiligenȱKundenȱinȱBeziehungȱstehen.ȱSieȱerfülȬ lenȱ dabeiȱ auchȱ dieȱ Bedingungenȱ desȱ innerenȱ Gleichheitsverbundes.ȱ Daȱ dieȱ MulȬ tiplizitätȱvonȱRechnungȱinȱRichtungȱKundeȱgleichȱeinsȱist,ȱwerdenȱalleȱRechnungenȱ imȱErgebnisȱerscheinen.ȱDamitȱdasȱErgebnisdokumentȱnichtȱzuȱgroßȱwird,ȱwerdenȱ nurȱeinȱTeilȱderȱDaten,ȱdieȱKundenȬȱundȱRechnungsnummern,ȱinȱihmȱdargestellt.ȱȱ Bemerkenswertȱ ist,ȱ dassȱ dieȱ Kundinȱ EvaȱSchulzeȱ mitȱ ihrerȱ Kundennummerȱ K003ȱ imȱDokumentȱerscheint,ȱobwohlȱsieȱkeineȱRechnungȱerhaltenȱhat.ȱDiesȱmachtȱauchȱ denȱ wesentlichenȱ Unterschiedȱ zwischenȱ demȱ innerenȱ undȱ demȱ äußerenȱ GleichȬ heitsverbundȱ aus.ȱ Beimȱ innerenȱ Gleichheitsverbundȱwürdenȱihreȱ Datenȱ nichtȱimȱ Ergebnisȱvorhandenȱsein.ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
255ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ ȱ
Kunden_ohne_und_mit_Rechnungen
ȱ ȱ ȱ
1
ȱ ȱ
1
«Attribut» Kunde_Nr
«Element» Kunde
1
1
«Wert» K001 «Element» Alle_Rechnungen
ȱ ȱ
1
«Element» Rechnung_Nr
1
«Element» Rechnung_Nr
ȱ ȱ ȱ 1
ȱ ȱ 1
ȱ
«Attribut» Kunde_Nr
«Element» Kunde
1
1
ȱ ȱ
1
ȱ ȱ 1
ȱ
«Attribut» Kunde_Nr
1
1
«Wert» R001 «Wert» R002
«Wert» K002 «Element» Alle_Rechnungen
1
ȱ
1
«Element» Rechnung_Nr
1
«Wert» R003
«Wert» K003
«Element» Kunde
ȱ
Abbildungȱ65:ȱEinseitigȱäußeresȱVerbundergebnisȱinȱUMLȱ
Inȱ Programmȱ 138ȱ wirdȱ derȱ äußereȱ Gleichheitsverbundȱ implementiertȱ undȱ dasȱ BeispieldokumentȱinȱAbbildungȱ65ȱgeneriert.ȱAuchȱdiesesȱProgrammȱbestehtȱausȱ denȱdreiȱTeilenȱȱ – DatenȱausȱderȱDatenbankȱlesenȱ – innerenȱGleichheitsverbundȱdurchführenȱ – hierarchischȱstrukturiertesȱErgebnisdokumentȱausgeben.ȱ Dieȱ Ausgabeȱ desȱ Ergebnisdokumentesȱ istȱ jedochȱ etwasȱ komplizierterȱ alsȱ beimȱ innerenȱ Gleichheitsverbund.ȱ Zumȱ einenȱ müssenȱ alleȱ Kundendatenȱ ausgegebenȱ werden.ȱHierbeiȱistȱzuȱunterscheiden,ȱobȱderȱjeweiligeȱKundeȱRechnungenȱerhalȬ tenȱhatȱoderȱnicht.ȱDieȱUnterscheidungȱwirdȱmitȱderȱAlternativeȱinȱProgrammzeileȱ (26)ȱ bisȱ (32)ȱ getroffen.ȱ Wennȱ dieȱ Kundennummerȱ desȱ aktuellenȱ Kundenȱ auchȱ inȱ derȱErgebnissequenzȱdesȱinnerenȱGleichheitsverbundesȱgefundenȱwird,ȱsoȱwerdenȱ auchȱ dieȱ Rechnungenȱ desȱ aktuellenȱ Kundenȱ ausgegeben.ȱ Diesȱ geschiehtȱ inȱ denȱ
256ȱ
6.6ȱȱFLWORȬAusdruckȱ Zeilenȱ (33)ȱ bisȱ (45).ȱ Inȱ denȱ Zeilenȱ (23)ȱ bisȱ (25)ȱ wurdenȱ vorherȱ dieȱ gewünschtenȱ Kundendatenȱ ausgegeben.ȱ Inȱ derȱ Klauselȱ elseȱ inȱ denȱ Zeilenȱ (46)ȱ undȱ (47)ȱ mussȱ nochȱdieȱleereȱSequenzȱ()ȱausgegebenȱwerden,ȱdamitȱderȱsyntaktischenȱAnfordeȬ rungenȱdesȱAlternativausdrucksȱGenügeȱgetanȱist.ȱ XQUERY let $Alle_Kunden := db2-fn:xmlcolumn('KUNDE_XML.DOKUMENT') let $Alle_Rechnungen := db2-fn:xmlcolumn('RECHNUNG_XML.DOKUMENT') let $Kunde_und_seine_Rechnungen := for $Kunde in $Alle_Kunden for $Rechnung in $Alle_Rechnungen where $Kunde/child::Kunde /attribute::Kunde_Nr = $Rechnung /child::Rechnung/child::Kunde_Nr return ($Kunde, $Rechnung) let $Kunden := $Kunde_und_seine_Rechnungen /child::Kunde let $Kunden_einmalig := $Kunden return {for $Kunde_aktuell in $Alle_Kunden order by $Kunde_aktuell/Kunde /attribute::Kunde_Nr return ( {$Kunde_aktuell/Kunde/@ Kunde_Nr} , if ($Kunde_aktuell/Kunde /@ Kunde_Nr = $Kunde_und_seine_Rechnungen/Rechnung /Kunde_Nr ) then ( {for $Rechnung_des_Kunden in $Kunde_und_seine_Rechnungen /child::Rechnung where $Kunde_aktuell/Kunde /attribute::Kunde_Nr = $Rechnung_des_Kunden /child::Kunde_Nr return $Rechnung_des_Kunden /Rechnung_Nr } ) else () ) }
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50)
Programmȱ138:ȱEinseitigȱäußererȱVerbund
257ȱ
6ȱȱXMLȬDatenȱmanipulierenȱ–ȱXQueryȱ R001 R002 R003
Ergebnisȱ8:ȱErgebnisȱdesȱeinseitigȱäußerenȱGleichheitsverbundesȱundȱhierarchischeȱ Ausgabe
6.6.5 Übungen 1) Erfassenȱ Sieȱ inȱ derȱ Sequenzȱ $Worteȱ mehrereȱ Worteȱ undȱ gebenȱ Sieȱ dieseȱ inȱ aufsteigenderȱSortierfolgeȱaus.ȱȱ 2) Erfassenȱ Sieȱ inȱ derȱ Sequenzȱ $Worteȱ mehrereȱ Worteȱ undȱ gebenȱ Sieȱ dieseȱ inȱ absteigenderȱSortierfolgeȱaus.ȱȱ 3) ErfassenȱSieȱinȱderȱSequenzȱ$WorteȱmehrereȱWorte.ȱGebenȱSieȱnurȱdiejenigenȱ Worteȱ aus,ȱ derenȱ Anfangsbuchstabenȱ imȱ Wertebereichȱ zwischenȱ ȇaȇȱ undȱ ȇmȇȱ liegen.ȱȱ 4) Erfassenȱ Sieȱ inȱ zweiȱ Sequenzenȱ einigeȱ Datenȱ undȱ gebenȱ Sieȱ dieseȱ Datenȱ inȱ einemȱgeschachteltenȱFLWORȬAusdruckȱaus.ȱ 5) Entwickelnȱ Sieȱ inȱ einerȱ Folgeȱ vonȱ letȬKlauselnȱ inȱ einemȱ FLWORȬAusdruckȱ Schrittȱ fürȱSchrittȱ dieȱ Berechnungȱ vonȱ Zinsen.ȱ Inȱ einemȱ arithmetischenȱ AusȬ druckȱdarfȱnurȱeinȱOperatorȱvorkommen.ȱ 6) ErfassenȱSieȱdieȱDatenȱderȱTabelleȱArtikelȱalsȱXMLȬDokumenteȱinȱeinerȱneuenȱ TabelleȱArtikel_XML.ȱJeȱArtikelȱbildenȱSieȱeinenȱXDMȬBaumȱinȱderȱSpalteȱDoȬ kument.ȱGebenȱSieȱdieȱArtikeldatenȱmitȱSQLȱundȱmitȱXQueryȱaus.ȱ 7) GebenȱSieȱdieȱArtikeldatenȱinȱaufsteigenderȱSortierfolgeȱnachȱNamenȱsortiertȱ mitȱXQueryȱaus.ȱ 8) GebenȱSieȱdieȱArtikeldatenȱinȱabsteigenderȱSortierfolgeȱderȱArtikelpreiseȱaus.ȱ 9) GebenȱSieȱdieȱArtikeldatenȱinȱaufsteigenderȱSortierfolgeȱderȱArtikelpreiseȱaus.ȱ NurȱArtikelȱmitȱPreisenȱüberȱ1.000ȱEuroȱdürfenȱausgegebenȱwerden.ȱ 10) ErmittelnȱSieȱdieȱAnzahlȱderȱArtikelȱmitȱXQuery.ȱ
258ȱ
6.6ȱȱFLWORȬAusdruckȱ 11) ErmittelnȱSieȱfolgendeȱWerte:ȱ –ȱSummeȱallerȱArtikelpreiseȱ –ȱkleinsterȱArtikelpreisȱ –ȱgrößterȱArtikelpreisȱ –ȱdurchschnittlicherȱArtikelpreis.ȱ 12) ErfassenȱSieȱdieȱPositionsdatenȱalsȱXMLȬDokumenteȱinȱderȱSpalteȱPositionȱderȱ TabelleȱPosition_XML.ȱVerbindenȱSieȱdieȱArtikeldatenȱmitȱdenȱPositionsdatenȱ inȱeinemȱinnerenȱVerbund.ȱ 13) VerbindenȱSieȱdieȱArtikeldatenȱmitȱdenȱPositionsdatenȱinȱeinemȱäußerenȱVerȬ bund.ȱ 14) Gruppierenȱ Sieȱ dieȱ Positionsdatenȱ nachȱ Artikelnummernȱ undȱ berechnenȱ Sieȱ hierbeiȱdenȱGesamtumsatzȱeinesȱjeweiligenȱArtikels.ȱ 15) GruppierenȱSieȱdieȱPositionsdatenȱnachȱRechnungsnummern.ȱ ȱ ȱ
259ȱ
7 XML-Daten in relationale Daten zerlegen InȱdiesemȱKapitelȱlernenȱSie,ȱ – wieȱhierarchischeȱDatenȱausȱXMLȬDokumentenȱinȱrelationaleȱDatenȱumgeȬ wandeltȱwerdenȱ – wieȱausȱXMLȬDokumentenȱDatenȱinȱrelationalenȱTabellenȱeingefügtȱwerden.ȱ Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ denȱ Publikationsprozessȱ umkehrenȱ undȱXMLȬDokumenteȱinȱrelationaleȱDatenȱzerlegen.ȱ
7.1 Relationale Tabelle aus XML-Dokumenten erstellen SQL/XMLȱbietetȱauchȱeinȱSprachmittelȱan,ȱmitȱdemȱausȱXMLȬDokumentenȱrelatiȬ onaleȱDatenȱgewonnenȱwerdenȱkönnen.ȱDieȱgewonnenenȱDatenȱwerdenȱhierbeiȱinȱ relationalenȱSpaltenȱeinerȱDB2ȬTabelleȱgespeichert.ȱDasȱSprachmittelȱistȱdieȱeingeȬ bauteȱFunktionȱXMLTABLE().ȱSieȱistȱsomitȱdieȱUmkehrfunktionȱderȱPublikationsȬ funktionenȱ vonȱ SQL/XML.ȱ XMLTABLE()ȱ kannȱ nurȱ inȱ derȱ Klauselȱ FROMȱ einesȱ SQLȬSELECTȬBefehlsȱverwendetȱwerden.ȱȱ DasȱZerlegenȱvonȱXMLȬDokumentenȱinȱrelationaleȱDatenȱbezeichnetȱmanȱimȱEngȬ lischenȱauchȱalsȱshreddingȱ(zerteilen).ȱ Dieȱ XMLȬDatenȱ einesȱ XDMȬBaumesȱ werdenȱ inȱ derȱ Funktionȱ XMLTABLE()ȱ mitȱ XQueryȬPfadausdrückenȱ positioniert.ȱ Anschließendȱ werdenȱ sieȱ denȱ Spaltenȱ derȱ Ergebnistabelleȱ zugewiesen.ȱ Dieȱ Datenȱ derȱ Ergebnistabelleȱ könnenȱ sodannȱ mitȱ denȱherkömmlichenȱrelationalenȱSprachmittelnȱvonȱSQLȱverarbeitetȱwerden.ȱ Beispielȱ DieȱXMLȬDatenȱderȱbekanntenȱXMLȬDokumenteȱinȱderȱTabelleȱKunde_XMLȱsollenȱ inȱ dieȱ relationaleȱ TabelleȱTemp_Kundeȱ eingefügtȱ werden.ȱ Anschließendȱ sollenȱsieȱ ausȱ dieserȱ Tabelleȱ mitȱ denȱ üblichenȱ relationalenȱ Sprachmittelnȱ ausgegebenȱ werȬ den.ȱ Inȱ derȱ folgendenȱ Abbildungȱ 66ȱ sindȱ dieȱ beidenȱ Datenmodelle,ȱ dasȱ derȱ XMLȬ DokumenteȱundȱdasȱderȱZieltabelle,ȱinȱderȱSpracheȱUMLȱzuȱsehen.ȱWeiterhinȱsindȱ zurȱ leichtenȱ Orientierungȱ dieȱ dreiȱ XMLȬDokumenteȱ aufȱ derȱ Ausprägungsebeneȱ dargestellt.ȱ ȱ ȱ ȱ ȱ
ȱ261
7ȱȱXMLȬDatenȱinȱrelationaleȱDatenȱzerlegenȱ ȱ
XML-Dokument wird umgewandelt in Tabelle
ȱ ȱ
«Element» Kunde
ȱ ȱ
1
«Element» Vorname
1
«Element» Zuname
+ Kunde_Nr
ȱ
«Tabelle» Temp_Kunde + Kunde_Nr + Vorname + Zuname
ȱ ȱ
Die drei XML-Dokumente
ȱ ȱ
1
«Attribut» Kunde_Nr
1
«Wert» K001
ȱ ȱ
«Element» K001:Kunde
1
«Element» Vorname
1
«Element» Zuname
ȱ ȱ ȱ ȱ ȱ ȱ
1
«Attribut» Kunde_Nr
«Element» K002:Kunde
ȱ
1 1
1
«Wert» Hugo
1
«Wert» Müller
«Element» Vorname
1
«Wert» Georg
«Element» Zuname
1
«Wert» Mayer
«Element» Vorname
1
«Wert» Eva
«Element» Zuname
1
«Wert» Schulze
1
«Wert» K002
ȱ ȱ ȱ ȱ ȱ ȱ ȱ
1
«Attribut» Kunde_Nr
«Element» K003:Kunde
1 1
*
«Wert» K003
ȱ
Abbildungȱ66:ȱModellȱderȱXMLȬDokumenteȱundȱdreiȱExemplareȱsowieȱdasȱrelationalesȱ DatenbankmodellȱinȱGestaltȱderȱTabelleȱTemp_Kundeȱ
262ȱ
7.1ȱȱRelationaleȱTabelleȱausȱXMLȬDokumentenȱerstellenȱ DieȱinȱUMLȱmodelliertenȱXMLȬDokumenteȱwerdenȱinȱProgrammȱ139ȱinȱdieȱSpalteȱ DokumenteȱderȱTabelleȱKunde_XMLȱgeladen.ȱ INSERT INTO Kunde_XML (Kunde_XML_Nr, Dokument) VALUES ('D001', ' Hugo Mueller ' ), ('D002', ' Georg Mayer ' ), ('D003', ' Eva Schulze ' ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30)
Programmȱ139:ȱXMLȬDokumenteȱzumȱanschließendenȱzerlegen
Wieȱ obenȱ bereitsȱ erwähnt,ȱ wirdȱ dieȱ Umsetzungȱ derȱ hierarchischȱ organisiertenȱ DokumentinhalteȱvonȱXMLȬDokumentenȱinȱihreȱrelationaleȱRepräsentationȱdurchȱ dieȱ Anwendungȱ derȱ eingebautenȱ SQLȬFunktionȱ XMLTABLE()ȱ erledigt.ȱ Dieseȱ FunktionȱwirdȱinȱderȱKlauselȱFROMȱdesȱSQLȬBefehlsȱSELECTȱangegeben.ȱIhrȱErȬ gebnisȱistȱeineȱtemporäreȱTabelle,ȱderenȱInhaltȱimȱSELECTȬBefehlȱweiterȱverarbeiȬ tetȱwird.ȱ Dieȱ Syntaxȱ derȱ eingebautenȱ Funktionȱ XMLTABLE()ȱ istȱ inȱ folgenderȱ SyntaxȬ beschreibungȱinȱverkürzterȱFormȱangegeben.ȱ ȱ ȱ ȱ ȱ ȱ
263ȱ
7ȱȱXMLȬDatenȱinȱrelationaleȱDatenȱzerlegenȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
XMLTABLE( XQuery_Referenz_Variable PASSING Verbindung_zwischen_SQL_und_XQuery COLUMNS Datensenke_Datenquelle [, Datensenke_Datenquelle] ... ) Verbindung_zwischen_SQL_und_XQuery: XML_Ausdruck AS XQuery_Referenz_Variable Datensenke_Datenquelle Spaltenname SQL_Datentyp PATH relativer_XQuery_Zugriffspfad
Syntaxȱ32:ȱVerkürzteȱSyntaxȱderȱFunktionȱXMLTABLE()ȱ
InȱProgrammȱ140ȱwirdȱdieȱeingebauteȱFunktionȱXMLTABLE()ȱvonȱProgrammzeileȱ (3)ȱbisȱ(13)ȱangewendet.ȱSieȱerzeugtȱdieȱtemporäreȱTabelleȱTemp_Kunde,ȱsieheȱZeileȱ (13).ȱAlleȱSpaltenȱdieserȱTabelleȱwerdenȱvomȱSQLȬBefehlȱSELECTȱinȱdasȱErgebnisȱ projiziert,ȱsieheȱZeileȱ(1).ȱ Dieȱ inȱ derȱ Syntaxbeschreibungȱ erwähnteȱ XQuery_Referenz_Variableȱ wirdȱ alsȱ ZeiȬ chenkettenliteralȱ inȱ einfachenȱ Hochkommasȱ inȱ Zeileȱ (4)ȱ angegeben.ȱ Sieȱ beginntȱ aufgrundȱderȱVorgabenȱvonȱXQueryȱmitȱeinemȱDollarzeichen.ȱIhrȱNameȱlautetȱimȱ Beispielȱ$Dokument_Ref.ȱȱ Anȱ dieseȱ Referenzvariableȱ wirdȱ dieȱ Sequenzȱ gebunden,ȱ dieȱ beiȱ derȱ Auswertungȱ desȱXML_AusdrucksȱinȱderȱKlauselȱPASSINGȱsichȱergibt.ȱDerȱXML_Ausdruckȱimȱ Beispielȱ istȱ sehrȱ einfachȱ undȱ bestehtȱ imȱ Programmȱ lediglichȱausȱ derȱ Angabeȱderȱ Spalteȱ Dokument,ȱ welcheȱ dieȱ XDMȬWerteȱ enthält,ȱ sieheȱ Zeileȱ (5).ȱ Jeȱ XDMȬWertȱ wirdȱ einȱ Eintragȱ inȱ derȱ Sequenzȱ erzeugt,ȱ derȱ diesenȱ XDMȬWertȱ hierinȱ repräsenȬ tiert.ȱAufȱdieȱKlauselȱASȱinȱZeileȱ(5)ȱfolgtȱdieȱAngabeȱderȱReferenzvariablenȱvonȱ XQuery,ȱanȱwelcheȱdieȱSequenzȱgebundenȱwird.ȱDerȱNameȱderȱReferenzvariablenȱ mussȱ hierȱ inȱ Gänsefüßenȱ stehenȱ undȱ darfȱ nochȱ nichtȱ durchȱ dasȱ Dollarzeichenȱ $ȱangeführtȱwerden.ȱImȱBeispielȱlautetȱerȱȈDokument_RefȈ.ȱ Inȱ derȱ folgendenȱ Klauselȱ COLUMNSȱ folgtȱ eineȱ Listeȱ vonȱ Spaltennamenȱ derȱ zuȱ erstellendenȱ temporärenȱ SQLȬTabelleȱ undȱ derȱ Angabeȱ desȱ SQLȬDatentypsȱ derȱ jeweiligenȱSpalte.ȱDieȱaufgeführteȱSpalteȱistȱdieȱDatensenkeȱdesȱskalarenȱWertes,ȱ derȱ aufgrundȱ derȱ Angabeȱ desȱ aufȱ dieȱ Klauselȱ PATHȱ folgendenȱ XQueryȬ Pfadausdrucksȱ imȱ aktuellenȱ XDMȬWertȱ gefundenȱ wird.ȱ Derȱ XQueryȬAusdruckȱ beschreibtȱdieȱDatenquelle.ȱDieȱdreiȱAngabenȱderȱDatensenkenȱundȱDatenquellen,ȱ welcheȱaufȱdieȱKlauselȱCOLUMNSȱfolgen,ȱsindȱinȱdenȱProgrammzeilenȱ(7)ȱbisȱ(12)ȱ dargestellt.ȱ ȱ ȱ ȱ
264ȱ
7.2ȱȱDasȱSQLȬPrädikatȱXMLEXISTSȱ SELECT Temp_Kunde.* FROM Kunde_XML, XMLTABLE( '$Dokument_Ref' PASSING Dokument AS "Dokument_Ref" COLUMNS Kunde_Nr CHAR ( 4) PATH '/child::Kunde/attribute::Kunde_Nr', Vorname CHAR (15) PATH '/child::Kunde/Name/child::Vorname', Zuname CHAR (15) PATH '/child::Kunde/Name/child::Zuname' ) AS Temp_Kunde ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ140:ȱDokumenteȱinȱTabellenzeilenȱzerlegen Ergebnis KUNDE_NR VORNAME ZUNAME –––––––– ––––––––––––––– ––––––––––––––– K001 Hugo Mueller K002 Georg Mayer K003 Eva Schulze
7.2 Das SQL-Prädikat XMLEXISTS Mitȱ demȱ Prädikatȱ XMLEXISTS()ȱkannȱ inȱ einemȱ SQLȬProgrammȱgeprüftȱ werden,ȱ obȱ inȱ einemȱ XDMȬBaumȱ einȱ fraglicherȱ Wertȱ vorhandenȱ ist.ȱ Nachȱ diesemȱ Wertȱ wirdȱ imȱ aktuellenȱ XDMȬBaumȱ mitȱ Hilfeȱ einesȱ absolutenȱ XQueryȬPfadausdrucksȱ gesucht.ȱ Dasȱ Prädikatȱ testetȱ zumȱ Schluss,ȱ obȱ dieȱ Ergebnissequenzȱ desȱ PfadausȬ drucksȱleerȱoderȱnichtleerȱist.ȱIstȱdieȱSequenzȱleer,ȱsoȱistȱdasȱPrädikatȱfalschȱ(false),ȱ ansonstenȱ istȱ esȱ wahrȱ (true).ȱ Einȱ Wertȱ falschȱ oderȱ wahrȱ inȱ derȱ Sequenzȱ istȱ fürȱ XMLEXISTS()ȱauchȱeinȱsignifikanterȱWertȱundȱführtȱzumȱPrädikatsergebnisȱwahr.ȱ Sollȱ dasȱ Prädikatȱ denȱ Wahrheitswertȱ falschȱ ergeben,ȱ mussȱ dasȱ Ergebnisȱ desȱ XQueryȬPfadausdrucksȱdieȱleereȱSequenzȱsein.ȱ DieȱSyntaxȱdesȱSQLȬPrädikatsȱXMLEXITS()ȱistȱinȱfolgenderȱSyntaxbeschreibungȱinȱ verkürzterȱFormȱangegeben.ȱ
265ȱ
7ȱȱXMLȬDatenȱinȱrelationaleȱDatenȱzerlegenȱ ȱ ȱ ȱ ȱ ȱ
XMLEXISTS( absoluter XQuery Pfadausdruck PASSING Verbindung zwischen SQL und XQuery ) Verbindung zwischen SQL und XQuery: XML_Ausdruck AS XQuery_Referenz_Variable
Syntaxȱ33:ȱVerkürzteȱSyntaxȱderȱFunktionȱXMLEXISTS()ȱ
DerȱabsoluteȱPfadausdruckȱwirdȱinȱderȱSpracheȱXQueryȱverfasstȱundȱmussȱalsȱeinȱ Zeichenkettenliteralȱ vonȱ SQLȱ geschriebenȱ werden.ȱ Dasȱ bedeutet,ȱ dassȱ derȱ PfadȬ ausdruckȱ inȱeinfachenȱHochkommasȱ einzuschließenȱ ist.ȱ Derȱ XMLȬAusdruck,ȱ derȱ aufȱdieȱKlauselȱPASSINGȱfolgt,ȱistȱimȱNormalfallȱderȱNameȱeinerȱSQLȬSpalte,ȱdeȬ renȱWerteȱvomȱDatentypȱXMLȱist.ȱDieȱWerteȱsindȱsomitȱXMLȬDokumenteȱinȱihrerȱ internenȱ Formȱ inȱ Gestaltȱ vonȱ XDMȬBäumen.ȱ Derȱ Nameȱ derȱ XQueryȬReferenzȬ variablenȱ mussȱ inȱ Gänsefüßenȱ eingeschlossenȱ sein.ȱ Erȱ darfȱ nichtȱ mitȱ einemȱ DolȬ larzeichenȱ$ȱbeginnen.ȱ DasȱfolgendeȱProgrammȱ141ȱprüft,ȱobȱeinȱXMLȬElementȱderȱArtȱKundeȱimȱaktuelȬ lenȱXMLȬDokumentȱderȱSpalteȱDokumentȱexistiert,ȱdessenȱAttributwertȱimȱAttributȱ Kunde_Nrȱ denȱ Wertȱ K001ȱ aufweist.ȱ Dieȱ Prüfungȱ erfolgtȱ imȱ absolutenȱ XQueryȬ PfadausdruckȱvonȱProgrammzeileȱ(4)ȱbisȱ(6).ȱIstȱdasȱXQueryȬPrädikatȱinȱZeileȱ(5)ȱ wahr,ȱd.ȱh.ȱgibtȱesȱdenȱKundennummernwertȱK001,ȱsoȱwirdȱderȱKnotenȱderȱXMLȬ ElementartȱKundeȱinȱdieȱErgebnissequenzȱeingestellt.ȱZumȱSchlussȱwirdȱvomȱSQLȬ PrädikatȱXMLEXISTS()ȱgeprüft,ȱobȱinȱderȱErgebnissequenzȱmindestensȱeinȱEintragȱ steht.ȱ Imȱ gegebenenȱ Falleȱ istȱ dasȱ Prädikatȱ XMLEXISTS()ȱ wahrȱ undȱ dieȱ aktuelleȱ SQLȬZeileȱwirdȱderȱAusgabeȱzugeführt.ȱImȱBeispielȱwirdȱnurȱihrȱPrimärschlüsselȱ Kunde_XML_Nrȱ=ȱD001ȱinȱdasȱErgebnisȱprojiziert.ȱ SELECT Kunde_XML_Nr FROM Kunde_XML WHERE XMLEXISTS ('$Dokument_Ref/child::Kunde [attribute::Kunde_Nr = ''K001''] ' PASSING Dokument AS "Dokument_Ref" ) ;
Programmȱ141:ȱDasȱPrädikatȱXMLEXIST()ȱinȱderȱKlauselȱWHEREȱvonȱSQL
266ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9)
7.2ȱȱDasȱSQLȬPrädikatȱXMLEXISTSȱ Ergebnis KUNDE_XML_NR –––––––––––– D001
DieȱAnwendungȱdesȱSQLȬPrädikatsȱXMLEXISTS()ȱimȱZusammenspielȱmitȱeinemȱ XQueryȬPrädikatȱkannȱschnellȱzuȱeinemȱsemantischenȱFehlerȱführen.ȱWirdȱfälschȬ licherȱ Weiseȱ derȱ Wahrheitswertȱ desȱ XQueryȬPrädikats,ȱ derȱ immerȱ entwederȱ trueȱ oderȱ falseȱ ist,ȱ vomȱ XQueryȬPfadausdruckȱ alsȱ Eintragȱ inȱ dessenȱ Ergebnissequenzȱ eingestellt,ȱsoȱistȱdasȱSQLȬPrädikatȱXMLEXISTS()ȱimmerȱwahr,ȱweilȱdieȱErgebnisȬ sequenzȱinȱdiesemȱFallȱniemalsȱleerȱseinȱkann.ȱHiermitȱwirdȱauchȱeineȱSQLȬZeileȱ inȱ dasȱ Ergebnisȱ projiziert,ȱ beiȱ welcherȱ dasȱ XQueryȬPrädikatȱ denȱ Wahrheitswertȱ falschȱ(false)ȱergebenȱhat.ȱ DasȱfolgendeȱProgrammȱ142ȱzeigtȱdieseȱFalle.ȱInȱderȱProgrammzeileȱ(5)ȱwirdȱgeȬ prüft,ȱobȱdasȱAttributȱKunde_NrȱdenȱWertȱK001ȱaufweist.ȱDerȱhierausȱresultierenȬ deȱ Wahrheitswert,ȱ entwederȱ wahrȱ(true)ȱ oderȱ falschȱ(false)ȱ wirdȱ immerȱ inȱ dieȱ ErȬ gebnissequenzȱ eingetragen.ȱ Dieȱ Ergebnissequenzȱ bleibtȱ somitȱ niemalsȱ leer.ȱ DaȬ durchȱ istȱ dasȱ SQLȬPrädikatȱ XMLEXISTS()ȱ immerȱ wahr,ȱ undȱ esȱ findetȱ dieȱ erȬ wünschteȱSelektionȱderȱSQLȬZeilenȱnichtȱstatt.ȱ DerȱGrundȱhierfürȱist,ȱdassȱderȱfehlerhaftȱformulierteȱPfadausdruckȱimmerȱeinenȱ Wahrheitswertȱ zurückgibtȱ undȱ nichtȱ korrekterweiseȱ vonȱ Fallȱ zuȱ Fallȱ denȱ XMLȬ ElementknotenȱderȱArtȱKunde.ȱ SELECT Kunde_XML_Nr FROM Kunde_XML WHERE XMLEXISTS ('$Dokument_Ref/child::Kunde/ attribute::Kunde_Nr = ''K001'' ' PASSING Dokument AS "Dokument_Ref" ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9)
Programmȱ142:ȱSemantischerȱFehlerȱimȱSQLȬPrädikatȱXMLEXISTS() Ergebnis KUNDE_XML_NR –––––––––––– D003 D001 D002
267ȱ
7ȱȱXMLȬDatenȱinȱrelationaleȱDatenȱzerlegenȱ
7.3 Übungen 1) EntnehmenȱSieȱausȱdenȱXMLȬDokumentenȱderȱTabelleȱArtikel_XMLȱdieȱArtiȬ keldatenȱ undȱ speichernȱ Sieȱ dieseȱ inȱ derȱ temporärenȱ Tabelleȱ Temp_Artikel.ȱ ProjizierenȱSieȱdieȱDatenȱderȱtemporärenȱTabelleȱinȱdieȱErgebnistabelle.ȱ 2) EntnehmenȱSieȱausȱdenȱXMLȬDokumentenȱderȱTabelleȱPosition_XMLȱdieȱPoȬ sitionsdatenȱundȱspeichernȱSieȱdieseȱinȱderȱtemporärenȱTabelleȱTemp_Position.ȱ ProjizierenȱSieȱdieȱDatenȱderȱtemporärenȱTabelleȱinȱdieȱErgebnistabelle.ȱ 3) Entnehmenȱ Sieȱ ausȱ denȱ XMLȬDokumentenȱ derȱ Tabelleȱ Rechnung_XMLȱ dieȱ Rechnungsdatenȱ undȱ speichernȱ Sieȱ dieseȱ inȱ derȱ temporärenȱ Tabelleȱ Temp_Rechnung.ȱProjizierenȱSieȱdieȱDatenȱderȱtemporärenȱTabelleȱinȱdieȱErȬ gebnistabelle.ȱ 4) EntnehmenȱSieȱausȱderȱSpalteȱDokumentȱderȱTabelleȱArtikel_XMLȱdieȱArtikelȬ daten,ȱfallsȱihrȱPreisȱgrößerȱoderȱgleichȱ3.000ȱEuroȱist.ȱ 5) EntnehmenȱSieȱausȱderȱSpalteȱDokumentȱderȱTabelleȱPosition_XMLȱdieȱPositiȬ onsdaten,ȱfallsȱihreȱRechnungsnummerȱgleichȱK001ȱist.ȱ ȱ
268ȱ
8 XML-Daten manipulieren – DML von XQuery InȱdiesemȱKapitelȱlernenȱSie,ȱ
dassȱXQueryȱeineȱDatenmanipulationsspracheȱistȱ wieȱDatenȱinȱeinenȱXDMȬBaumȱeingefügtȱwerdenȱ wieȱDatenȱinȱeinemȱXDMȬBaumȱgelöschtȱwerdenȱ wieȱDatenȱinȱeinemȱXDMȬBaumȱverändertȱwerdenȱundȱ wieȱ einȱ manipulierterȱ XDMȬBaumȱ inȱ dieȱ Datenbankȱ zurückgespeichertȱ wird.ȱ
Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ sodannȱ auchȱ Datenȱ inȱ einemȱ XDMȬ BaumȱmanipulierenȱundȱdieȱDatenbankȱhiermitȱaktualisieren.ȱ XQueryȱistȱeineȱDatenmanipulationsspracheȱ[W3C08]ȱ(engl.ȱDML,ȱDataȱManipulaȬ tionȱ Language).ȱ Abȱ derȱVersionȱ 9.5ȱ beherrschtȱ auchȱ XQueryȱ vonȱ DB2ȱdieȱFähigȬ keit,ȱ Datenȱ inȱ XDMȬBäumenȱ zuȱ manipulieren.ȱ Hiermitȱ istȱ seineȱ ursprünglicheȱ Fähigkeit,ȱDatenȱausȱXDMȬBäumenȱnurȱzuȱlesenȱbzw.ȱanzuzeigen,ȱumȱdieȱPflegeȱ dieserȱDatenȱinȱdenȱXDMȬBäumenȱerweitertȱworden.ȱDieȱManipulationenȱumfasȬ senȱfolgendeȱgrundsätzlichenȱOperationen:ȱ
KnotenȱinȱeinenȱXDMȬBaumȱeinfügenȱ KnotenȱausȱeinemȱXDMȬBaumȱlöschenȱ KnotenȱinȱeinemȱXDMȬBaumȱersetzenȱ KnotenȱinȱeinemȱXDMȬBaumȱumbenennen.ȱ
DieȱDatenmanipulationȱerfolgtȱinȱeinemȱUmsetzungsausdruck,ȱderȱdurchȱdasȱoptioȬ naleȱ Schlüsselwortȱ transformȱ eingeleitetȱ wird.ȱ Hierbeiȱ wirdȱ zunächstȱ eineȱ Kopieȱ einesȱ zuȱ veränderndenȱ XDMȬBaumesȱ mitȱ Hilfeȱ derȱ Klauselȱ copyȱ erzeugt.ȱ Inȱ derȱ folgendenȱKlauselȱmodifyȱwirdȱinȱeinemȱoderȱmehrerenȱÄnderungsausdrückenȱdieȱ ManipulationȱinȱderȱXDMȬBaumȬKopieȱvollzogen.ȱInȱderȱabschließendenȱKlauselȱ returnȱwirdȱderȱmanipulierteȱXDMȬBaumȱalsȱErgebnisȱdesȱUmsetzungsausdrucksȱ zurȱVerfügungȱgestellt.ȱ Dieȱ vereinfachteȱSyntaxȱdesȱ UmsetzungsausdrucksȱzeigtȱdieȱSyntaxbeschreibungȱ Syntaxȱ34.ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ269
8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQueryȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
[transform] copy Referenzvariable := XDM-Baum-Quelle modify Aktualisierungsausdrücke return Rückgabeausdruck Aktualisierungsausdrücke: Aktualisierungsausdruck [,Aktualisierungsausdruck] ... Aktualisierungsausdruck für einfügen: do insert Quellausdruck { before | after | into | as first into | as last into } Zielausdruck Aktualisierungsausdruck für löschen: do delete Zielausdruck Aktualisierungsausdruck für ersetzen: do replace [value of] Zielausdruck with Quellausdruck Aktualisierungsausdruck für umbenennen: do rename Zielausdruck as neuer Name
ȱ ȱ Syntaxȱ34:ȱUmsetzungsausdruckȱ
DieȱzahlreichenȱMöglichkeiten,ȱeinenȱXDMȬBaumȱzuȱaktualisieren,ȱwerdenȱinȱdenȱ folgendenȱ Kapitelnȱdetailliertȱdargestellt.ȱHierbeiȱwirdȱ zunächstȱerläutert,ȱwieȱinȱ einemȱ reinenȱ XQueryȬProgrammȱ dieȱ Umsetzungsausdrückeȱ prinzipiellȱ funktioȬ nieren.ȱ Anschließendȱ wirdȱ gezeigt,ȱ wieȱ einȱ solcherȱ XQueryȬAusdruckȱ alsȱ ArguȬ mentȱderȱeingebautenȱSQL/XMLȬFunktionȱXMLQUERY()ȱübergebenȱwird,ȱumȱinȱ einemȱ UPDATEȬBefehlȱ vonȱ SQL/XMLȱ einenȱ gespeichertenȱ XDMȬBaumȱ inȱ einerȱ XMLȬSpalteȱdurchȱeineȱErsetzungȱzuȱverändern.ȱ
8.1 Daten in einen XDM-Baum einfügen Dieȱ prinzipielleȱ Funktionsweiseȱ desȱ Aktualisierungsausdrucksȱ zumȱ Einfügenȱ einesȱneuenȱXMLȬElementknotensȱinȱeinenȱXDMȬBaumȱistȱinȱProgrammȱ143ȱdarȬ gestellt.ȱ Derȱ Umsetzungsausdruckȱ beginntȱ inȱ derȱ Programmzeileȱ (2)ȱ mitȱ demȱ SchlüsselwortȱtransformȱundȱendetȱinȱderȱZeileȱ(13)ȱmitȱderȱKlauselȱreturn.ȱMitȱderȱ Klauselȱ copyȱ inȱ Zeileȱ (3)ȱ wirdȱ zunächstȱ eineȱ Sequenzȱ mitȱ einemȱ Eintragȱ anȱ dieȱ Referenzvariableȱ$Dokument_tempȱgebunden.ȱDerȱEintragȱistȱeineȱKopieȱdesȱXDMȬ Baumes,ȱ derȱ vomȱ berechnetenȱ Konstruktorȱ documentȱ vonȱ Zeileȱ (4)ȱ bisȱ (8)ȱ aufgeȬ bautȱ wird.ȱ Derȱ XDMȬBaumȱ bestehtȱ unterhalbȱ desȱ Dokumentknotensȱ ausȱ demȱ Wurzelknotenȱ desȱ XMLȬElementesȱ ,ȱ demȱ dasȱ XMLȬElementȱ ȱ hierarchischȱuntergeordnetȱist.ȱȱ
270ȱ
8.1ȱȱDatenȱinȱeinenȱXDMȬBaumȱeinfügenȱ Mitȱ dieserȱ einfachenȱ Technikȱ kannȱ durchȱ dieȱ visuelleȱ Näheȱ desȱ QuellȬXDMȬ Baumesȱ undȱ desȱ durchȱ denȱ Umsetzungsausdruckȱ erzeugtenȱ ZielȬXDMȬBaumesȱ dieȱWirkungsweiseȱleichtȱüberblicktȱwerden.ȱȱ Aufȱ dieȱ Klauselȱ modifyȱ folgtȱ sodannȱ derȱ Aktualisierungsausdruckȱ doȱ insert.ȱ Ihmȱ folgtȱ eineȱ Sequenz.ȱ Ihrȱ Eintragȱ bestehtȱ ausȱ demȱ XMLȬElementȱ ,ȱ dasȱ durchȱ denȱdirektenȱKonstruktorȱinȱZeileȱ(10)ȱerzeugtȱwird.ȱMitȱderȱKlauselȱbeforeȱinȱZeileȱ (11)ȱwirdȱbestimmt,ȱdassȱdieserȱneueȱElementknotenȱvorȱdenȱElementknotenȱderȱ Artȱȱeinzufügenȱist,ȱderȱdurchȱdenȱPfadausdruckȱinȱZeileȱ(12)ȱalsȱKontextȬ knotenȱfestgelegtȱwird.ȱȱ XQUERY transform copy $Dokument_temp := document{ hallo } modify do insert vor Gruss before $Dokument_temp/Wurzel/Gruss return $ Dokument_temp
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
Programmȱ143:ȱEinfügenȱvorȱeinemȱZielknoten
Mitȱ derȱ KlauselȱreturnȱwirdȱderȱsomitȱveränderteȱXDMȬBaumȱ vomȱ UmsetzungsȬ ausdruckȱzurückgegeben.ȱ Ergebnis vor Gruss hallo
Mitȱ denȱ Klauselnȱ before,ȱafter,ȱinto,ȱasȱfirstȱintoȱ undȱ asȱlastȱintoȱ wirdȱ gesteuert,ȱ anȱ welcherȱPositionȱimȱXDMȬBaumȱinȱBezugȱaufȱdenȱKontextknoten,ȱderȱdurchȱdenȱ Pfadausdruckȱpositioniertȱwird,ȱderȱneueȱKnotenȱeinzufügenȱist.ȱ ȱ ȱ ȱ ȱ
271ȱ
8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQueryȱ Klauselȱ
Wirkungȱ
beforeȱ
DerȱoderȱdieȱKnotenȱvonȱQuellausdruckȱwerdenȱvorȱdemȱerstenȱ Knotenȱeingefügt,ȱderȱdurchȱdenȱPfadausdruckȱadressiertȱwird.ȱ
afterȱ
DerȱoderȱdieȱKnotenȱvonȱQuellausdruckȱwerdenȱnachȱdemȱletzȬ tenȱ Knotenȱ eingefügt,ȱ derȱ durchȱ denȱ Pfadausdruckȱ adressiertȱ wird.ȱ
intoȱ
DerȱoderȱdieȱKnotenȱvonȱQuellausdruckȱwerdenȱinȱeineȱhierarȬ chischeȱ Ebeneȱ unterhalbȱ desȱ Knotensȱ eingefügt,ȱ derȱ durchȱ denȱ Pfadausdruckȱ adressiertȱ wird.ȱ Sindȱ bereitsȱ direkteȱ Nachfolgerȱ vorhanden,ȱsoȱistȱdieȱEinfügestelleȱunbestimmt.ȱ
asȱfirstȱintoȱ
Derȱ oderȱ dieȱ Knotenȱ vonȱ Quellausdruckȱ werdenȱ alsȱ dieȱ erstenȱ untergeordnetenȱKnotenȱdesȱKnotensȱdesȱZielausdrucksȱinȱdenȱ XDMȬBaumȱeingeordnet.ȱȱ
asȱlastȱintoȱ
DerȱoderȱdieȱKnotenȱvonȱQuellausdruckȱwerdenȱalsȱdieȱletztenȱ untergeordnetenȱKnotenȱdesȱKnotensȱdesȱZielausdrucksȱinȱdenȱ XDMȬBaumȱeingeordnet.ȱȱ
Tabelleȱ36:ȱWirkungȱderȱKlauselnȱvonȱdoȱinsertȱ
DasȱfolgendeȱProgrammȱ144ȱfügtȱdenȱElementknotenȱȱalsȱerstenȱKnotenȱhieȬ rarchischȱunterhalbȱdesȱWurzelknotensȱȱinȱdenȱXDMȬBaumȱein.ȱ XQUERY transform copy $Dokument_temp := document{ hallo } modify do insert vor Gruss as first into $Dokument_temp/Wurzel return $ Dokument_temp
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
Programmȱ144:ȱEinfügenȱunterhalbȱeinesȱZielknotensȱalsȱersterȱKnotenȱ
MitȱderȱKlauselȱasȱfirstȱinto,ȱangewendetȱaufȱdenȱabsolutenȱPfadausdruckȱ/Wurzel,ȱ wirdȱderȱEinfügevorgangȱanȱderȱgewünschtenȱPositionȱimȱXDMȬBaumȱgesteuert,ȱ sieheȱProgrammzeilenȱ(10)ȱbisȱ(12).ȱ Ergebnis
272ȱ
8.1ȱȱDatenȱinȱeinenȱXDMȬBaumȱeinfügenȱ
vor Gruss
hallo
Einȱ Umsetzungsausdruckȱ kannȱ auchȱ inȱ derȱ Klauselȱ returnȱ einesȱ let/returnȬ Konstruktesȱliegen.ȱDieȱSequenzȱinȱderȱDatenquelleȱkannȱauchȱausȱmehrerenȱKnoȬ tenȱbestehen,ȱdieȱaufȱeinmalȱanȱdieselbeȱStelleȱimȱXDMȬBaumȱeinzufügenȱsind.ȱImȱ Programmȱ145ȱwerdenȱzweiȱElementknotenȱunterhalbȱdesȱElementesȱWurzelȱeinȬ gefügt.ȱ Dieȱ Elementknotenȱ sindȱ inȱ Gestaltȱ vonȱ zweiȱ Einträgenȱ inȱ derȱ EinfügeseȬ quenzȱ gesammelt,ȱ dieȱ vonȱ derȱ Referenzvariablenȱ $Quelleȱ referenziertȱ wird,ȱ sieheȱ Zeilenȱ (8)ȱ bisȱ (15).ȱ Vonȱ derȱ Referenzvariablenȱ $Dokumentȱ wirdȱ dieȱ Sequenzȱ refeȬ renziert,ȱ dieȱ denȱ ursprünglichenȱ XDMȬBaumȱ alsȱ Eintragȱ enthält,ȱ sieheȱ Zeilenȱ (2)ȱ bisȱ(7).ȱȱ InȱderȱäußerenȱKlauselȱreturnȱvonȱZeileȱ(16)ȱbisȱ(24)ȱistȱjetztȱderȱUmsetzungsausȬ druckȱenthalten.ȱInȱseinerȱKlauselȱcopyȱwirdȱderȱoriginaleȱXDMȬBaumȱalsȱeinȱEinȬ tragȱ inȱ eineȱ Arbeitssequenzȱ kopiert,ȱ dieȱ vonȱ derȱ Referenzvariablenȱ $DokuȬ ment_tempȱ referenziertȱ wird.ȱ Inȱ derȱ Zeileȱ (21)ȱ nimmtȱ dieȱ Klauselȱ doȱinsertȱ Bezugȱ aufȱdieȱQuellsequenzȱmitȱihrenȱzweiȱEinträgen,ȱdieȱvonȱderȱVariablenȱ$QuelleȱadȬ ressiertȱ wird.ȱDerȱPfadausdruckȱinȱderȱZeileȱ(23)ȱgibtȱ an,ȱunterȱwelchemȱKnotenȱ imȱXDMȬBaumȱdieȱbeidenȱneuenȱElementknotenȱeinzufügenȱsind.ȱ XQUERY let $Dokument := document{ hallo } let $Quelle := ( erstes , zweites ) return transform copy $Dokument_temp := $Dokument modify do insert $Quelle as first into $Dokument_temp/Wurzel return $Dokument_temp
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24)
Programmȱ145:ȱEinfügenȱvonȱzweiȱElementknotenȱinȱeinemȱVorgang
273ȱ
8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQueryȱ Ergebnis erstes zweites hallo
XDM-Baum aus Tabelle lesen, modifizieren und ausgeben ImȱnächstenȱSchrittȱwirdȱderȱXDMȬBaum,ȱinȱwelchemȱdieȱEinfügeoperationȱstattȬ findenȱsoll,ȱausȱderȱTabelleȱKunde_XMLȱundȱderenȱSpalteȱDokumentȱgelesen.ȱAnȬ schließendȱ wirdȱ einȱ Elementknotenȱ eingefügtȱ undȱ dasȱ Ergebnisȱ mitȱ derȱ Klauselȱ returnȱzurȱKontrolleȱausgegeben.ȱȱ Mitȱ demȱ folgendenȱ Programmȱ wirdȱ dieȱ Tabelleȱ Kunde_XMLȱ zunächstȱ geleert,ȱ bevorȱsieȱanschließendȱmitȱderȱTestzeileȱgefülltȱundȱdieseȱausgegebenȱwird.ȱ DELETE FROM Kunde_XML ; INSERT INTO Kunde_XML (Kunde_XML_Nr, Dokument) VALUES ('D001', ' hallo ' ) ; SELECT * FROM Kunde_XML ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19)
Programmȱ146:ȱTestzeileȱinȱTabelleȱladenȱ Ergebnis D001 hallo
Derȱ zuȱ veränderndeȱ XDMȬBaumȱ istȱ inȱ derȱ Spalteȱ Dokumentȱ derȱ Tabelleȱ KunȬ de_XMLȱ inȱ derȱ Zeileȱ mitȱ demȱ Primärschlüsselwertȱ D001ȱ gespeichert.ȱ Vonȱ hierȱ
274ȱ
8.1ȱȱDatenȱinȱeinenȱXDMȬBaumȱeinfügenȱ wirdȱ erȱ mitȱ einemȱ einfachenȱ SELECTȬBefehlȱ vonȱ SQLȱ gelesenȱ undȱ anȱ dieȱ eingeȬ bauteȱSQL/XMLȬFunktionȱXMLQUERY()ȱübergeben,ȱsieheȱProgrammȱ147.ȱ Dasȱ Argumentȱ vonȱ XMLQUERY()ȱ istȱ inȱ derȱ Spracheȱ XQueryȱ formuliertȱ undȱ beȬ stehtȱausȱdemȱbekanntenȱUmsetzungsausdruck.ȱDasȱArgumentȱwirdȱalsȱZeichenȬ kettenliteralȱ inȱ einfachenȱ Hochkommasȱ geschrieben.ȱ Dieȱ Verbindungȱ zwischenȱ derȱ SQLȬȱ undȱ derȱ XQueryȬUmgebungȱ wirdȱ überȱ denȱ Spaltennamenȱ $DOKUȬ MENTȱinȱProgrammzeileȱ(3)ȱhergestellt.ȱErȱmussȱinȱGroßbuchstabenȱgeschriebenȱ undȱ mitȱ einemȱ Dollarzeichenȱ begonnenȱ werden.ȱ Hiermitȱ istȱ erȱ gleichzeitigȱ auchȱ eineȱXQueryȬReferenzvariable,ȱdieȱeineȱSequenzȱreferenziert,ȱwelcheȱdenȱvonȱSQLȱ gelesenenȱ XDMȬWertȱ alsȱ Eintragȱ enthält.ȱ Dieȱ weiterenȱ Bestandteileȱ desȱ ProȬ grammsȱentsprechenȱdenȱvorausgegangenenȱBeispielen.ȱDieȱKlauselȱreturnȱinȱZeiȬ leȱ(8)ȱgibtȱdenȱverändertenȱXDMȬBaumȱanȱSQLȱzurück,ȱdasȱihnȱimplizitȱserialisiertȱ inȱseinerȱexternenȱZeichenformȱausgibt.ȱ SELECT XMLQUERY( 'transform copy $Dokument_temp := $DOKUMENT modify do insert vor Gruss before $Dokument_temp/Wurzel/Gruss return $Dokument_temp ' ) FROM Kunde_XML WHERE Kunde_XML_Nr = 'D001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
Programmȱ147:ȱEingebauteȱSQL/XMLȬFunktionȱXMLQUERY()ȱmitȱUmsetzungsausdruck Ergebnis vor Gruss hallo
XDM-Baum aus Tabelle lesen, modifizieren und wieder zurückschreiben Dasȱ eigentlicheȱ Zielȱ desȱ ganzenȱ Unterfangensȱ bestehtȱ darin,ȱ denȱ XDMȬBaumȱ inȱ derȱ Tabelleȱzuȱaktualisieren.ȱDieȱAktualisierungȱistȱ originärȱeineȱSQLȬOperation,ȱ welcheȱvomȱSQLȬBefehlȱUPDATEȱdurchgeführtȱwird.ȱDieȱVeränderungȱinnerhalbȱ desȱ XDMȬBaumesȱ kannȱ jedochȱ nurȱ mitȱ demȱ Umsetzungsausdruckȱ vonȱ XQueryȱ geschehen.ȱ DasȱZusammenspielȱvonȱSQLȱundȱXQueryȱistȱimȱProgrammȱ148ȱdargestellt.ȱDerȱ SQLȬBefehlȱUPDATEȱliestȱdieȱZeileȱmitȱdemȱPrimärschlüsselwertȱD001.ȱDerȱXDMȬ Baum,ȱderȱinȱderȱSpalteȱDokumentȱderȱgelesenenȱZeileȱsichȱbefindet,ȱwirdȱsodannȱ anȱ dieȱ eingebauteȱ Funktionȱ XMLQUERY()ȱ überȱ dieȱ XQueryȬReferenzvariableȱ $DOKUMENTȱ demȱ Umsetzungsausdruckȱ vonȱ XQueryȱ zurȱ Verfügungȱ gestellt,ȱ sieheȱ Zeileȱ (5).ȱ Derȱ Umsetzungsausdruckȱ enthältȱ denȱ Unterausdruckȱ doȱ insertȱ...ȱ
275ȱ
8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQueryȱ afterȱinȱdenȱZeilenȱ(7)ȱundȱ(8).ȱNachȱdemȱEinfügenȱdesȱneuenȱElementknotensȱinȱ dieȱKopieȱdesȱXDMȬBaumesȱwirdȱdieseȱmodifizierteȱKopieȱdesȱXDMȬBaumesȱvonȱ derȱKlauselȱreturnȱanȱdieȱFunktionȱXMLQUERY()ȱzurückgegeben.ȱDieseȱstelltȱdenȱ modifiziertenȱ Baumȱ alsȱ Datenquelleȱ derȱ Klauselȱ SETȱ inȱ Programmzeileȱ (2)ȱ zurȱ Verfügung.ȱHierbeiȱwirdȱderȱalteȱXDMȬBaumȱinȱderȱTabelleȱdurchȱdenȱveränderȬ tenȱXDMȬBaumȱersetzt.ȱ UPDATE Kunde_XML SET Dokument = XMLQUERY( 'transform copy $Dokument_temp := $DOKUMENT modify do insert nach Gruss after $Dokument_temp/Wurzel/Gruss return $Dokument_temp ' ) WHERE Kunde_XML_Nr = 'D001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ148:ȱVerändernȱeinenȱXDMȬWertȱinȱderȱTabelle
DasȱErgebnisȱderȱgesamtenȱOperationȱkannȱmitȱdemȱSQLȬBefehlȱSELECTȱ dargeȬ stelltȱwerden.ȱ ȱ SELECT * FROM Kunde_XML ; Ergebnis D001 hallo nach Gruss
8.2 Daten in einem XDM-Baum löschen Mitȱ einemȱ Löschausdruckȱ werdenȱ nullȱ bisȱ vieleȱ Knotenȱ ausȱ einemȱ XDMȬBaumȱ gelöscht.ȱ EinȱLöschausdruckȱistȱvergleichsweiseȱeinfachȱaufgebaut.ȱErȱbestehtȱausȱderȱKlauȬ selȱ doȱdeleteȱ gefolgtȱ vonȱ einemȱ Pfadausdruck.ȱ Derȱ Pfadausdruckȱ beschreibt,ȱ welȬ cherȱoderȱwelcheȱKnotenȱausȱderȱKopieȱdesȱXDMȬBaumesȱzuȱlöschenȱsind,ȱsieheȱ Programmzeilenȱ (10)ȱ undȱ (11).ȱ Dieȱ somitȱ modifizierteȱ Kopieȱ desȱ XDMȬBaumesȱ wirdȱvonȱderȱKlauselȱreturnȱalsȱErgebnisȱdesȱUmsetzungsausdrucksȱzurückgegeȬ ben.ȱ
276ȱ
8.2ȱȱDatenȱinȱeinemȱXDMȬBaumȱlöschenȱ XQUERY transform copy $Dokument_temp := document{ hallo } modify do delete $Dokument_temp/Wurzel/Gruss return $ Dokument_temp
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
Programmȱ149:ȱLöschenȱeinesȱKnotensȱmitȱdemȱLöschausdruck Ergebnis
AlsȱErgebnisȱdesȱBeispielsȱwirdȱderȱleereȱWurzelknotenȱzurückgegeben.ȱ SollȱnurȱderȱTextinhaltȱeinesȱElementknotensȱgelöschtȱwerden,ȱkannȱdiesȱeinfachȱ mitȱ derȱ Angabeȱ desȱ zuȱ löschendenȱ Knotentypsȱ text()ȱ geschehen,ȱ sieheȱ Zeileȱ (11)ȱ vonȱProgrammȱ150.ȱ XQUERY transform copy $Dokument_temp := document{ hallo } modify do delete $Dokument_temp/Wurzel/Gruss/text() return $ Dokument_temp
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
Programmȱ150:ȱLöschenȱnurȱdesȱTextinhaltsȱeinesȱElementknotensȱ Ergebnis
DasȱLöschenȱvonȱBestandteilenȱausȱeinemȱXDMȬBaumȱinȱderȱDatenbankȱzeigtȱdasȱ folgendeȱ Programmȱ 151.ȱ Ausȱ Sichtȱ vonȱ SQLȱ wirdȱ eineȱ Veränderungȱ einesȱ vorȬ handenenȱ XDMȬBaumesȱ mitȱ demȱ SQLȬBefehlȱ UPDATEȱ durchgeführt.ȱ Ausȱ Sichtȱ vonȱ XQueryȱ wirdȱ einȱ Knotenȱ ausȱdemȱXDMȬBaumȱ mitȱ derȱ Klauselȱdoȱdeleteȱ entȬ fernt,ȱ bevorȱ derȱ resultierendeȱ XDMȬBaumȱ mitȱ demȱ SQLȬBefehlȱ UPDATEȱ zurückȱ geschriebenȱwird.ȱ
277ȱ
8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQueryȱ UPDATE Kunde_XML SET Dokument = XMLQUERY( 'transform copy $Dokument_temp := $DOKUMENT modify do delete $Dokument_temp/Wurzel/Gruss/text() return $Dokument_temp ' ) WHERE Kunde_XML_Nr = 'D001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
Programmȱ151:ȱLöschenȱvonȱDatenȱausȱeinemȱXDMȬBaumȱundȱpermanenteȱSpeicherungȱ desȱErgebnisses SELECT * FROM Kunde_XML ; Ergebnis: D001
8.3 Daten in einem XDM-Baum ersetzten MitȱdemȱErsetzungsausdruckȱdoȱreplaceȱsindȱzweiȱErsetzungsvariantenȱmöglich:ȱ
ErsetzungȱeinesȱKnotensȱdurchȱeineȱSequenzȱausȱKnotenȱ Ersetzungȱ desȱ Wertesȱ einesȱ Knotens,ȱ wobeiȱ dieȱ Identitätȱ desȱ Knotensȱ erȬ haltenȱbleibt.ȱ
DieȱSyntaxbeschreibungȱdesȱErsetzungsausdrucksȱzeigtȱdieȱStrukturȱdieserȱbeidenȱ Spielarten.ȱ MitȱderȱKlauselȱdoȱreplaceȱvalueȱofȱwirdȱderȱWertknotenȱeinesȱKnotens,ȱzuȱdemȱderȱ Wertknotenȱgehört,ȱimȱXDMȬBaumȱersetztȱundȱnichtȱderȱimȱPfadausdruckȱadresȬ sierteȱKnotenȱselbst.ȱInȱdenȱProgrammzeilenȱ(10)ȱbisȱ(12)ȱvonȱProgrammȱ152ȱwirdȱ deshalbȱderȱWertknotenȱmitȱdemȱInhaltȱhallo,ȱderȱinȱderȱZeileȱ(6)ȱmitȱeinemȱdirekȬ tenȱKonstruktorȱerzeugtȱwird,ȱdurchȱdenȱWertknotenȱmitȱdemȱInhaltȱhalloȱFreundeȱ inȱZeileȱ(12)ȱersetzt.ȱ ȱ ȱ ȱ ȱ
278ȱ
8.3ȱȱDatenȱinȱeinemȱXDMȬBaumȱersetztenȱ XQUERY transform copy $Dokument_temp := document{ hallo } modify do replace value of $Dokument_temp/Wurzel/Gruss with "hallo Freunde" return $Dokument_temp
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
Programmȱ152:ȱErsetzungȱdesȱWertesȱvonȱKnotenȱGruss Ergebnis hallo Freunde
Sollȱ sowohlȱderȱNameȱdesȱ Knotensȱ alsȱauchȱseinȱWertȱersetztȱwerden,ȱsoȱistȱderȱ ErsetzungsausdruckȱnurȱmitȱderȱKlauselȱdoȱreplaceȱzuȱformulieren.ȱImȱProgrammȱ 153ȱwirdȱderȱKnotenȱȱmitȱseinemȱWertȱhalloȱdurchȱdenȱenglischsprachigenȱ KnotenȱȱmitȱdessenȱWertȱhelloȱersetzt.ȱInȱdenȱProgrammzeilenȱ(10)ȱbisȱ (12)ȱsindȱdieȱhierzuȱerforderlichenȱAussagenȱgetroffen.ȱ XQUERY transform copy $Dokument_temp := document{ hallo } modify do replace $Dokument_temp/Wurzel/Gruss with hello return $Dokument_temp ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ153:ȱErsetzungȱdesȱKnotensȱGruss Ergebnis hello
279ȱ
8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQueryȱ SollȱdieȱErsetzungȱeinesȱKnotensȱsichȱinȱderȱDatenbankȱniederschlagen,ȱsoȱistȱderȱ bekannteȱEinsatzȱderȱSQLȬAnweisungȱUPDATEȱerforderlich,ȱsieheȱProgrammȱ154.ȱ ȱ UPDATE Kunde_XML SET Dokument = XMLQUERY( 'transform copy $Dokument_temp := $DOKUMENT modify do replace $Dokument_temp/Wurzel/Gruss with hello return $Dokument_temp ' ) WHERE Kunde_XML_Nr = 'D001' ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
Programmȱ154:ȱErsetzungȱdesȱKnotensȱGrussȱinȱderȱDatenbank
MitȱdemȱSQLȬBefehlȱSELECTȱkannȱdasȱErgebnisȱgeprüftȱwerden.ȱ ȱ SELECT * FROM Kunde_XML ; Ergebnis D001 hello
8.4 Daten in einem XDM-Baum umbenennen Sollȱ lediglichȱ derȱ Bezeichnerȱ einesȱ Knotensȱ umbenanntȱ werden,ȱ soȱ dientȱ hierzuȱ derȱ Umbenennungsausdruck,ȱ derȱ mitȱ doȱ renameȱ eingeleitetȱ wird.ȱ Imȱ Programmȱ 155ȱwirdȱderȱBezeichnerȱdesȱElementknotensȱvonȱGrussȱaufȱGreetingsȱumbenannt,ȱ sieheȱdieȱProgrammzeilenȱ(10)ȱbisȱ(12).ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
280ȱ
8.5ȱȱVieleȱÄnderungenȱinȱeinemȱUmsetzungsausdruckȱ XQUERY transform copy $Dokument_temp := document{ hallo } modify do rename $Dokument_temp/Wurzel/Gruss as "Greetings" return $ Dokument_temp
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
Programmȱ155:ȱUmbenennungȱdesȱKnotennamensȱGruss Ergebnis hallo
8.5 Viele Änderungen in einem Umsetzungsausdruck InȱeinemȱUmsetzungsausdruckȱkönnenȱmehrereȱÄnderungsoperationenȱinȱeinemȱ XDMȬBaumȱdurchgeführtȱwerden.ȱHierzuȱwerdenȱdieȱÄnderungsausdrückeȱnachȱ derȱ Klauselȱ modifyȱ inȱ rundenȱ Klammernȱ eingeschlossenȱ undȱ durchȱ Kommasȱ geȬ trenntȱinȱeinerȱFolgeȱaufgeführt,ȱsieheȱSyntaxȱ34.ȱXQueryȱsorgtȱhierbeiȱdafür,ȱdassȱ dasȱ Gesamtergebnisȱ vorhersagbarȱ ist.ȱ Deshalbȱ sammeltȱ esȱ zunächstȱ einmalȱ alleȱ Änderungsoperationen.ȱAnschließendȱführtȱesȱdieseȱinȱfolgenderȱReihenfolgeȱaus:ȱ –
– – – –
EinfügeoperationenȱdoȱinsertȱohneȱdieȱKlauselnȱfürȱdieȱSortierungȱwieȱbefoȬ re,ȱafter,ȱasȱfirstȱundȱasȱlast,ȱ Umbenennungsoperationenȱdoȱrename,ȱ Ersetzungsoperationenȱdoȱreplaceȱvaluesȱof,ȱ allesȱinȱnichtdeterministischerȱReihenfolge.ȱ EinfügeoperationenȱdoȱinsertȱmitȱdenȱKlauselnȱfürȱdieȱSortierungȱwieȱbefore,ȱ after,ȱasȱfirstȱundȱasȱlast.ȱȱ Ersetzungsoperationenȱdoȱreplace,ȱbeiȱdenenȱdieȱKlauselȱvalueȱofȱnichtȱangeȬ gebenȱist.ȱȱ Ersetzungsoperationenȱdoȱreplace,ȱbeiȱdenenȱdieȱKlauselȱvalueȱofȱangegebenȱ istȱundȱbeiȱdenenȱdieȱZielknotenartȱeinȱElementknotenȱist.ȱȱ AlleȱLöschoperationenȱdoȱdelete.ȱȱ
ȱ
281ȱ
8ȱȱXMLȬDatenȱmanipulierenȱ–ȱDMLȱvonȱXQueryȱ Beiȱ derȱ Verarbeitungȱ einesȱ Umsetzungsausdrucksȱ gibtȱ XQueryȱ einenȱ Fehlerȱ zuȬ rück,ȱwennȱeineȱderȱfolgendenȱBedingungenȱeintritt:ȱȱ
ZweiȱoderȱmehrȱUmbenennungsoperationenȱwerdenȱaufȱdenselbenȱKnotenȱ angewandt.ȱȱ Zweiȱ oderȱ mehrȱ Ersetzungsoperationen,ȱ dieȱ dieȱ Schlüsselwörterȱ valueȱ ofȱ verwenden,ȱwerdenȱaufȱdenselbenȱKnotenȱangewandt.ȱȱ Zweiȱ oderȱ mehrȱ Ersetzungsoperationen,ȱ dieȱ dieȱ Schlüsselwörterȱ valueȱ ofȱ nichtȱverwenden,ȱwerdenȱaufȱdenselbenȱKnotenȱangewandt.ȱȱ Inȱ einemȱ XMLȬElementknotenȱ entstehenȱ mehrereȱ Attributeȱ mitȱ identiȬ schemȱNamen.ȱȱ
ImȱProgrammȱ156ȱsindȱabȱderȱZeileȱ(22)ȱbisȱ(32)ȱvierȱVeränderungsoperationenȱaufȱ denȱXDMȬBaumȱdargestellt.ȱDreiȱvonȱihnenȱsindȱinsertȬOperationenȱundȱderȱletzteȱ istȱeineȱrenameȬOperation.ȱ XQUERY let $Dokument := document{ hallo } let $Quelle_insert_before := (insert before) let $Quelle_insert := (nur insert) let $Quelle_insert_as_first_into := (insert_as_first_into ) let $Quelle_rename := "Greetings" return transform copy $Dokument_temp := $Dokument modify ( do insert $Quelle_insert_before before $Dokument_temp/Wurzel/Gruss, do insert $Quelle_insert into $Dokument_temp/Wurzel/Gruss, do insert $Quelle_insert_as_first_into as first into $Dokument_temp/Wurzel/Gruss, do rename $Dokument_temp/Wurzel/Gruss as $Quelle_rename ) return $Dokument_temp ;
Programmȱ156:ȱVieleȱVeränderungenȱinȱeinemȱUmsetzungsausdruck
282ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35)
8.6ȱȱÜbungenȱ Ergebnis insert before insert_as_first_into hallo nur insert
8.6 Übungen 7) ErsetzenȱSieȱdieȱElementnamenȱinȱeinemȱKundendokumentȱinȱderȱDatenbankȱ vonȱdeutschemȱVokabularȱinȱenglischesȱVokabular.ȱ 8) Fügenȱ Sieȱ inȱ einemȱ Kundendokumentȱ inȱ derȱ Datenbankȱ nachträglichȱ dasȱȱ ElementȱE_MailȱmitȱIhrerȱEȬMailȬAdresseȱein.ȱ 9) LöschenȱSieȱausȱeinemȱKundendokumentȱinȱderȱDatenbankȱdasȱElementȱAnȬ rede.ȱ 10) Löschenȱ Sieȱ ausȱ einemȱ Kundendokumentȱ inȱ derȱ Datenbankȱ denȱ Wertȱ desȱ ElementsȱVorname.ȱ 11) Verändernȱ Sieȱ inȱ einemȱ Kundendokumentȱ inȱ derȱ Datenbankȱ denȱ Wertȱ desȱ ElementsȱZunameȱvonȱMuellerȱnachȱMüller.ȱ ȱ
283ȱ
9 XML-Daten in Java verarbeiten InȱdiesemȱKapitelȱlernenȱSie,ȱ – wieȱmanȱausȱJavaȱherausȱüberȱdieȱSQLȬSchnittstelleȱaufȱXMLȬDatenȱlesendȱ zugreiftȱ – wieȱmanȱausȱJavaȱherausȱüberȱdieȱXQueryȬSchnittstelleȱaufȱXMLȬDatenȱleȬ sendȱzugreift.ȱ Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ sichȱ auchȱ dieȱ schreibendenȱ Zugriffeȱ erarbeiten.ȱ
9.1 Verbindung zwischen Java und DB2 herstellen Zurȱ Erweiterungȱ derȱ Funktionalitätȱ derȱ Programmierspracheȱ Javaȱ gibtȱ esȱ einȱ reichhaltigesȱAngebotȱanȱProgammierschnittstellen.ȱDieseȱwerdenȱauchȱalsȱAppliȬ cationȱ Programmingȱ Interfacesȱ (API)ȱ bezeichnet.ȱ Eineȱ dieserȱ Schnittstellenȱ istȱ dieȱ standardisierteȱ Schnittstelleȱ JavaȱDatabaseȱConnectivity,ȱ abgekürztȱ JDBC.ȱ Sieȱ bietetȱ dieȱMöglichkeit,ȱSQLȬȱoderȱ XQueryȬBefehleȱinȱ TextformȱanȱdenȱDB2ȬDatenbankȬ prozessorȱ zuȱ schicken.ȱ Dieserȱ prüftȱ dieȱ erhaltenenȱ Befehleȱ aufȱ syntaktischeȱ KorȬ rektheitȱ undȱ führtȱ sieȱ aus,ȱ wennȱ keinȱ Verstoßȱ gegenȱ dieȱ Syntaxȱ derȱ jeweiligenȱ Spracheȱvorliegt.ȱBeiȱAnfragebefehlenȱliefertȱerȱalsȱAntwortȱeineȱMengeȱanȱErgebȬ niszeilenȱanȱdasȱJavaȬProgrammȱzurück.ȱWeitereȱEinzelheitenȱüberȱJDBCȱkönnenȱ Sieȱbeispielsweiseȱinȱ[MOO04]ȱnachlesen.ȱ DaȱinȱvielenȱJavaȬProgrammenȱeineȱVerbindungȱzuȱDB2ȱerforderlichȱist,ȱwirdȱfürȱ dieȱfolgendenȱBeispieleȱderȱAufbauȱderȱVerbindungȱinȱeinȱObjektȱderȱKlasseȱDaȬ tenbankȱ gekapselt.ȱ Beiȱ Bedarfȱ wirdȱ einȱ Objektȱ dieserȱ Klasseȱ einfachȱ ausgeprägtȱ undȱ dieȱ sodannȱ stehendeȱ Verbindungȱ genutzt.ȱ Dasȱ Programmȱ 157ȱ leistetȱ diesenȱ immerȱwiederȱerforderlichenȱDienst.ȱWichtigȱistȱhierbei,ȱdassȱderȱmoderneȱJDBCȬ Treiberȱ geladenȱ wird,ȱ derȱ auchȱ dieȱ XQueryȬSchnittstelleȱ bedienenȱ kann.ȱ Inȱ ProȬ grammzeileȱ(13)ȱstehtȱseinȱaktuellerȱName.ȱ /******************************************************/ /* Datenbankverbindung herstellen */ /******************************************************/ import java.sql.*; public class Datenbank { Connection dbverbindung; Statement sqlbefehl; boolean verbindungOK = true; public Datenbank() { try { Class.forName
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
ȱ285
9ȱȱXMLȬDatenȱinȱJavaȱverarbeitenȱ ("com.ibm.db2.jcc.DB2Driver"); String urlLokal = "jdbc:db2:moosdb"; //Verbindung zur Datenbank aufbauen: dbverbindung = DriverManager.getConnection( urlLokal, "Benutzername", "Kennwort"); // SQL-Befehls-Objekt ausprägen: sqlbefehl = dbverbindung.createStatement(); verbindungOK = true; } // Ende try catch(Exception ausnahme) { System.out.println( ausnahme ); verbindungOK = false; } // Ende catch } // Ende Konstruktor /*****************************************************/ public static void main(String args[]) { Datenbank db = new Datenbank(); if (db.verbindungOK) System.out.println ("Datenbankverbindung ist aufgebaut"); else System.out.println ("Datenbankverbindung ist nicht aufgebaut "); // Datenbank schließen und Objekte frei geben: try { db.dbverbindung.close(); db.sqlbefehl.close(); } catch(Exception ausnahme) { System.out.println( ausnahme ); } } // Ende main } // Ende Datenbank
(13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52)
Programmȱ157:ȱVerbindungȱzwischenȱJavaȱundȱDB2ȱüberȱJDBC
Nachdemȱ dasȱ Programmȱ Datenbankȱ kompiliertȱ undȱ getestetȱ ist,ȱ könnenȱ seineȱ DiensteȱinȱanderenȱProgrammenȱgenutztȱwerden.ȱ
9.2 Lesender Zugriff über die SQL-Schnittstelle InȱProgrammȱ158ȱwirdȱdieȱFunktionalitätȱderȱKlasseȱDatenbankȱgenutzt.ȱÜberȱdieȱ stehendeȱ Verbindungȱ zuȱ DB2ȱ wirdȱ einȱ SELECTȬBefehlȱ vonȱ SQLȱ anȱ denȱ DatenȬ bankprozessorȱgeschicktȱundȱderȱXDMȬBaumȱinȱderȱSpalteȱDokumentȱderȱTabelleȱ Kunde_XMLȱ gelesen.ȱ Inȱ dieȱ Tabelleȱ istȱ derzeitȱ nurȱ eineȱ Zeileȱ mitȱ diesemȱ Baumȱ geladen.ȱ
286ȱ
9.2ȱȱLesenderȱZugriffȱüberȱdieȱSQLȬSchnittstelleȱ Derȱ SQLȬBefehlȱ SELECTȱ wirdȱ inȱ Programmzeileȱ (15)ȱ alsȱ StringȬLiteralȱ derȱ RefeȬ renzvariablenȱbefehlstextȱzugewiesen.ȱInȱderȱZeileȱ(20)ȱwirdȱderȱSQLȬBefehlȱanȱdenȱ Datenbankprozessorȱgeschickt.ȱDieserȱerkenntȱihnȱalsȱSQLȬBefehl.ȱNachȱerfolgreiȬ cherȱ Prüfungȱ wirdȱ erȱ vonȱ DB2ȱ ausgeführtȱ undȱ derȱ geleseneȱ XDMȬBaumȱ alsȱ einȱ EintragȱinȱdasȱObjektȱderȱKlasseȱResultSetȱeingestellt.ȱDieȱReferenzȱaufȱdasȱResultȬ SetȬObjektȱ wirdȱ inȱ denȱ Zeilenȱ (19)ȱ undȱ (20)ȱ derȱ Referenzvariablenȱ ergebnismengeȱ zugewiesen.ȱMitȱderȱMethodeȱergebnismenge.next()ȱinȱZeileȱ(23)ȱwirdȱaufȱdieȱersteȱ undȱ einzigeȱ Ergebniszeileȱ positioniert.ȱ Mitȱ derȱ Methodeȱ ergebnismenȬ ge.getString(1)ȱ wirdȱ derȱ XDMȬBaumȱ implizitȱ serialisiertȱ undȱ dasȱ textförmigeȱ ErȬ gebnisȱvonȱderȱMethodeȱprint()ȱalsȱXMLȬDokumentȱausgegeben.ȱ ȱ /*****************************************************/ /* XDM-Baum aus Tabelle Kunde_XML lesen */ /*****************************************************/ import java.sql.*; public class Lies_XDM_Knoten_SQL { static Datenbank db; public static void main(String args[]) { db = new Datenbank(); if (db.verbindungOK) jetztGehtsLos(); } // Ende main /**************************************/ public static void jetztGehtsLos() { String befehlstext = "SELECT Dokument FROM Kunde_XML"; try { // Befehlstext an den Datenbankprozessor // schicken und Ergebnis empfangen: ResultSet ergebnismenge = db.sqlbefehl.executeQuery(befehlstext); // Auf nächste Ergebniszeile in der // Ergebnismenge positionieren: while(ergebnismenge.next()) { //XML-Dokument lesen und implizit serialsieren: System.out.print (ergebnismenge.getString(1)); } } // Ende try-Block // Ausnahme abfangen und behandeln: catch( Exception ausnahme ) { System.out.println( ausnahme ); } // Ende catch-Block } // Ende jetztGehtsLos } // Ende Lies_XDM_Knoten_SQL
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34)
Programmȱ158:ȱLesenderȱZugriffȱaufȱeinenȱXDMȬBaumȱüberȱdieȱSQLȬSchnittstelle Ergebnis C:\Klassen>java Lies_XDM_Knoten_SQL
287ȱ
9ȱȱXMLȬDatenȱinȱJavaȱverarbeitenȱ hallo
9.3 Lesender Zugriff über die XQuery-Schnittstelle Auchȱ derȱ lesendeȱ Zugriffȱ aufȱ XMLȬDatenȱ überȱ dieȱ XQueryȬSchnittstelleȱ istȱ verȬ gleichbarȱeinfachȱwieȱderȱZugriffȱüberȱdieȱSQLȬSchnittstelle.ȱLediglichȱderȱBefehlsȬ text,ȱderȱanȱdenȱDatenbankprozessorȱbeschicktȱwird,ȱbestehtȱausȱdenȱgewohntenȱ SprachmittelnȱvonȱXQuery,ȱsieheȱdieȱProgrammzeilenȱ(14)ȱbisȱ(18)ȱvonȱProgrammȱ 159.ȱAnsonstenȱsindȱdieȱProgrammeȱidentisch.ȱ /*****************************************************/ /* XDM-Baum aus Tabelle Kunde_XML lesen */ /*****************************************************/ import java.sql.*; public class Lies_XDM_Knoten_XQuery { static Datenbank db; public static void main(String args[]) { db = new Datenbank(); if (db.verbindungOK) jetztGehtsLos(); } // Ende main /**************************************/ public static void jetztGehtsLos() { String befehlstext = "XQUERY " + " let $Dokument := " + " db2-fn:xmlcolumn('KUNDE_XML.DOKUMENT') " + " return $Dokument "; try { // Befehlstext an den Datenbankprozessor // schicken und Ergebnis empfangen: ResultSet ergebnismenge = db.sqlbefehl.executeQuery(befehlstext); // Auf nächste Ergebniszeile in der // Ergebnismenge positionieren: while(ergebnismenge.next()) { // XML-Dokument lesen und implizit serialisieren: System.out.print (ergebnismenge.getString(1)); } } // Ende try-Block // Ausnahme abfangen und behandeln: catch( Exception ausnahme ) { System.out.println( ausnahme ); } // Ende catch-Block } // Ende jetztGehtsLos } // Ende Lies_XDM_Knoten_XQuery
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37)
Programmȱ159:ȱLesenderȱZugriffȱaufȱeinenȱXDMȬBaumȱüberȱdieȱXQueryȬSchnittstelle
288ȱ
9.4ȱȱÜbungenȱ C:\Klassen>java Lies_XDM_Knoten_XQuery hallo
9.4 Übungen 1) ErfassenȱSieȱdieȱDatenȱderȱTabelleȱArtikelȱalsȱXMLȬDokumenteȱinȱeinerȱneuenȱ TabelleȱArtikel_XML.ȱJeȱArtikelȱbildenȱSieȱeinenȱXDMȬBaumȱinȱderȱSpalteȱDoȬ kument.ȱGebenȱSieȱdieȱArtikeldatenȱinȱjeȱeinemȱJavaȬProgrammȱmitȱSQLȱundȱ mitȱXQueryȱaus.ȱ 2) GebenȱSieȱdieȱArtikeldatenȱinȱaufsteigenderȱSortierfolgeȱnachȱNamenȱsortiertȱ inȱeinemȱJavaȬProgrammȱmitȱXQueryȱaus.ȱ 3) Gebenȱ Sieȱ dieȱ Artikeldatenȱ inȱ absteigenderȱ Sortierfolgeȱ derȱ Artikelpreiseȱ inȱ einemȱJavaȬProgrammȱmitȱXQueryȱaus.ȱ 4) Gebenȱ Sieȱ dieȱ Artikeldatenȱ inȱ aufsteigenderȱ Sortierfolgeȱ derȱ Artikelpreiseȱ inȱ einemȱ JavaȬProgrammȱ mitȱ XQueryȱ aus.ȱ Nurȱ Artikelȱ mitȱ Preisenȱ überȱ 1.000ȱ Euroȱdürfenȱausgegebenȱwerden.ȱ 5) ErmittelnȱSieȱdieȱAnzahlȱderȱArtikelȱinȱeinemȱJavaȬProgrammȱmitȱXQuery.ȱ 6) Ermittelnȱ Sieȱ folgendeȱ Werteȱ undȱ gebenȱ Sieȱ dieseȱ inȱ einemȱ JavaȬProgrammȱ mitȱXQueryȱaus:ȱ –ȱSummeȱallerȱArtikelpreiseȱ –ȱkleinsterȱArtikelpreisȱ –ȱgrößterȱArtikelpreisȱ –ȱdurchschnittlicherȱArtikelpreis.ȱ
289ȱ
10 XML-Daten definieren – XML Schema InȱdiesemȱKapitelȱlernenȱSie,ȱ – – – –
wieȱeinȱSchemaȱvonȱXMLȬDokumentenȱmodelliertȱwirdȱ wieȱeinȱSchemaȱvonȱXMLȬDokumentenȱvereinbartȱwirdȱ wieȱeinȱSchemaȱimȱDatenbanksystemȱgespeichertȱwirdȱundȱ wieȱderȱDatenbankprozessorȱdasȱXMLȬSchemaȱverwendetȱumȱXMLȬ Dokumenteȱzuȱvalidieren.ȱ
Mitȱ Ihremȱ erworbenenȱ Wissenȱ könnenȱ Sieȱ sodannȱ auchȱ komplexereȱ XMLȬ Schemataȱ entwickelnȱ undȱ zurȱ Validierungȱ entsprechenderȱ XMLȬDokumenteȱ einȬ setzen.ȱHiermitȱhabenȱSieȱsichȱdieȱGrundlageȱerarbeitet,ȱaufȱderȱSieȱdieȱLiteraturȱ überȱ dieȱ Spracheȱ XMLȱ Schemaȱ operationellȱ inȱ DB2ȬAnwendungenȱ umsetztenȱ können.ȱ
10.1 XML Schema – ein kurzer Überblick Einȱ XMLȬSchemaȱ istȱ einȱ maschinenlesbarerȱ Bauplanȱ fürȱ XMLȬDokumente.ȱ Einȱ XMLȬDokumentȱ istȱ somitȱ eineȱ Ausprägungȱ einesȱ XMLȬSchemas.ȱ Imȱ Verständnisȱ derȱObjektorientierungȱistȱeinȱXMLȬSchemaȱeineȱKlasseȱundȱeinȱXMLȬDokumentȱ einȱ Objektȱ dieserȱ Klasse.ȱ Einȱ Objektȱ wirdȱ oftȱ auchȱ alsȱ eineȱ Ausprägungȱ oderȱ InȬ stanzȱ(engl.ȱinstanceȱ–ȱBeispiel)ȱbezeichnet.ȱEinȱXMLȬSchemaȱschreibtȱvor,ȱwelcheȱ Vokabelnȱ inȱ einemȱ XMLȬDokumentȱ zuȱ verwendenȱ undȱ inȱ welcherȱ Reihenfolgeȱ undȱ Schachtelungȱ dieseȱ Vokabelnȱ zuȱ schreibenȱ sind.ȱ Weiterhinȱ schreibtȱ esȱ vor,ȱ vonȱwelchenȱDatentypenȱdieȱNutzdatenworteȱinȱeinemȱXMLȬDokumentȱseinȱmüsȬ sen,ȱdieȱvonȱdenȱXMLȬElementenȱundȱderenȱAttributenȱausgezeichnetȱwerden.ȱ Einȱ XMLȬSchemaȱ wirdȱ inȱ derȱ Spracheȱ XMLȱ Schemaȱ formuliert.ȱ Dieȱ SchemabeȬ schreibungsspracheȱXMLȱSchemaȱistȱselbstȱeineȱXMLȬSprache.ȱDasȱbedeutet,ȱdassȱ dieȱSpracheȱXMLȱSchemaȱihrenȱWortvorratȱzurȱBeschreibungȱderȱBaupläneȱinȱGeȬ staltȱ vonȱ XMLȬElementenȱ undȱ derenȱ Attributeȱ anbietet.ȱ Dieseȱ sindȱ nachȱ denȱ grammatikalischenȱVorgabenȱvonȱXMLȱundȱvonȱXMLȱSchemaȱanzuwenden.ȱSomitȱ werdenȱ mitȱ einerȱ Sprache,ȱ dieȱ nachȱ denȱ Grundsätzenȱ vonȱ XMLȱ aufgebautȱ ist,ȱ XMLȬDokumente,ȱ dieȱ Baupläneȱ bzw.ȱ XMLȬSchemata,ȱ beschrieben.ȱ Einȱ solcherȱ Bauplanȱ istȱ nunȱ selbstȱ dieȱ Grammatikȱ fürȱ dasȱ Ausformulierenȱ vonȱ XMLȬ Dokumenten,ȱwelcheȱdieȱRealweltȱbeschreiben.ȱ WennȱeinȱXMLȬSchemaȱmitȱdemȱWortvorratȱderȱProgrammierspracheȱXMLȱScheȬ maȱausformuliertȱist,ȱwirdȱesȱanschließendȱinȱdasȱSchemaȬRepositoryȱ(XSR)ȱvonȱDB2ȱ geladen.ȱ Dasȱ XSRȱ istȱ Teilȱ desȱ Datenbankkatalogsȱ vonȱ DB2.ȱ Beimȱ Ladevorgangȱ wirdȱ dasȱ XMLȬSchemaȱ geprüft,ȱ obȱ esȱ denȱ syntaktischenȱ Anforderungenȱ derȱ
ȱ291
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ SchemabeschreibungsspracheȱXMLȱSchemaȱgenügt.ȱDieseȱPrüfungȱwirdȱvomȱvaliȬ dierendenȱXMLȬParserȱvonȱDB2ȱvorgenommen.ȱȱ Nachȱ erfolgreichemȱ Ladenȱ desȱ XMLȬSchemasȱ inȱ dasȱ XSRȱ kannȱ derȱ XMLȬParserȱ vonȱ DB2ȱ esȱ verwenden,ȱ umȱ einȱ zuȱ ladendesȱ XMLȬDokumentȱ dahingehendȱ zuȱ prüfen,ȱ obȱ esȱ denȱ syntaktischenȱ Vorgabenȱ desȱ XMLȬSchemasȱ entspricht.ȱ Nachȱ erfolgreicherȱ Prüfungȱ wirdȱ dasȱ XMLȬDokumentȱ nochȱ mitȱ Metadatenȱ ausȱ demȱ XMLȬSchemaȱangereichertȱundȱalsȱXDMȬBaumȱinȱeinerȱSpalteȱmitȱdemȱDatentypȱ XMLȱ gespeichert.ȱ Einȱ solchermaßenȱ geprüftesȱ XMLȬDokumentȱ wirdȱ alsȱ schemaȬ valideȱbezeichnet.ȱ DieȱSchemabeschreibungsspracheȱXMLȱSchemaȱwirdȱvonȱeinerȱArbeitsgruppeȱdesȱ WordȱWideȱWebȱConsortiumȱ(W3C)ȱentwickelt.ȱDieȱSpezifikationȱfürȱdieȱVersionȱ1.0ȱ hatȱseitȱ2001ȱdenȱStatusȱeinerȱEmpfehlungȱ(engl.ȱW3CȱRecommendation)ȱ[W3C04a,ȱb,ȱ c].ȱ Dieȱ Spezifikationȱfürȱ dieȱ folgendeȱ Versionȱ 1.1ȱ wirdȱ derzeitȱerarbeitetȱ undȱhatȱ denȱStatusȱeinesȱArbeitsdokumentesȱ(engl.ȱW3CȱWorkingȱDraft)ȱ[W3C06c].ȱ DieȱSpracheȱXMLȱSchemaȱistȱeineȱDatenbeschreibungsspracheȱ(engl.ȱDDLȱ–ȱDataȱ Descriptionȱ Language).ȱ Wegenȱ desȱ großenȱ Umfangsȱ ihrerȱ Datentypen,ȱ denȱ zahlȬ reichenȱMöglichkeitenȱderȱWerteinschränkungen,ȱdenȱdiversenȱMöglichkeitenȱderȱ Festlegungenȱ vonȱ Reihenfolgenȱ undȱ hierarchischenȱ Schachtelungenȱ vonȱ XMLȬ Elementen,ȱ umȱ nurȱ einigeȱ Kriterienȱ zuȱ nennen,ȱ istȱ XMLȱ Schemaȱ eineȱ rechtȱ umȬ fangreicheȱSprache.ȱSieȱkannȱdeshalbȱinȱdiesemȱKapitelȱnurȱ einführendȱundȱausȬ zugsweiseȱbehandeltȱwerden.ȱ Zentraleȱ Begriffeȱ inȱ XMLȱ sindȱ dasȱ XMLȬElementȱ undȱ dasȱ XMLȬAttribut.ȱ Dieseȱ Begriffeȱwerdenȱverwendet,ȱumȱaufȱunterschiedlichenȱSprachebenenȱFestlegungenȱ undȱAussagenȱzuȱtreffen.ȱWasȱmitȱdenȱWortenȱElementȱundȱAttributȱpräziseȱausgeȬ sagtȱ ist,ȱ wirdȱ nurȱ verständlich,ȱ wennȱ bekanntȱ ist,ȱ inȱ welchemȱ Zusammenhangȱ dieseȱWorteȱverwendetȱwurden.ȱGenauer,ȱaufȱwelcherȱSprachebeneȱsieȱzumȱEinȬ satzȱgekommenȱsind.ȱ Umȱkeineȱhomonymen,ȱd.ȱh.ȱmehrdeutigenȱAussagenȱzuȱmachen,ȱverwendenȱwirȱ beiȱ denȱ folgendenȱ Erklärungenȱ dieȱ Präfixeȱ Sprache,ȱ Schema,ȱ undȱ Objekt,ȱ umȱ klarȱ auszudrücken,ȱaufȱwelcherȱEbeneȱdieȱaktuelleȱAussageȱgemachtȱwird.ȱSoȱwerdenȱ wirȱdenȱBegriffȱSprachelementȱverwenden,ȱwennȱwirȱXMLȬElementeȱderȱSpracheȱ XMLȱSchemaȱmeinen.ȱDenȱBegriffȱSchemaelementȱwerdenȱwirȱverwenden,ȱwennȱ wirȱ XMLȬElementeȱ behandeln,ȱ dieȱ aufȱ derȱ TypȬȱ bzw.ȱ Schemaebeneȱ deklariertȱ werden.ȱ Undȱ schließlichȱ werdenȱ wirȱ denȱ Begriffȱ Objektelementȱ oderȱ kurzȱ XMLȬ Elementȱverwenden,ȱwennȱwirȱAussagenȱüberȱXMLȬElementeȱinȱXMLȬDokumenȬ tenȱüberȱdieȱRealweltȱmachen.ȱ Dieȱ folgendeȱ Abbildungȱ 67ȱ verdeutlichtȱ denȱ Zusammenhangȱ derȱ unterschiedliȬ chenȱXMLȬElementbegriffeȱaufȱdenȱdreiȱunterschiedlichenȱEbenen.ȱ ȱ ȱ
292ȱ
10.1 XML Schema – ein kurzer Überblick Sprache zum Verfassen von Grammatiken z. B. Backus- Naur Notationsform, Syntaxdiagrammsprachen UML
MetaSprachenEbene BNF
Sprache zum Verfassen von XML-Schemata Z. B. XML Schema, DTD Spracheelement, Spracheattribut Sprache bzw. Schemata zum Verfassen von Dokumenten der anwendungsspezifische Realwelt. Z. B. Schema Kunde Typelement, Typattribut Schemaelement, Schemaattribut Dokument über die Realwelt Z. B. Dokument über Kunde K001 Objektelement, Objektattribut
XML Schema
Realweltspezifisches Typdokument
XML-Dokument, das die Realwelt beschreibt (Objektdokument).
SprachEbene
TypSchemaEbene
ObjektEbene
RealweltEbene
Realwelt K001, Hugo Müller
Abbildung 67: Ebenen von Sprachen und Vorkommen von XML-Elementen
Zur Beschreibung von Dokumentschemata auf der Typ-Ebene wird die XML Schema-Sprache verwendet. Die hierbei eingesetzten Sprachmittel, die in der XML Schemabeschreibungs-Sprache deklariert bzw. vorgegeben sind, bezeichnen wir mit Sprachelement, Sprachattribut usw. Zur Beschreibung und Validierung von XML-Dokumenten auf der Objektebene der Informatik werden die Dokumentschemata bzw. Dokumenttypen verwendet. Sie sind realwelt- bzw. anwendungsspezifische Deklarationen von Element- und Attributtypen. Wir bezeichnen sie als Schemaelemente und Schemaattribute. Zur Beschreibung von Realweltobjekten, wie z. B. den Kunden Hugo Müller, verwenden wir auf der Informatik-Objekt-Ebene XML-Dokumente im engeren Sinne. Ihre schemakonformen Formulierungen sind letztlich Sinn und Zweck der ganzen Beschreibungen und Bemühungen. Hierzu verwenden wir die Bezeichner Objektelemente, Objektattribute usw. Wie aus der Abbildung 67 bereits ersichtlich ist, hat man es im Erarbeitungsprozess von XML-Dokumenten mit vier Sprachebenen zu tun. Die hierzu erforderlichen Sprachen und die in deren Anwendung entstehenden Dokumente kann man sich in Paketen zusammengeschnürt vorstellen. Den Paketzusammenhang in UML zeigt in übersichtlicher Form Abbildung 68.
293
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ ȱ ȱ
Backus-Naur
ȱ ȱ
Metasprache zur Beschreibung von Objektsprachen, z. B. XML Schema.
«werden syntaktisch beschrieben mit»
ȱ ȱ
XML Schema
ȱ ȱ
Datenbeschreibungssprache zur Erstellung von XML-Schemata, z. B. Schema Kunde.
«werden programmiert mit»
ȱ ȱ ȱ
XML-Schemata
Dokumentbeschreibungssprache zur Validierung von XML-Dokumenten.
ȱ ȱ
«werden validiert mit»
ȱ ȱ ȱ
XML-Dokumente
XML-Dokumente über Objekte der Realwelt validiert mit einem oder mehreren XML-Schemata.
ȱ
ȱ
Abbildungȱ68:ȱZusammenhangȱderȱSprachenȬȱundȱDokumentenpaketeȱ
10.2 Vom Modell bis zum validierten XML-Dokument FürȱdenȱEinstiegȱinȱXMLȱSchemaȱwählenȱwirȱeineȱpraxisorientierteȱStrategie.ȱDurchȱ einenȱ einfachenȱ Einstiegȱ inȱ dieȱ Anwendungȱ derȱ Spracheȱ sowieȱ inȱ dieȱ dahinterȱ stehendenȱ Konzepteȱ undȱ dieȱ hieraufȱ folgendeȱ schrittweiseȱ zunehmendeȱ ErfahȬ rungȱ gewinnenȱ wirȱ dieȱ erforderlicheȱ Übersicht,ȱ dieȱ zurȱ schnellenȱ Beherrschungȱ derȱneuenȱSpracheȱführt.ȱDeshalbȱbeginnenȱwirȱmitȱeinemȱsehrȱkleinenȱundȱeinfaȬ chenȱ XMLȬDokument,ȱ dasȱ vonȱ DB2ȱ validiertȱ inȱ dieȱ Spalteȱ Dokumentȱ derȱ Tabelleȱ Dokument_XMLȱgespeichertȱwird.ȱȱ
294ȱ
10.2ȱȱVomȱModellȱbisȱzumȱvalidiertenȱXMLȬDokumentȱ
Das Beispiel DasȱXMLȬDokumentȱlautetȱwieȱfolgt.ȱ hallo
Damitȱ dasȱ XMLȬDokumentȱ vomȱ DB2ȬValidiererȱ validiertȱ werdenȱ kann,ȱ mussȱ zunächstȱdasȱhierfürȱerforderlicheȱSchemaȱerstelltȱundȱsodannȱimȱSchemaȱReposiȬ toriumȱ(XSRȱ–ȱXMLȱSchemaȱRepository),ȱeinemȱTeilȱdesȱKatalogsȱvonȱDB2,ȱregisȬ triertȱ werden.ȱ Beimȱ Einfügenȱ desȱ XMLȬDokumentesȱ kannȱ sodannȱ derȱ Validiererȱ vonȱDB2ȱdasȱeinzufügendeȱDokumentȱdahingehendȱprüfen,ȱobȱseineȱBestandteileȱ denȱsyntaktischenȱVorgabenȱdesȱSchemasȱentsprechen.ȱImȱerfolgreichenȱFallȱwirdȱ dasȱXMLȬDokumentȱinȱseineȱinterneȱFormȱkonvertiertȱundȱalsȱXDMȬBaumȱinȱderȱ XMLȬSpalteȱDokumentȱgespeichert.ȱ Dasȱ Paketdiagrammȱ inȱ Abbildungȱ 68ȱ zeigtȱ grobȱ denȱ Zusammenhangȱ derȱ dreiȱ SprachebenenȱinȱUML,ȱdieȱbeiȱderȱVereinbarungȱeinesȱXMLȬSchemasȱundȱdessenȱ Ausprägungȱ inȱ Gestaltȱ einesȱ XMLȬDokumentsȱ betrachtetȱ werdenȱ müssen.ȱ Dasȱ Modellȱ derȱ Problemlösungȱ desȱ einführendenȱBeispielsȱ undȱdieȱ hierzuȱ erforderliȬ chenȱSprachmittelȱsowieȱErgebnisdokumenteȱsindȱinȱderȱAbbildungȱ69ȱdargestellt.ȱ
295ȱ
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ
Das Modell ȱ ȱ
XML Schema Sprache
Vereinbartes XML-Schema
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
XML Schema «Sprache» xs:schema + xmlns + targetNamespace «Sprache» xs:element + name «Sprache» xs:simpleType
ȱ ȱ ȱ
ȱ
«use»
«Element» Gruss
«instantiate»
XML-Dokument «Element» Gruss
«Sprache» xs:restriction + base
ȱ ȱ
XML-Schema GrussSchema
«Sprache» xs:minLength
1
«Wert» hallo
Ausgeprägtes XML-Dokument, das Sachverhalte der Realwert dokumentiert und unter Beachtung des XML-Schemas validiert ist.
+ value
ȱ ȱ ȱ ȱ
«Sprache» xs:maxLength + value
ȱ
Abbildungȱ69:ȱPaketdiagrammȱderȱdreiȱinvolviertenȱSprachebenenȱ
Das Schema in der Sprache XML Schema Dasȱ XMLȬSchemaȱ mitȱ demȱ Namenȱ GrussSchemaȱ wirdȱ mitȱ Anwendungȱ derȱ SpracheinrichtungenȱderȱSpracheȱXMLȱSchemaȱinȱProgrammȱ160ȱvereinbart.ȱDieseȱ Spracheinrichtungenȱ sindȱ ihrerseitsȱ inȱ derȱ Spracheȱ XMLȱ definiertȱ undȱ bestehenȱ somitȱvornehmlichȱausȱXMLȬElementenȱderȱSprachebeneȱundȱderenȱAttribute.ȱ Dieȱ Programmzeileȱ (1)ȱ enthältȱ dieȱ XMLȬDeklaration.ȱ Sieȱ istȱ einȱ VerarbeitungshinȬ weisȱ fürȱ denȱ DB2ȬParser,ȱ derȱ diesesȱ Schemaȱ aufȱ syntaktischeȱ Korrektheitȱ prüfenȱ soll.ȱImȱAttributȱversionȱ=ȱȈ1.0Ȉȱistȱfestgehalten,ȱdassȱesȱsichȱbeiȱderȱverwendetenȱ XMLȬSpracheȱ umȱ derenȱ Versionȱ 1.0ȱ handelt.ȱ Derzeitȱ gibtȱ esȱ nochȱ keineȱ neuereȱ
296ȱ
10.2ȱȱVomȱModellȱbisȱzumȱvalidiertenȱXMLȬDokumentȱ Version.ȱDasȱAttributȱencodingȱ=ȱȈUTFȬ8Ȉȱsagtȱaus,ȱdassȱdieȱinterneȱZeichenkodieȬ rungȱderȱDatei,ȱdieȱdasȱSchemaȱenthält,ȱimȱUnicodeȬZeichensatzȱkodiertȱist.ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15)
Programmȱ 160:ȱ Dasȱ XMLȬSchemaȱ GrussSchemaȱ vereinbartȱ mitȱ Sprachmittelnȱ derȱ SpraȬ cheȱXMLȱSchemaȱ
InȱdenȱProgrammzeilenȱ(2)ȱbisȱ(16)ȱwirdȱdasȱXMLȬSchemaȱmitȱdenȱSprachmittelnȱ derȱ Spracheȱ XMLȱ Schemaȱ vereinbart.ȱ Dieseȱ sindȱ imȱ Namensraumȱ http://www.ȱ w3.org/2001/XMLSchemaȱdeklariert.ȱInȱderȱProgrammzeileȱ(3)ȱwirdȱdieserȱNamensȬ raumȱ anȱ denȱ Namensraumpräfixȱ xsȱ gebunden.ȱ Hierzuȱ dientȱ dieȱ Formulierungȱ xmlns:xsȱ=ȱȈhttp://www.w3.org/2001/XMLSchemaȈ.ȱ Dasȱ Namensraumpräfixȱ xsȱ kannȱ manȱ sichȱ alsȱ eineȱ Variableȱ vorstellen,ȱ welcherȱ dieȱ Zeichenketteȱ desȱ NamensȬ raumesȱzugewiesenȱwird.ȱȱ Wirdȱ anschließendȱ dasȱ Namensraumpräfixȱ zurȱ Qualifikationȱ einesȱ ElementȬ namensȱverwendet,ȱsoȱwirdȱinternȱderȱzugewieseneȱNamensraumwertȱzurȱQualiȬ fikationȱeingesetzt.ȱDurchȱdiesesȱVorgehenȱwirdȱdieȱLesbarkeitȱvonȱqualifiziertenȱ Namenȱ durchȱ dieȱ Kürzeȱ derȱ Präfixeȱ gefördertȱ undȱ dieȱ interneȱ AuseinanderhalȬ tungȱderȱVokabularienȱdurchȱdieȱeinmaligenȱNamensraumwerteȱermöglicht.ȱȱ Nachȱ derȱ Bindungȱ desȱ Namensraumesȱ anȱ dasȱ Namensraumpräfixȱ könnenȱ dieȱ ElementȬȱ undȱ Datentypnamenȱ ausȱ demȱ Namensraumȱ derȱ Spracheȱ XMLȱ Schemaȱ durchȱdasȱPräfixȱxsȱqualifiziertȱgeschriebenȱwerden.ȱHiermitȱistȱleichtȱzuȱerkennen,ȱ ausȱwelchemȱNamensraumȱdieȱaktuelleȱVokabelȱstammt.ȱEinȱNamensraumpräfixȱ sollteȱ einenȱ semantischenȱ Bezugȱ zurȱ Bedeutungȱ desȱ hinterȱ ihmȱ stehendenȱ NaȬ mensraumesȱhaben.ȱDieȱBuchstabenfolgeȱxmlȱinȱbeliebigerȱGroßȬ/Kleinschriftȱdarfȱ jedochȱ nichtȱ alsȱ dieȱ erstenȱ dreiȱ Zeichenȱ zurȱ Bildungȱ desȱ Namensraumpräfixesȱ verwendetȱwerden.ȱDieȱBuchstabenfolgeȱistȱfürȱXMLȬeigeneȱZweckeȱreserviert.ȱ
297ȱ
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ Dieȱ Vereinbarungȱ einesȱ XMLȬSchemasȱ beginntȱ immerȱ mitȱ demȱ Spracheelementȱ schema.ȱEsȱistȱdasȱWurzelelementȱeinesȱXMLȬSchemaȬDokuments.ȱFürȱunsereȱeinȬ führendenȱ Zweckeȱ sindȱ derzeitȱ seineȱ zweiȱ Spracheattributeȱ xmlnsȱ undȱ targetNaȬ mespaceȱvonȱBedeutung.ȱWieȱobenȱdargestellt,ȱwirdȱmitȱdemȱAttributȱxmlns:xsȱderȱ Namensraumȱ http://www.w3.org/2001/XMLSchema,ȱ inȱ demȱ dieȱ SchemabeschreiȬ bungsspracheȱXMLȱSchemaȱdefiniertȱist,ȱanȱdasȱNamensraumpräfixȱxsȱgebunden.ȱ ImȱAttributȱtargetNamespaceȱwirdȱderȱBezeichnerȱfürȱdenȱNamensraumȱfestgelegt,ȱ derȱdasȱgeradeȱzuȱerstellendeȱSchemaȱbezeichnet.ȱImȱBeispielȱistȱesȱderȱNamensȬ raumȱ http://www.AlfredȬMoos.de/GrussSchema.xsd.ȱ Hierbeiȱ wirdȱ nochȱ bestimmt,ȱ dassȱ XMLȬDokumente,ȱ dieȱ zuȱ ihrerȱ Validierungȱ dasȱ aktuelleȱ Schemaȱ benötigen,ȱ denȱ imȱ Attributȱ targetNamespaceȱ angegebenenȱ Zielnamensraumȱ inȱ ihrenȱ eigenenȱ Namensraumzuordnungenȱ angebenȱ müssen.ȱ Hierdurchȱ habenȱ sieȱ dannȱ Zugriffȱ aufȱdasȱVokabularȱundȱdieȱhiermitȱverbundenenȱsyntaktischenȱFestlegungenȱdesȱ aktuellenȱ Schemas.ȱ Beispielsweiseȱ müssenȱ derȱ Attributwertȱ http://www.AlfredȬ Moos.de/GrussSchema.xsdȱ desȱ Attributsȱ targetNamespaceȱ imȱ aktuellenȱ SchemadoȬ kumentȱ undȱ derȱ Attributwertȱ desȱ Attributsȱ xmlnsȱ inȱ einemȱ Objektelementȱ einesȱ XMLȬDokumentsȱidentischȱsein.ȱ Beispielȱ FestlegungȱimȱSchema:ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23)
Programmȱ165:ȱDasȱXMLȬSchemaȱGrussSchemaȱmitȱglobalemȱTyp
DerȱbenannteȱTypȱTypGrussȱwirdȱinȱdenȱProgrammzeilenȱ(10)ȱbisȱ(14)ȱdefiniert.ȱInȱ Zeileȱ (20)ȱ wirdȱ dieserȱ benutzerdefinierteȱ Typȱ zurȱ Typisierungȱ desȱ Inhaltsȱ desȱȱ ElementtypsȱGrussȱverwendet.ȱ AnschließendȱwirdȱdasȱSchemaȱinȱdieȱDateiȱGrussSchema.xsdȱgespeichert.ȱMitȱdemȱ DB2ȬBefehlȱ REGISTERȱ XMLSCHEMAȱ wirdȱ dasȱ sodannȱ inȱ derȱ Dateiȱ GrussScheȬ ma.xsdȱgespeicherteȱSchemaȱwiederȱinȱdasȱXSRȱgeladen,ȱsieheȱProgrammȱ161.ȱAnȬ schließendȱ kannȱ dasȱ Schemaȱ zurȱ Validierungȱ schemakompatiblerȱ XMLȬDokuȬ menteȱverwendetȱwerden,ȱsieheȱProgrammȱ163.ȱ NachdemȱdieȱprinzipielleȱVereinbarungȱundȱAnwendungȱeinfacherȱbenutzerdefiȬ nierterȱ Typenȱinȱihrenȱbenanntenȱ undȱanonymenȱSpielartenȱbekanntȱist,ȱwirdȱanȱ einemȱüberschaubarenȱBeispielȱdasȱgleicheȱmitȱkomplexenȱTypenȱuntersucht.ȱ
10.3.3 Komplexer Typ Wieȱbereitsȱeinführendȱdargelegtȱwurde,ȱliegtȱeineȱkomplexeȱTypdefinitionȱdannȱ vor,ȱwennȱunterschiedlicheȱeinfacheȱTypenȱaufȱeinerȱHierarchieebeneȱunterȱeinemȱ gemeinsamenȱ Namenȱ zuȱ Gruppenȱ zusammengefasstȱ werden.ȱ Weiterhin,ȱ wennȱ hierarchischeȱ Typstrukturenȱ definiertȱ werden.ȱ Undȱ ebenso,ȱ wennȱ einfacheȱ Texteȱ undȱXMLȬElementeȱunterȱeinemȱXMLȬElementȱgemischtȱerlaubtȱwerden.ȱSchließȬ lichȱ gehörtȱ nochȱ dieȱ Definitionȱ vonȱ einemȱ Elementtypȱ mitȱ Attributtypenȱ zuȱ denȱ komplexenȱTypdefinitionen.ȱ Imȱ folgendenȱ Beispielȱ sollȱ dasȱ Schemaȱ zurȱ Validierungȱ einesȱ XMLȬDokumentesȱ erarbeitetȱ werden,ȱ dasȱ dieȱ Rechnungsdatenȱ einesȱ Kundenȱ enthält.ȱ Damitȱ dasȱ
304ȱ
10.3ȱȱZentraleȱSprachkonstrukteȱ–ȱeineȱAuswahlȱ Schemaȱnichtȱzuȱumfangreichȱwird,ȱsollenȱvonȱeinemȱKundenȱlediglichȱdieȱKunȬ dennummerȱ alsȱ Elementattributȱ undȱ dessenȱ Anrede,ȱ Vornameȱ undȱ Zunameȱ alsȱ XMLȬElementeȱ imȱ Dokumentȱ erlaubtȱ sein.ȱ Vonȱ seinenȱ Rechnungenȱ werdenȱ dieȱ Rechnungsnummer,ȱdasȱRechnungsdatumȱundȱderȱRechnungsbetragȱjeȱalsȱXMLȬ Elementȱ zugelassen.ȱ Einzelheitenȱ sindȱ imȱ Modellȱ desȱ Schemasȱ inȱ derȱ Spracheȱ UMLȱinȱAbbildungȱ70ȱdargestellt.ȱ Aufȱ derȱ rechtenȱ Seiteȱ desȱ Modellsȱ sindȱ dieȱ benutzerdefiniertenȱ Datentypenȱ alsȱ einfacheȱ Typenȱ (simpleType)ȱ aufgeführt.ȱ Dieȱ Namenȱ derȱ benutzerdefiniertenȱ TyȬ penȱ beginnenȱ mitȱ demȱ Präfixȱ Typ_.ȱ Hierdurchȱ sindȱ dieȱ Typbezeichnerȱ sofortȱ alsȱ solcheȱerkennbarȱundȱnichtȱmitȱdenȱBezeichnernȱfürȱElementeȱundȱderenȱAttributeȱ zuȱ verwechseln.ȱ Derȱ jeweiligeȱ Basistypȱ undȱ dieȱ aufȱ diesemȱ aufbauendenȱ einȬ schränkendenȱ Fassettenȱ sindȱ inȱ denȱ UMLȬKommentarenȱ aufgeführt.ȱ Soȱ istȱ beiȬ spielsweiseȱ derȱ einfacheȱ Datentypȱ Typ_Kunde_Nrȱ eineȱ Einschränkungȱ desȱ inȱ derȱ Spracheȱ XMLȱSchemaȱ eingebautenȱ Datentypsȱ xs:sting.ȱ Dieȱ Einschränkungȱ bestehtȱ darin,ȱ dassȱ dieȱ Längeȱ einesȱ durchȱ denȱ Typȱ definiertenȱ Kundennummernwertesȱ aufȱdieȱfesteȱLängeȱvonȱvierȱZeichenȱfestgelegtȱist.ȱDieȱhierzuȱvorgeseheneȱFassetteȱ heißtȱimȱBeispielȱlengthȱ=ȱȈ4Ȉ.ȱ DieȱDatentypenȱsindȱmitȱdenȱSchemaelementenȱundȱSchemaattributenȱverbunden.ȱ HierzuȱdientȱdieȱAbhängigkeitsbeziehungȱvonȱUML.ȱSieȱwirdȱmitȱeinemȱgestrichelȬ tenȱPfeilȱdargestellt,ȱderȱvomȱabhängigenȱSchemaelementȱbzw.ȱSchemaattributȱaufȱ denȱ benutzerdefiniertenȱ Datentypȱ zeigt.ȱ Mitȱ derȱ Abhängigkeitsbeziehung,ȱ dieȱ manȱ auchȱ alsȱ Benutztbeziehungȱ bezeichnet,ȱ wirdȱ ausgedrückt,ȱ dassȱ Änderungenȱ amȱ Datentypȱ auchȱ Änderungenȱ anȱ denȱ vonȱ ihmȱ definiertenȱ Schemaelementenȱ undȱSchemaattributenȱzurȱFolgeȱhaben.ȱ Einȱ komplexesȱ Schemaelementȱ liegtȱ unterȱ anderemȱ auchȱ dannȱ vor,ȱ wennȱ seinȱ InhaltȱselbstȱausȱihmȱhierarchischȱuntergeordnetenȱSchemaelementenȱbesteht.ȱAufȱ diesenȱSachverhaltȱbeziehtȱsichȱunserȱBeispiel.ȱXMLȱSchemaȱbietetȱSprachmittelȱan,ȱ mitȱdenenȱfestlegbarȱist,ȱobȱdieȱuntergeordnetenȱXMLȬElementeȱinȱeinerȱvorgegeȬ benenȱReihenfolgeȱaufgeführtȱwerdenȱmüssenȱoderȱobȱsieȱinȱeinerȱbeliebigenȱReiȬ henfolgeȱerscheinenȱkönnen.ȱDieȱfesteȱReihenfolgeȱwirdȱalsȱeineȱSequenzȱbezeichȬ net.ȱDieȱbeliebigeȱFolgeȱwirdȱalsȱeineȱKollektionȱundȱeineȱAuswahlȱbezeichnet.ȱBeiȱ einerȱKollektionȱmüssenȱdieȱXMLȬElementeȱimȱXMLȬDokumentȱaufgeführtȱwerden.ȱ Beiȱ derȱAuswahlȱkönnenȱsieȱerscheinen.ȱInȱunseremȱBeispielȱ werdenȱ dieȱ untergeȬ ordnetenȱ XMLȬElementeȱ alsȱ Sequenzenȱ festgelegt.ȱ Ihreȱ Reihenfolgeȱ istȱ inȱ AbbilȬ dungȱ70ȱmitȱeinerȱReihenfolgenummerȱinȱgeschweiftenȱKlammernȱüberȱdenȱKomȬ positionsbeziehungenȱ angegeben.ȱ Dasȱ Klassensymbolȱ mitȱ demȱ Stereotypȱ ȱ istȱ einȱ virtuellerȱ Modellknoten,ȱ fürȱ denȱ esȱ imȱ ausgeprägtenȱ XMLȬ Dokumentȱ aufȱ derȱ Objektebeneȱ keineȱ Entsprechungȱ gib.ȱ Erȱ dientȱ lediglichȱ alsȱ konzeptionelleȱ Sequenzklammerȱ umȱ dieȱ vonȱ ihmȱ direktȱ abhängigenȱ SchemaeleȬ menteȱ zusammenzuhalten,ȱz.ȱ B.ȱdieȱ ElementeȱAnrede,ȱVorname,ȱZunameȱundȱRechȬ nungen.ȱ ȱ
305ȱ
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ ȱ ȱ
«complex» Kunde
ȱ
+ Kunde_Nr
{base = "xs:sting" length = "4"} «simpleType» Typ_Kunde_Nr
ȱ ȱ ȱ
{base = "xs:string" length = "4"}
1 «sequence» Seq_Kunde
{1} 1
ȱ
{2}
ȱ
1
ȱ ȱ ȱ ȱ ȱ ȱ ȱ
{3} 1
{4} 1
«element» Anrede
«simpleType» Typ_Anrede
«element» Vorname
{base = "xs:string" maxLength = "15"}
«element» Zuname
«simpleType» Typ_Name
«complex» Rechnungen {base = "xs:string" length = "4"
* «sequence» Seq_Rechnung
{1} 1
{2} 1
ȱ
{3}
ȱ
1
ȱ ȱ
«element» Rechnung_Nr
«simpleType» Typ_Rechnung_Nr
«element» Datum
«simpleType» Typ_Datum
«element» Betrag
«simpleType» Typ_Betrag
{base = "xs:date"
{base = "xs:decimal" totalDigits = "11" fractionDigits = "2"
ȱ ȱ Abbildungȱ70:ȱKomplexesȱDokumentschemaȱKundeȱundȱseineȱRechnungenȱ
Derȱ Bauplanȱ desȱ XMLȬSchemasȱ wirdȱ sodannȱ imȱ Sprachvorratȱ vonȱ XMLȱ Schemaȱ formuliert.ȱDasȱhierbeiȱsichȱergebendeȱSchemaprogrammȱistȱinȱzweiȱTeilenȱdargeȬ stellt.ȱDerȱersteȱTeil,ȱProgrammȱ166,ȱbestehtȱimȱwesentlichenȱausȱdenȱDefinitionenȱ derȱ benutzerdefiniertenȱ Datentypen.ȱ Dieseȱ werdenȱ sodannȱ imȱ zweitenȱ Teil,ȱ inȱ Programmȱ168ȱverwendet,ȱumȱdieȱElementinhalteȱundȱdenȱAttributwertȱzuȱtypiȬ sieren.ȱ
306ȱ
10.3ȱȱZentraleȱSprachkonstrukteȱ–ȱeineȱAuswahlȱ ȱ
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47)
Programmȱ166:ȱXMLȬSchemaȱKundeȱundȱseineȱRechnungenȱ–ȱbenutzerdefinierteȱDatenȬ typenȱ
InȱdenȱProgrammzeilenȱ(2)ȱbisȱ(9)ȱvonȱProgrammȱ166ȱwirdȱdasȱSchemaȱvereinbart.ȱ Zuȱ denȱ bereitsȱ bekanntenȱ Sprachbestandteilenȱ desȱ Spracheelementsȱ ȱ kommtȱ nochȱ dasȱ Attributȱ elementFormDefaultȱ =ȱ ȈqualifiedȈȱ hinzu.ȱ Hiermitȱ wirdȱ festgelegt,ȱ dassȱ inȱ denȱ XMLȬDokumentenȱ aufȱ derȱ Objektebeneȱ qualifizierteȱ EleȬ
307ȱ
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ mentnamenȱ zuȱ verwendenȱ sind.ȱ Dieseȱ bestehenȱ ausȱ denȱ dortȱ vereinbartenȱ NaȬ mensraumpräfixenȱundȱdenȱimȱSchemaȱdeklariertenȱElementnamen.ȱ DieȱverkürzteȱSyntaxȱvonȱȱzeigtȱdieȱfolgendeȱSyntaxbeschreibung.ȱ ȱ ȱ ȱ ȱ
Syntaxȱ36:ȱSpracheelementȱȱ
InȱdenȱProgrammzeilenȱ(11)ȱbisȱ(47)ȱsindȱdieȱbenutzerdefiniertenȱDatentypenȱdeȬ finiert.ȱ Sieȱ stehenȱ direktȱ nachȱdemȱSpracheelementȱȱ undȱ werdenȱdurchȱ einenȱNamenȱ bezeichnet.ȱJederȱDatentypnameȱbeginntȱmitȱ derȱVorsilbeȱTyp_ȱgeȬ folgtȱvomȱeigentlichenȱNamen.ȱSomitȱhandeltȱesȱsichȱumȱbenannteȱDatentypen,ȱdieȱ globalȱimȱgesamtenȱSchemaȱbekannt,ȱd.ȱh.ȱsichtbarȱsind.ȱDieȱDatentypnamenȱsindȱ hierbeiȱ allgemeinȱ gesprochenȱ dieȱ Begriffsnamen.ȱ Dieȱ zurȱ näherenȱ DatentypbeȬ stimmungȱ verwendetenȱ Fassettenȱ sindȱ allgemeinȱ gesprochenȱ dieȱ Intensionenȱ desȱ definiertenȱBegriffs.ȱ AmȱBeispielȱdesȱbenutzerdefiniertenȱTypsȱTyp_AnredeȱinȱdenȱProgrammzeilenȱ(18)ȱ bisȱ(24)ȱwirdȱderȱZusammenhangȱnäherȱerläutert.ȱMitȱdemȱAttributwertȱdesȱAttriȬ butsȱnameȱinȱZeileȱ(18)ȱwirdȱderȱBegriffsname,ȱd.ȱh.ȱderȱNameȱdesȱDatentypsȱfestȬ gelegt.ȱ SeineȱIntensionen,ȱd.ȱ h.ȱdieȱihnȱdefinierendenȱEigenschaften,ȱ werdenȱ ihmȱ inȱ denȱ Zeilenȱ (19)ȱ bisȱ (22)ȱ inȱ Gestaltȱ vonȱ Fassettenȱ zugeordnet.ȱ Diesȱ istȱ zunächstȱ derȱeingebauteȱBasistypȱxs:stringȱinȱderȱZeileȱ(19)ȱmitȱHilfeȱdesȱAttributsȱbaseȱdesȱ Spracheelementsȱ.ȱDieȱEinschränkungȱderȱmöglichenȱWerteȱdesȱDatenȬ typsȱTyp_AnredeȱerfolgtȱinȱzweiȱSchritten.ȱZuerstȱwirdȱmitȱderȱFassetteȱȱ dieȱLängeȱderȱmöglichenȱZeichenkettenȱaufȱvierȱZeichenȱeingeschränkt.ȱImȱzweiȬ tenȱSchrittȱwerdenȱmitȱderȱzweimaligenȱAnwendungȱderȱFassetteȱȱ dieȱ zulässigenȱ Werteȱ festgelegt.ȱ Inȱ derȱ herkömmlichenȱ Datenbanktechnikȱ beȬ zeichnetȱmanȱdiesȱauchȱmitȱFestlegungȱderȱDomäneȱbzw.ȱmitȱbenutzerdefinierterȱ Integrität.ȱ DieȱzurȱDefinitionȱderȱweiternȱDatentypenȱverwendetenȱFassettenȱsindȱimȱGroßenȱ undȱ Ganzenȱ selbsterklärendȱ undȱ solltenȱ inȱ derȱ Systemliteraturȱ nachgeschlagenȱ werdenȱ[W3C04b].ȱ Dieȱ Deklarationȱ derȱ Schemaelementeȱ undȱ desȱ Attributsȱ kannȱ nunȱ unterȱ BezugȬ nahmeȱ aufȱ dieȱ globalȱ bekanntenȱ benutzerdefiniertenȱ Datentypenȱ übersichtlichȱ vorgenommenȱwerden.ȱ Derȱ Bezeichnerȱ desȱ Wurzelelementsȱ desȱ Schemasȱ wirdȱ mitȱ demȱ Attributȱ nameȱ=ȱ ȈKundeȈȱ inȱ derȱ Zeileȱ (49)ȱ vonȱ Programmȱ 168ȱ festgelegt.ȱ Dasȱ Programmȱ istȱ dieȱ Fortsetzungȱ vonȱ Programmȱ 166.ȱ Dasȱ Wurzelelementȱ istȱ einȱ komplexerȱ Typ,ȱ daȱ seinȱElementinhaltȱausȱmehrerenȱihmȱhierarchischȱuntergeordnetenȱXMLȬElemenȬ
308ȱ
10.3ȱȱZentraleȱSprachkonstrukteȱ–ȱeineȱAuswahlȱ tenȱ besteht,ȱ dieȱ inȱ Formȱ einerȱ Sequenzȱ aufgereihtȱ sind.ȱ Inȱ XMLȱ Schemaȱ verstehtȱ manȱunterȱeinerȱSequenzȱeineȱFolgeȱvonȱXMLȬElementen,ȱderenȱReihenfolgeȱfestȬ gelegtȱ ist.ȱ Derȱ komplexeȱ Typȱ inȱ Zeileȱ (50)ȱ hatȱ keinenȱ Namen.ȱ Dadurchȱ istȱ erȱ einȱ anonymerȱTyp.ȱErȱwirdȱanȱOrtȱundȱStelleȱseinerȱVerwendungȱdurchȱdieȱAufzähȬ lungȱseinerȱDefinitionsbestandteileȱ(Intensionen)ȱdefiniert.ȱDieseȱbestehenȱausȱallȱ denȱAngabenȱvonȱProgrammzeileȱ(51)ȱbisȱ(84).ȱ DieȱverkürzteȱSyntaxȱvonȱȱzeigtȱdieȱfolgendeȱSyntaxbeschreibung.ȱ ȱ ȱ ȱ ȱ ȱ
{einfacher Inhalt | komplexer Inhalt} komplexer Inhalt: [{Sequenz | Kollektion | Auswahl}] [Attribute]
Syntaxȱ37:ȱSpracheelementȱȱ
ImȱfolgendenȱBeispielȱinȱProgrammȱ168ȱliegtȱeinȱkomplexerȱInhaltȱmitȱgeschachȬ teltenȱSequenzenȱundȱeinemȱAttributȱvor.ȱ EineȱSequenzȱwirdȱmitȱdemȱSpracheelementȱȱeingeleitet.ȱDieȱReiȬ henfolgeȱ derȱ inȱ ihmȱ enthaltenenȱ Inhalte,ȱ d.ȱ h.ȱ XMLȬElemente,ȱ istȱ auchȱ fürȱ dieȱ XMLȬDokumenteȱaufȱderȱObjektebeneȱmaßgebend.ȱ DieȱverkürzteȱSyntaxȱvonȱȱzeigtȱdieȱfolgendeȱSyntaxbeschreibung.ȱ ȱ ȱ ȱ ȱ
[Inhaltsbeschreibung]
Syntaxȱ38:ȱSpracheelementȱȱ
DieȱgeschachtelteȱSequenzȱabȱProgrammzeileȱ(63)ȱbisȱ(81)ȱbestehtȱausȱnullȱbisȱunȬ begrenztȱvielenȱXMLȬElementenȱvomȱTypȱRechnung.ȱDiesȱistȱinȱdenȱZeilenȱ(63)ȱbisȱ (66)ȱmitȱdenȱminOccursȬȱundȱmaxOccursȬAttributenȱfestgelegt.ȱDadurchȱkönnenȱimȱ XMLȬDokumentȱ aufȱ derȱ Objektebeneȱhierarchischȱunterhalbȱ einesȱ Kundenȱ belieȬ bigȱvieleȱXMLȬElementeȱvomȱTypȱRechnungȱdargestelltȱwerden.ȱ Dasȱ Spracheelementȱ namensȱ elementȱ istȱ dasȱ zentraleȱ Sprachkonstruktȱ vonȱ XMLȱ Schema.ȱ Mitȱ ihmȱ wirdȱ dasȱ wichtigsteȱ Sprachkonstruktȱ vonȱ XML,ȱ nämlichȱ dasȱ XMLȬElementȱ deklariert.ȱ Seineȱ Syntaxȱ istȱ rechtȱ umfangreich.ȱ Fürȱ unsereȱ einfühȬ rendenȱZweckeȱinȱdieȱSpracheȱXMLȱSchemaȱwirdȱwiederumȱnurȱeinȱkleinerȱAusȬ zugȱausȱderȱSyntaxȱhierȱbeschrieben.ȱ DieȱverkürzteȱSyntaxȱvonȱȱzeigtȱdieȱfolgendeȱSyntaxbeschreibung.ȱ
309ȱ
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ ȱ ȱ ȱ ȱ
[Inhaltsbeschreibung]
Syntaxȱ39:ȱSpracheelementȱȱ
NachdemȱdieȱwichtigstenȱSpracheinrichtungenȱvonȱXMLȱSchemaȱbekanntȱsind,ȱistȱ nunȱdasȱSchemabeschreibungsprogrammȱinȱeinerȱDateiȱabzuspeichern.ȱAlsȱDateiȬ nameȱwählenȱwirȱKundeRechnungSchema.xsdȱundȱspeichernȱdieȱDateiȱimȱDateipfadȱ c:/XML_Schemata/KundeRechnungSchema.xsd.ȱ ImȱfolgendenȱArbeitsschrittȱwirdȱdasȱSchemaȱimȱXSRȱvonȱDB2ȱkatalogisiert.ȱVorȱ derȱAusführungȱdesȱDB2ȬBefehlsȱREGISTERȱinȱProgrammzeileȱ(3)ȱwirdȱmitȱdemȱ SQLȬBefehlȱ DROPȱXSROBJECTȱ dafürȱ gesorgt,ȱ dassȱ einȱ Schemaȱ mitȱ identischemȱ NamenȱnichtȱbereitsȱimȱXSRȱvorhandenȱist.ȱ ȱ DROP XSROBJECT KundeRechnungSchema ; REGISTER XMLSCHEMA 'http://www.Alfred-Moos.de/KundeRechnungSchema.xsd' FROM 'file://c:/XML_Schemata/KundeRechnungSchema.xsd' AS KundeRechnungSchema COMPLETE ;
(1) (2) (3) (4) (5) (6) (7) (8)
Programmȱ167:ȱRegistrierenȱdesȱSchemasȱKundeRechnungSchemaȱimȱXSRȱ
310ȱ
(48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67)
10.3ȱȱZentraleȱSprachkonstrukteȱ–ȱeineȱAuswahlȱ
(68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81) (82) (83) (84) (85) (86) (87) (88) (89) (90)
Programmȱ168:ȱXMLȬSchemaȱKundeȱundȱseineȱRechnungenȱ–ȱSchemaelementeȱundȱScheȬ maattributȱ
Nachȱ erfolgreicherȱ Registrierungȱ desȱ Schemasȱ KundeRechnungSchemaȱ könnenȱ XMLȬDokumenteȱderȱObjektebeneȱinȱdieȱXMLȬSpalteȱDokumentȱgeladenȱwerden.ȱȱ DasȱProgrammȱ169ȱlöschtȱinȱdenȱZeilenȱ(1)ȱbisȱ(3)ȱzunächstȱalleȱDatenȱinȱderȱTabelȬ leȱ Dokument_XML,ȱ umȱ doppelteȱ Primärschlüsselwerteȱ zuȱ vermeiden.ȱ Bevorȱ dieȱ eingebauteȱ SQL/XMLȬFunktionȱ XMLVALIDATE()ȱ inȱ derȱ Zeileȱ (10)ȱ denȱ ValidieȬ rungsprozessȱ unterȱ Beachtungȱ derȱ syntaktischenȱ Vorgabenȱ desȱ Schemasȱ KundeȬ RechnungSchema,ȱdasȱinȱZeileȱ(37)ȱangegebenȱist,ȱdurchführenȱkann,ȱmussȱdieȱexȬ terneȱ zeichenartigeȱ Formȱ desȱ XMLȬDokumentsȱ inȱ seineȱ interneȱ Formȱ alsȱ XDMȬ Baumȱ konvertiertȱ werden.ȱ Diesenȱ Konvertierungsprozessȱ besorgtȱ dieȱ eingebauteȱ SQL/XMLȬFunktionȱXMLPARSE()ȱinȱProgrammzeileȱ(11).ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
311ȱ
10ȱȱXMLȬDatenȱdefinierenȱ–ȱXMLȱSchemaȱ DELETE FROM Dokument_XML ; INSERT INTO Dokument_XML (Dokument_XML_Nr, Dokument) VALUES ( 'D001', XMLVALIDATE( XMLPARSE( DOCUMENT ' Herr Hugo Müller R001 2008-04-04 13000.00 R001 2008-04-05 2000.00 ' ) ACCORDING TO XMLSCHEMA ID KundeRechnungSchema ) ) ;
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40)
Programmȱ169:ȱXMLȬDokumentȱparsen,ȱvalidierenȱundȱladenȱ
Dieȱ Zuordnungȱ desȱ Vokabularsȱ zumȱ Namensraumȱ http://www.AlfredȬMoos.de/ȱ KundeRechnungSchema.xsdȱwirdȱdurchȱdieȱVerwendungȱvonȱqualifiziertenȱNamenȱ derȱXMLȬElementeȱerreicht.ȱHierzuȱwirdȱinȱdenȱProgrammzeilenȱ(16)ȱundȱ(17)ȱdasȱ Namensraumpräfixȱ moȱ mitȱ demȱ Namensraumȱ verbunden.ȱ Dassȱ inȱ denȱ XMLȬ Dokumentenȱ aufȱ derȱ Objektebeneȱ qualifizierteȱ Namenȱ anzuwendenȱ sind,ȱ wurdeȱ inȱderȱSchemavereinbarungȱinȱProgrammȱ166ȱmitȱdemȱAttributȱelementFormDefaultȱ =ȱȈqualifiedȈȱinȱdenȱProgrammzeilenȱ(7)ȱundȱ(8)ȱfestgelegt.ȱ ȱ
312ȱ
10.4ȱȱÜbungenȱ
10.4 Übungen 12) ErarbeitenȱSieȱeinȱSchemaȱfürȱdieȱValidierungȱeinesȱKundendokumentesȱmitȱ benanntenȱTypen.ȱ RegistrierenȱSieȱdasȱSchemaȱundȱladenȱSieȱeinȱvalidiertesȱDokument.ȱ 13) ErarbeitenȱSieȱeinȱSchemaȱfürȱdieȱValidierungȱeinesȱKundendokumentesȱmitȱ anonymenȱTypen.ȱȱ RegistrierenȱSieȱdasȱSchemaȱundȱladenȱSieȱeinȱvalidiertesȱDokument.ȱ 14) ErarbeitenȱSieȱeinȱSchemaȱfürȱdieȱValidierungȱeinesȱRechnungsdokumentesȱ mitȱbenanntenȱTypen.ȱȱ RegistrierenȱSieȱdasȱSchemaȱundȱladenȱSieȱeinȱvalidiertesȱDokument.ȱ 15) ErarbeitenȱSieȱeinȱSchemaȱfürȱdieȱValidierungȱeinesȱRechnungsdokumentesȱ mitȱanonymenȱTypen.ȱȱ RegistrierenȱSieȱdasȱSchemaȱundȱladenȱSieȱeinȱvalidiertesȱDokument.ȱ 16) ErarbeitenȱSieȱeinȱSchemaȱfürȱdieȱValidierungȱeinesȱArtikeldokumentesȱmitȱ benanntenȱTypen.ȱȱ RegistrierenȱSieȱdasȱSchemaȱundȱladenȱSieȱeinȱvalidiertesȱDokument.ȱ 17) ErarbeitenȱSieȱeinȱSchemaȱfürȱdieȱValidierungȱeinesȱArtikeldokumentesȱmitȱ anonymenȱTypen.ȱȱ RegistrierenȱSieȱdasȱSchemaȱundȱladenȱSieȱeinȱvalidiertesȱDokument.ȱ 18) ErarbeitenȱSieȱeinȱSchemaȱfürȱdieȱValidierungȱeinesȱDokumentes,ȱdasȱalleȱ KundenȬ,ȱRechnungsȬ,ȱPositionsdatenȱenthältȱmitȱbenanntenȱTypen.ȱȱ RegistrierenȱSieȱdasȱSchemaȱundȱladenȱSieȱeinȱvalidiertesȱDokument.ȱ
313ȱ
Literaturverzeichnis BCF99ȱ
Booch,ȱG.,ȱu.ȱa.:ȱUMLȱforȱXMLȱSchemaȱMappingȱSpecification,ȱRationalȱ SoftwareȱCorp.,ȱ1999,ȱhttp://www.oasisȬopen.org/cover/fuchsȬ uml_xmlschema33.pdfȱ
BJR97ȱ
Booch,ȱG.,ȱu.ȱa.:ȱTheȱUnifiedȱModelingȱLanguageȱUserȱGuide,ȱReading,ȱ1998ȱ
CD01ȱ
Carlson,ȱD.:ȱModelingȱXMLȱApplicationsȱWithȱUML,ȱAddisonȬWesley,ȱ2001ȱ
CHE76ȱ
Chen,ȱP.ȱS.:ȱTheȱEntityȬRelationshipȱModelȱ–ȱTowardȱaȱUnifiedȱViewȱofȱ Data,ȱACMȱTransactionsȱonȱDatabaseȱSystems,ȱVol.ȱ1,ȱNo.ȱ1,ȱPagesȱ9ȱ–ȱ36,ȱ Marchȱ1976ȱ
COD70ȱ
Codd,ȱF.ȱE.:ȱAȱRelationalȱModelȱofȱDataȱforȱLargeȱSharedȱDataȱBanks,ȱ CommunicationsȱofȱtheȱACM,ȱVol.ȱ13,ȱNo.ȱ6,ȱPagesȱ377ȱ–ȱ387,ȱ1970ȱ
DIN2330ȱ
BegriffeȱundȱBenennungen;ȱAllgemeineȱGrundsätzeȱ
DIN44300ȱ
Informationsverarbeitung;ȱBegriffe,ȱBerlin,ȱ1988ȱ
DIN66262ȱ
Informationsverarbeitung;ȱProgrammkonstrukteȱzurȱBildungȱvonȱProȬ grammenȱmitȱabgeschlossenenȱZweigen,ȱBerlin,ȱ1985ȱȱ
ERES04ȱ
Eckstein,ȱR.ȱu.ȱS.:ȱXMLȱundȱDatenmodellierung,ȱHeidelberg,ȱ2004ȱ
GBCLN03ȱ
McGovern,ȱJ.,ȱBothner,ȱP.,ȱCagle,ȱK.,ȱLinn,ȱJ.,ȱNagarajan,ȱV.:ȱXQuery,ȱKickȱ Start,ȱIndianapolis,ȱ2003ȱ
HKS07ȱ
Hitzler,ȱP.ȱu.ȱa.:ȱSemanticȱWeb,ȱBerlinȱHeidelberg,ȱ2008ȱ
IBM06aȱ
IBM:ȱSQLȱReferenceȱVolumeȱ1ȱundȱVolumeȱ2,ȱFormȱSC10Ȭ4249Ȭ00ȱundȱ SC10Ȭ4250Ȭ00,ȱ2006ȱ
IBM06bȱ
IBM:ȱXMLȱGuide,ȱFormȱSC10Ȭ4254Ȭ00,ȱ2006ȱ
IBM07aȱ
IBM:ȱDB2ȱ9ȱpureXMLȱGuide,ȱFormȱNr.ȱSG24Ȭ7315Ȭ01,ȱ2007ȱ
IBM07bȱ
IBM:ȱpureXMLȱȬȱHandbuch,ȱFormȱSC12Ȭ3930Ȭ00,ȱ2007ȱ
IET96ȱ
IETFȱ(TheȱInternetȱEngineeringȱTaskȱForce),ȱRFCȱ2045:ȱMulitpurposeȱInterȬ netȱMailȱExtensionsȱ(MIME)ȱPartȱOne:ȱFormatȱofȱInternetȱMessageȱBodies,ȱ http://www.ietf.org/rfc/rfc2045.txt,ȱ1996ȱ
ISO03ȱ
ISO/IEC:ȱInformationȱtechnologyȱȬȱDatabaseȱlanguagesȱ–ȱSQLȱ–ȱPartȱ14:ȱ XMLȬRelatedȱSpecificationsȱ(SQL/XML),ȱDecemberȱ2003,ȱISO/IECȱ9075Ȭ 14:2003ȱ(E),ȱInternationalȱStandardȱ
ISO8601ȱ
ISO:ȱDataȱelementsȱandȱinterchangeȱformatsȱȬȱInformationȱinterchangeȱȬȱ Representationȱofȱdatesȱandȱtimes,ȱThirdȱeditionȱ2004Ȭ12Ȭ01,ȱInternationalȱ OrganizationȱforȱStandardization,ȱGenf,ȱ2004ȱ
ȱ315
Literaturverzeichnisȱ ISO88ȱ
ISOȱ8879:1986(E):ȱInformationȱprocessingȱ–ȱTextȱandȱOfficeȱSystemsȱ–ȱ StandardȱGeneralizedȱMarkupȱLanguageȱ(SGML),ȱ1stȱed.ȱOct.ȱ15,ȱ1986,ȱ InternationalȱOrganizationȱforȱStandardization,ȱGenf,ȱ1986ȱ
LS04ȱ
Lehner,ȱW,ȱSchöning,ȱH:ȱXQuery,ȱGrundlagenȱundȱfortgeschritteneȱMethoȬ den,ȱHeidelberg,ȱ2004ȱ
MFM04ȱ
Manola,ȱF.,ȱMiller,ȱE.:ȱResourceȱDescriptionȱFrameworkȱ(RDF),ȱRDFȱPrimer,ȱ W3CȱRecommendationȱ10ȱFebruaryȱ2004,ȱhttp://www.w3.org/TR/rdfȬ primer/,ȱAbrufȱ20.11.2007ȱ
MOO04ȱ
Moos,ȱA.:ȱDatenbankȬEngineering,ȱWiesbaden,ȱ2004ȱ
NB04ȱ
Blum,ȱN.:ȱAlgorithmenȱundȱDatenstrukturen,ȱMünchen,ȱ2004ȱ
NM07ȱ
Nicola,ȱM.,ȱJain,ȱU.:ȱUpdateȱXMLȱinȱDB2ȱ9.5,ȱIBMȱDeveloperWorks,ȱ 10.11.2007,ȱ http://www.ibm.com/developerworks/db2/library/techarticle/dmȬ 0710nicola/?S_TACT=105AGX11&S_CMP=LP#downloadȱ
NW83ȱ
N.ȱWirth,ȱAlgorithmenȱundȱDatenstrukturen,ȱ3.,ȱüberarbeiteteȱAufl.,ȱStuttȬ gart,ȱ1983ȱ
NWG98ȱ
NetworkȱWorkingȱGroupȱ(T.ȱBernersȬLee):ȱRFCȱ2396:ȱUniformȱResourceȱ Identifiersȱ(URI):ȱGenericȱSyntax,ȱhttp://www.ietf.org/rfc/rfc2396.txt,ȱ1998ȱ
SCM06ȱ
Saracco,ȱC.ȱM.:ȱDevelopȱJavaȱapplicationsȱforȱDB2ȱXMLȱdata,ȱhttp://wwwȬ 128.ibm.com/developerworks/db2/library/techarticle/dmȬ0605saracco/,ȱ2006ȱ
Sch03ȱ
Schöning,ȱH.:ȱXMLȱundȱDatenbanken,ȱMünchenȱWien,ȱ2003ȱ
SS06ȱ
G.ȱSaake,ȱK.ȬU.ȱSattler:ȱAlgorithmenȱundȱDatenstrukturen,ȱ3.,ȱüberarbeiteteȱ Auflage,ȱHeidelberg,ȱ2006ȱ
STR02ȱ
Straub,ȱH.ȱR.:ȱDasȱinterpretierendeȱSystem,ȱWolfertswil,ȱ2003ȱ
W3C04aȱ
W3C:ȱXMLȱSchemaȱPartȱ0:ȱPrimerȱSecondȱEdition.ȱW3CȱRecommendationȱ 28.ȱOctoberȱ2004,ȱhttp://www.w3.org/TR/xmlschemaȬ0ȱ
W3C04bȱ
W3C:ȱXMLȱSchemaȱPartȱ1:ȱStructuresȱSecondȱEdition.ȱW3CȱRecommendaȬ tionȱ28.ȱOctoberȱ2004,ȱhttp://www.w3.org/TR/xmlschemaȬ1ȱ
W3C04cȱ
W3C:ȱXMLȱSchemaȱPartȱ2:ȱDatatypesȱSecondȱEdition.ȱW3CȱRecommendaȬ tionȱ28.ȱOctoberȱ2004,ȱhttp://www.w3.org/TR/xmlschemaȬ2ȱ
W3C05Dȱ
W3C:ȱXQueryȱ1.0ȱandȱXPathȱ2.0ȱDataȱModelȱ(XDM),ȱW3CȱCandidateȱRecȬ ommendation,ȱ3ȱNovemberȱ2005,ȱhttp://www.w3.org/TR/2005/CRȬxpathȬ datamodelȬ20051103/ȱ
W3C05Fȱ
W3C:ȱXQueryȱ1.0ȱandȱXPathȱ2.0ȱFunctionsȱandȱOperators,ȱW3CȱCandidateȱ Recommendation,ȱ3ȱNovemberȱ2005,ȱhttp://www.w3.org/TR/2005/CRȬ xpathȬfunctionsȬ20051103/ȱ
W3C05Xȱ
W3C:ȱXQueryȱ1.0:ȱAnȱXMLȱQueryȱLanguage,ȱW3CȱCandidateȱRecommenȬ
316ȱ
Literaturverzeichnisȱ dation,ȱ3ȱNovemberȱ2005,ȱhttp://www.w3.org/TR/2005/CRȬxqueryȬ 20051103/ȱ W3C06ȱ
W3C:ȱXMLȱCoreȱWorkingȱGroupȱPublicȱPage,ȱ http://www.w3.org/XML/Core/#Publicationsȱ
W3C06aȱ
W3C:ȱExtensibleȱMarkupȱLanguageȱ(XML)ȱ1.0ȱ(FourthȱEdition).ȱW3CȱRecȬ ommendationȱ16ȱAugustȱ2006,ȱeditedȱinȱplaceȱ29ȱSeptemberȱ2006.ȱȱ http://www.w3.org/TR/xmlȱ
W3C06bȱ
W3C:ȱNamespacesȱinȱXMLȱ1.0ȱ(SecondȱEdition).ȱW3CȱRecommendationȱ16ȱ Augustȱ2006.ȱhttp://www.w3.org/TR/xmlȬnamesȱ
W3C06cȱ
W3C:ȱExtensibleȱMarkupȱLanguageȱ(XML)ȱ1.1ȱ(SecondȱEdition).ȱW3CȱRecȬ ommendationȱ16ȱAugustȱ2006,ȱeditedȱinȱplaceȱ29ȱSeptemberȱ2006.ȱȱ http://www.w3.org/TR/xml11ȱ
W3C06dȱ
W3C:ȱNamespacesȱinȱXMLȱ1.1ȱ(SecondȱEdition).ȱW3CȱRecommendationȱ16ȱ Augustȱ2006.ȱhttp://www.w3.org/TR/xmlȬnames11ȱ
W3C06eȱ
W3C:ȱXMLȱSchemaȱ1.1ȱPartȱ2:ȱDatatypes.ȱW3CȱWorkingȱDraftȱ17ȱFebruaryȱ 2008,ȱhttp://www.w3.org/TR/xmlschema11Ȭ2ȱ
W3C07ȱ
W3C:ȱWebȱOntologyȱLanguageȱ(OWL),ȱhttp://www.w3.org/2004/OWLȱ
W3C07aȱ
W3C:ȱXMLȱSchemaȱDefinitionȱLanguageȱ(DSDL)ȱ1.1ȱPartȱ1:ȱStructures.ȱW3Cȱ WorkingȱDraftȱ30ȱAugustȱ2007,ȱhttp://www.w3.org/TR/xmlschema11Ȭ1ȱ
W3C07Uȱ
W3C:ȱXMLȱQueryȱUseȱCases,ȱW3CȱWorkingȱGroupȱNote,ȱ23ȱMarchȱ2007,ȱ http://www.w3.org/TR/xqueryȬuseȬcases/ȱ
W3C08ȱ
W3C:ȱXQueryȱUpdateȱFacilityȱ1.0,ȱW3CȱCandidateȱRecommendationȱ14ȱ Marchȱ2008,ȱhttp://www.w3.org/TR/2008/CRȬxqueryȬupdateȬ10Ȭ20080314/ȱ
WP07ȱ
Walmsley,ȱP.ȱ:ȱXQuery,ȱSebastopol,ȱOȇReillyȱMedia,ȱ2007ȱ
ȱ
317ȱ
Sachwortverzeichnis 1NFȱȱ15ȱ
Ungleichheitȱȱ177ȱ
3NFȱȱ15ȱ
Alterȱȱ16ȱ
abgeleiteterȱTypȱȱ135ȱ
Alternativausdruckȱȱ226ȱ
Abhängigkeitsbeziehungȱȱ305ȱ
bedingteȱVerarbeitungȱȱ181ȱ
abstrakterȱDatentypȱȱ131ȱ
einfacheȱAlternativeȱȱ181ȱ
abstrakterȱTypȱȱ142ȱ AccordingȱtoȱXMLSCHEMAȱIDȱȱ300ȱ Achseȱ attributeȱȱ206,ȱ213ȱ childȱȱ206,ȱ209ȱ descendantȱȱ206,ȱ210ȱ descendantȬorȬselfȱȱ206,ȱ212ȱ Knotenbezeichnungȱȱ206ȱ
ifȱthenȱelseȱȱ181ȱ Mehrfachalternativeȱȱ181ȱ Analyseȱȱ13ȱ Analysephaseȱȱ12ȱ anonymȱ returnȱȱ113ȱ Sequenzȱȱ113ȱ APIȱȱ285ȱ
Nameȱȱ206ȱ
Architekturȱȱ11,ȱ87ȱ
parentȱȱ206,ȱ214ȱ
architekturgetriebenȱȱ68ȱ
Prädikatȱȱ206ȱ
architekturgetriebeneȱ Softwareentwicklungȱȱ42ȱ
selfȱȱ206,ȱ211ȱ Additionȱȱ113ȱ afterȱȱ271ȱ Aggregatsfunktionȱfnȱ avg()ȱȱ242,ȱ248ȱ count()ȱȱ242,ȱ246,ȱ248ȱ max()ȱȱ242,ȱ248ȱ min()ȱȱ242,ȱ248ȱ sum()ȱȱ242,ȱ247ȱ allgemeinerȱVergleichȱȱ177ȱ
Argumentȱȱ157ȱ asȱfirstȱintoȱȱ271ȱ asȱlastȱintoȱȱ271ȱ ASȬKlauselȱȱ46ȱ Namensraumȱȱ60ȱ Assoziationȱȱ13,ȱ15ȱ atomarerȱWertȱȱ106,ȱ108ȱ atomisierenȱȱ240ȱ Attributȱȱ8,ȱ10,ȱ11,ȱ12,ȱ48ȱ attributeȱȱ124,ȱ213ȱ
Gleichheitȱȱ177ȱ
attribute()ȱȱ220ȱ
größerȱalsȱȱ177ȱ
attributiveȱBeziehungȱȱ9ȱ
größerȱoderȱgleichȱȱ177ȱ
Attributknotenȱȱ50,ȱ118ȱ
kleinerȱalsȱȱ177ȱ kleinerȱoderȱgleichȱȱ177ȱ
attributzentriertȱȱ48,ȱ50,ȱ83ȱ Ausdruckȱȱ157ȱ dyadischȱȱ134ȱ
ȱ319
Sachwortverzeichnisȱ Filterausdruckȱȱ159ȱ
BIGINTȱȱ136ȱ
FLWORȱȱ233ȱ
binäreȱDatenȱȱ152ȱ
Mengenausdruckȱȱ184ȱ
Blattȱȱ2ȱ
numerischerȱAusdruckȱȱ159ȱ quantifizierendȱȱ183ȱ Vergleichsausdruckȱȱ159ȱ Ausprägungȱȱ7,ȱ8ȱ Ausprägungsebeneȱȱ24ȱ äußererȱGleichheitsverbundȱȱ256ȱ Auswahlȱȱ305ȱ auszeichnenȱȱ1ȱ Auszeichnungȱȱ1ȱ Auszeichnungssprachenȱȱ3ȱ BackusȬNaurȬNotationsformȱȱ17ȱ baseȱȱ298ȱ Baumȱȱ24ȱ tiefȱgeschachteltȱȱ68ȱ
Blattelementȱȱ48ȱ Blattknotenȱȱ2ȱ boolescherȱAusdruckȱȱ179ȱ booleschesȱUndȱȱ159ȱ CASTȱ SQLȱȱ134ȱ castȱasȱȱ134,ȱ151ȱ CCYY[z]ȱȱ145ȱ CCYYȬMM[z]ȱȱ146ȱ CCYYȬMMȬDDȱȱ143ȱ CCYYȬMMȬDDThh:mm:ssȱȱ145ȱ ChenȱPinȬShanȱȱ11ȱ childȱȱ209ȱ CLOBȱȱ41,ȱ95ȱ CoddȱE.ȱF.ȱȱ14ȱ
Baumstrukturȱȱ37ȱ
collapseȱȱ303ȱ
Bauplanȱȱ68ȱ
COLUMNSȱȱ264ȱ
Bedeutungȱȱ3ȱ
commentȱȱ125ȱ
bedingteȱVerarbeitungȱȱ181ȱ
comment()ȱȱ218ȱ
Befehlseditorȱȱ109ȱ
Compiliererȱȱ32ȱ
Befehlszeilenprozessorȱȱ109ȱ
COMPLETEȱȱ299ȱ
beforeȱȱ271ȱ
complexTypeȱȱ309ȱ
Begriffȱȱ3,ȱ8,ȱ11,ȱ12,ȱ14,ȱ48,ȱ107,ȱ128,ȱ308ȱ
concat()ȱȱ112,ȱ113ȱ
Begriffsbezeichnerȱȱ3,ȱ12ȱ
copyȱȱ269ȱ
Begriffsschemaȱȱ10ȱ
COUNTȱȱ64ȱ
Begriffssystemȱȱ3,ȱ4,ȱ7ȱ
CREATEȱȱ16ȱ
Benutztbeziehungȱȱ305ȱ
CREATEȱDATABASEȱȱ17ȱ
Bereichsausdruckȱȱ113ȱ
CREATEȱTABLEȱȱ17ȱ
Bezeichnerȱȱ3ȱ
Darstellungsmengeȱȱ131ȱ
Beziehungȱ
DataȱControlȱLanguageȱȱ16ȱ
Abhängigkeitsbeziehungȱȱ305ȱ
DataȱDescriptionȱLanguageȱȱ16,ȱ128ȱ
Benutztbeziehungȱȱ305ȱ
DataȱManipulationȱLanguageȱȱ16,ȱ269ȱ
Beziehungstypȱȱ11,ȱ12,ȱ13,ȱ15ȱ
320ȱ
DATEȱȱ143ȱ
Sachwortverzeichnisȱ Datenȱȱ12ȱ
Datumstypȱȱ143ȱ
Datenanalyseȱȱ12ȱ
DB2ȱȱ14ȱ
Datenarchitekturȱȱ7,ȱ11,ȱ12,ȱ14ȱ
DB2ȬBefehlseditorȱȱ32ȱ
Datenbankdiagrammȱȱ14ȱ
DB2ȬClientȱȱ109ȱ
Datenbankkatalogȱȱ16,ȱ291ȱ
db2Ȭfn:sqlqueryȱȱ32ȱ
Datenbankmodellȱȱ14ȱ
db2Ȭfn:sqlquery()ȱȱ194,ȱ196,ȱ229ȱ
Datenbankzugriffsfunktionenȱdb2Ȭfnȱ
db2Ȭfn:xmlcolumnȱȱ32ȱ
sqlquery()ȱȱ194ȱ
db2Ȭfn:xmlcolumn()ȱȱ194,ȱ239ȱ
xmlcolulmn()ȱȱ194ȱ
DCLȱȱ16ȱ
Datenbaumȱȱ2,ȱ24,ȱ107ȱ
ȬȬȬDD[z]ȱȱ146ȱ
Datenberechtigungsspracheȱȱ16ȱ
DDLȱȱ16,ȱ128,ȱ292ȱ
Datendefinitionsspracheȱȱ16ȱ
DEȱȱ17ȱ
Datenmanipulationsspracheȱȱ16,ȱ158ȱ
DECIMALȱȱ136ȱ
Datenmodellȱȱ7ȱ
Definitionȱȱ3ȱ
Datenstrukturȱȱ14ȱ Datentypȱȱ16ȱ abstraktȱȱ131ȱ
Typdefinitionȱȱ302ȱ Deklarationȱȱ7,ȱ9ȱ Namensraumȱȱ91ȱ
benanntȱȱ308ȱ
DELETEȱȱ16ȱ
Datumȱȱ142ȱ
Denkeinheitȱȱ3ȱ
eingebautȱȱ130ȱ globalȱȱ308ȱ konkretȱȱ142ȱ
dependencyȱrelationshipȱȱ20ȱ descendantȱȱ210ȱ descendantȬorȬselfȱȱ212ȱ Designȱȱ13,ȱ14ȱ
numerischȱȱ135,ȱ164ȱ
Deskriptorȱȱ2,ȱ4ȱ
primitivȱȱ142,ȱ150ȱ
dezimaleȱFestpunktzahlȱȱ128ȱ
XMLȱȱ292ȱ
Differenzȱzwischenȱzweiȱȱ Zeitpunktenȱȱ148ȱ
xsȱ base64Binaryȱȱ152ȱ hexBinaryȱȱ152ȱ
Differenzmengeȱȱ184,ȱ186ȱ DINȱ2330ȱȱ3ȱ DIN44300ȱȱ12ȱ
zeichenförmigȱȱ139ȱ
Disziplinȱȱ68ȱ
Zeitȱȱ142ȱ
divȱȱ112ȱ
DatentypȱXMLȱȱ16,ȱ17,ȱ29,ȱ61,ȱ95ȱ Datentypumwandlungȱ explizitȱȱ129ȱ Datenunabhängigkeitȱȱ22ȱ
Divisionȱȱ112ȱ ganzzahligȱȱ112ȱ DMLȱȱ16,ȱ158,ȱ269ȱ doȱdeleteȱȱ277,ȱ278ȱ
321ȱ
Sachwortverzeichnisȱ doȱinsertȱȱ271ȱ
Einschränkungȱȱ303,ȱ305ȱ
doȱrenameȱȱ281ȱ
Eintragȱȱ105,ȱ108,ȱ157ȱ
doȱreplaceȱȱ278,ȱ279ȱ
elementȱȱ309ȱ
doȱreplaceȱvalueȱofȱȱ279ȱ
Elementȱ
documentȱȱ122ȱ
Objektelementȱȱ292ȱ
documentȬnode()ȱȱ220ȱ
Schemaelementȱȱ292ȱ
dokumentenorientiertesȱ Datenbankmodellȱȱ14ȱ
Sprachelementȱȱ292ȱ
Dokumentinhaltȱȱ3ȱ Dokumentknotenȱȱ37,ȱ121ȱ Dokumentordnungȱȱ190ȱ Dollarzeichenȱȱ157ȱ Domäneȱȱ308ȱ Doppelpunktȱȱ59ȱ
zweiȱ:ȱȱ208ȱ DOUBLEȱȱ136ȱ DROPȱȱ16ȱ DROPȱXSROBJECTȱȱ299,ȱ310ȱ DTDȱȱ1ȱ Dualzahlȱȱ128,ȱ135ȱ Duplikateȱ eliminierenȱȱ254ȱ
element()ȱȱ219ȱ elementFormDefaultȱȱ308ȱ Elementhierarchieȱȱ48ȱ Elementinhaltȱȱ2ȱ Elementinhaltsausdruckȱȱ39,ȱ46ȱ Elementknotenȱȱ37,ȱ38,ȱ117ȱ ElementȬWertȱȱ2ȱ elementzentriertȱȱ47,ȱ50,ȱ54,ȱ71,ȱ83ȱ Empfängerȱȱ3ȱ encoding=ȈUTFȬ8Ȉȱȱ41ȱ EndeȬElementȱȱ2ȱ EndeȬTagȱȱ38ȱ Endwertȱȱ159ȱ Entitätȱȱ13ȱ EntitätsȬBeziehungsȬDiagrammȱȱ11ȱ
dyadischȱȱ134,ȱ178ȱ
EntitätsȬBeziehungsȬModellenȱȱ11ȱ
dyadischerȱOperatorȱ
Entitätstypȱȱ11,ȱ12,ȱ13,ȱ14,ȱ20ȱ
toȱȱ113ȱ Ebeneȱ
EntityȬRelationshipȱDiagramȱȱ11ȱ EntityȬRelationshipȱModelȱȱ11ȱ
Ausprägungsebeneȱȱ22ȱ
Entwicklungsansatzȱ
Modellierungsebeneȱȱ22ȱ
gemischtȱȱ51,ȱ87ȱ
Ebenenordnungȱȱ200ȱ
Entwurfȱȱ13ȱ
effektiverȱWahrheitswertȱȱ222ȱ
Entwurfsphaseȱȱ14ȱ
eindeutigȱȱ58ȱ
enumerationȱȱ303ȱ
Eindeutigkeitȱȱ60ȱ
Erbschaftȱȱ10,ȱ131ȱ
einfacheȱAlternativeȱȱ181ȱ
ERDȱȱ11ȱ
einfachesȱXMLȬElementȱȱ57ȱ
ERMȱȱ11,ȱ13,ȱ14,ȱ20ȱ
eingebauteȱFunktionenȱȱ160ȱ
ErweiterbareȱAuszeichnungsspracheȱȱ1ȱ
einmaligerȱZeitpunktȱȱ142ȱ
everyȱȱ183ȱ
322ȱ
Sachwortverzeichnisȱ Existenzabhängigkeitȱȱ8ȱ
string()ȱȱ173ȱ
existenzielleȱAbhängigkeitȱȱ2ȱ
stringȬjoin()ȱȱ173ȱ
Expansionȱȱ77ȱ
stringȬlength()ȱȱ174ȱ
EXtensibleȱMarkȬupȱLanguageȱȱ1ȱ Extensionȱȱ3,ȱ8,ȱ9,ȱ107ȱ facetȱȱ303ȱ Faktenȱȱ12ȱ
stringȬtoȬcodepoints()ȱȱ174ȱ substring()ȱȱ174ȱ substringȬafter()ȱȱ174ȱ
falschȱȱ151ȱ
substringȬbefore()ȱȱ174ȱ
falseȱȱ151ȱ
tokenize()ȱȱ174ȱ
Fassetteȱȱ303,ȱ305,ȱ308ȱ
translate()ȱȱ174ȱ
Filterausdruckȱȱ159,ȱ220ȱ
zeroȬorȬone()ȱȱ162ȱ
firstȱinȱȬȱfirstȱoutȱȱ105ȱ
fn:avg()ȱȱ248ȱ
FLWORȱȱ236ȱ
fn:boolean()ȱȱ151ȱ
FLWORȬAusdruckȱȱ114,ȱ233ȱ
fn:concat()ȱȱ139ȱ
fnȱ
fn:count()ȱȱ246,ȱ248ȱ
codepointsȬtoȬstring()ȱȱ172ȱ
fn:data()ȱȱ129,ȱ130ȱ
compare()ȱȱ172ȱ
fn:distinctȬvalues()ȱȱ220ȱ
concat()ȱȱ172ȱ
fn:false()ȱȱ151ȱ
contains()ȱȱ172ȱ
fn:max()ȱȱ248ȱ
count()ȱȱ162ȱ
fn:min()ȱȱ248ȱ
distinctȬvalues()ȱȱ163ȱ empty()ȱȱ162ȱ endsȬwith()ȱȱ172ȱ
fn:sum()ȱȱ247,ȱ248ȱ fn:true()ȱȱ151ȱ fn:xmlcolumn()ȱȱ230ȱ forȱȱ114,ȱ233ȱ
exactlyȬone()ȱȱ162ȱ
ForeignȱKeyȱȱ16ȱ
exists()ȱȱ162ȱ
fractionDigitsȱȱ303ȱ
indexȬof()ȱȱ163ȱ
Fragezeichenȱȱ134ȱ
lowerȬcase()ȱȱ172ȱ
Fremdschlüsselȱȱ15,ȱ16ȱ
matches()ȱȱ173ȱ
Funktionȱ
normalizeȬspace()ȱȱ173ȱ normalizeȬunicode()ȱȱ173ȱ not()ȱȱ179ȱ oneȬorȬmore()ȱȱ162ȱ replace()ȱȱ173ȱ startsȬwith()ȱȱ173ȱ
eingebautȱȱ160ȱ überladenȱȱ134ȱ funktionaleȱSpracheȱȱ113ȱ Funktionsaufrufȱȱ157ȱ Gänsefüßchenȱȱ39ȱ Ganzesȱȱ8ȱ gemischtesȱXMLȬElementȱȱ57ȱ
323ȱ
Sachwortverzeichnisȱ Generalisierungȱȱ9,ȱ108ȱ
strukturellȱȱ83ȱ
Generalisierungsbeziehungȱȱ9ȱ
idivȱȱ112ȱ
Generalisierungsdiagrammȱȱ131ȱ
IECȱȱ16ȱ
Generalisierungspfeilȱȱ131ȱ
IEEEȱȱ136ȱ
Gesamtobligoȱȱ247ȱ
Implementierungȱȱ14,ȱ16,ȱ157ȱ
Geschäftsregelȱȱ12ȱ
implizitȱȱ62ȱ
geschweifteȱKlammerȱȱ119ȱ
INCLUDINGȱXMLDECLARATIONȱȱ41ȱ
getString()ȱȱ287ȱ
Informationȱȱ12ȱ
Gleichheitȱȱ176ȱ
Infosetȱȱ29,ȱ106ȱ
Gleichheitsverbundȱȱ20,ȱ252ȱ
Inhaltsausdruckȱȱ119ȱ
Gleitpunktzahlȱȱ128ȱ
INSERTȱȱ16ȱ
GMTȱȱ144ȱ
Instanceȱȱ7ȱ
Grammatikȱȱ1ȱ
Instanzȱȱ7ȱ
GRANTȱȱ17ȱ
INTEGERȱȱ136ȱ
Graphȱȱ2ȱ
Intensionȱȱ3,ȱ8,ȱ9,ȱ12,ȱ48,ȱ58,ȱ107,ȱ308ȱ
GreenwichȱMeanȱTimeȱȱ144ȱ
internȱcodierteȱFormȱȱ29ȱ
Großbuchstabenȱȱ46ȱ
InternationalȱElectrotechnicalȱ Commissionȱȱ16ȱ
größerȱalsȱȱ176ȱ GROUPȱBYȱȱ249ȱ
InternationalȱOrganizationȱforȱ Standardizationȱȱ16ȱ
Gruppenselektionȱȱ250ȱ
Internetȱȱ60ȱ
Gruppierungȱȱ249ȱ
InternetȬExplorerȱȱ44ȱ
Gültigkeitsprüfungȱȱ96ȱ
intoȱȱ271ȱ
Hauptanfrageȱȱ73,ȱ77ȱ
ISOȱȱ16ȱ
HAVINGȱȱ250ȱ
ISOȱ8601ȱȱ145ȱ
hh:mm:ss[.ssssss][z]ȱȱ146ȱ
itemȱȱ105ȱ
Hierarchieȱȱ3,ȱ9,ȱ20ȱ
Jahrȱȱ144ȱ
hierarchischesȱDatenbankmodellȱȱ14ȱ
Javaȱȱ285ȱ
homonymȱȱ60ȱ
JavaȱDatabaseȱConnectivityȱȱ285ȱ
Homonymȱȱ58ȱ
JDBCȱȱ285ȱ
http://www.w3.org/2001/XMLȬȱ Schemaȱȱ128,ȱ130,ȱ133,ȱ297,ȱ299ȱ
joinȱȱ20ȱ
größerȱoderȱgleichȱȱ176ȱ
http://www.w3.org/2005/xpathȬ datatypesȱȱ130,ȱ133ȱ hybridȱȱ48ȱ Identitätȱȱ108,ȱ177ȱ spiegelbildlichȱȱ68ȱ
324ȱ
innerȱjoinȱȱ21,ȱ81,ȱ252ȱ outerȱjoinȱȱ256ȱ kanonischeȱFormȱȱ132ȱ Kantenȱȱ2ȱ Kardinalitätȱȱ22ȱ
Sachwortverzeichnisȱ Klammerȱ geschweiftȱȱ122ȱ
berechneterȱȱ116,ȱ118ȱ commentȱȱ125ȱ
Klammerungȱȱ164ȱ
direktȱȱ116,ȱ117,ȱ129ȱ
Klasseȱȱ7,ȱ13,ȱ15,ȱ107ȱ
direkterȱȱ241ȱ
Klassendiagrammȱȱ7ȱ kleinerȱalsȱȱ176ȱ kleinerȱoderȱgleichȱȱ176ȱ Knotenȱȱ2,ȱ107,ȱ108ȱ
documentȱȱ121ȱ elementȱȱ119ȱ processingȬinstructionȱȱ124ȱ
Knotenbezeichnungȱȱ215ȱ
textȱȱ125ȱ
Knotentyptestȱȱ215ȱ
Typkonstruktorȱȱ133ȱ
attribute()ȱȱ215,ȱ220ȱ comment()ȱȱ215,ȱ218ȱ
xsȱ boolean()ȱȱ151ȱ
documentȬnode()ȱȱ215,ȱ220ȱ
Konstruktorfunktionȱȱ30ȱ
element()ȱȱ215,ȱ219ȱ
Kontextȱȱ2ȱ
node()ȱȱ215ȱ
Kontextknotenȱȱ203,ȱ207,ȱ209ȱ
processingȬinstruction()ȱȱ215,ȱ218ȱ text()ȱȱ215ȱ Knotentyptest()ȱ text()ȱȱ218ȱ Knotenvergleichȱ
Konvertierungsfunktionȱȱ61ȱ koordinierteȱWeltzeitȱȱ144ȱ Korrelationsnameȱȱ77ȱ korrelierteȱUnteranfrageȱȱ77ȱ LATERALȱȱ73,ȱ78,ȱ81ȱ leereȱSequenzȱȱ265ȱ
Identitätȱȱ177ȱ
lengthȱȱ303ȱ
relativeȱPositionȱȱ177ȱ
Lesbarkeitȱȱ45ȱ
kollabierenȱȱ77ȱ Kollektionȱȱ305ȱ
letȱȱ114,ȱ233ȱ FolgeȱvonȱletȬKlauselnȱȱ237ȱ
Kommaoperatorȱȱ112,ȱ158,ȱ160ȱ
Levelorderȱȱ191,ȱ200,ȱ201,ȱ203ȱ
Kommentarȱȱ87ȱ
lexikalischeȱRepräsentationȱȱ151ȱ
Kommentarknotenȱȱ37,ȱ38,ȱ54ȱ
lexikalischerȱRaumȱȱ303ȱ
Komplexitätȱ
lexikalischerȱRepräsentationsraumȱȱ131ȱ
globaleȱȱ41,ȱ68ȱ
Literalȱȱ157ȱ
Kompositionsbeziehungȱȱ8,ȱ10,ȱ11,ȱ72,ȱȱ 74,ȱ78ȱ
Literalartȱȱ128ȱ
konkreterȱDatentypȱȱ142ȱ
Löschausdruckȱȱ277ȱ
Konsistenzȱȱ43ȱ
markȱupȱȱ1ȱ
Konstruktorȱȱ133ȱ
markierenȱȱ1ȱ
attributeȱȱ124ȱ
Lokalisierungsschrittȱȱ199,ȱ203ȱ
Markierungȱȱ16ȱ
325ȱ
Sachwortverzeichnisȱ maxExclusiveȱȱ303ȱ
Nameȱȱ8ȱ
maxInclusiveȱȱ303ȱ
homonymerȱȱ59ȱ
maxLengthȱȱ298,ȱ303ȱ
qualifizierterȱȱ312ȱ
maxOccursȱȱ309ȱ
Namensqualifizierungȱȱ60ȱ
mehrdeutigȱȱ58ȱ
Namensraumȱȱ59,ȱ87,ȱ91,ȱ128,ȱ297ȱ
Mehrfachalternativeȱȱ182ȱ Mengeȱȱ105ȱ Differenymengeȱȱ184ȱ Schnittmengeȱȱ184ȱ Vereinigungsmengeȱȱ184ȱ Mengenoperatorȱ exceptȱȱ184ȱ
DefaultȬNamensraumȱȱ59ȱ NamensraumȬURIȱȱ60ȱ Namensraumpräfixȱȱ308,ȱ312ȱ Namensraumpräfixȱxsȱȱ128ȱ Namenstestȱȱ215ȱ NaNȱȱ222ȱ NavigationȱinȱBäumenȱ
intersectȱȱ184ȱ
Dokumentordnungȱȱ191ȱ
unionȱȱ184ȱ
HierarchischeȱOrdnungȱȱ191ȱ
Metadatenȱȱ2,ȱ16,ȱ17,ȱ292ȱ
Inorderȱȱ191ȱ
Metadatumȱȱ48ȱ
Levelorderȱȱ191ȱ
Metaspracheȱȱ1ȱ
Postorderȱȱ191ȱ
Mikrosekundeȱȱ148ȱ minExclusiveȱȱ303ȱ minInclusiveȱȱ303ȱ Miniweltȱȱ7,ȱ11,ȱ12,ȱ14,ȱ20ȱ minLengthȱȱ298,ȱ303ȱ minOccursȱȱ309ȱ MM[z]ȱȱ146ȱ ȬȬMMȬDD[z]ȱȱ146ȱ modȱȱ112ȱ Modellierungsspracheȱȱ7,ȱ13ȱ modifyȱȱ269,ȱ271,ȱ281ȱ Modulodivisionȱȱ112ȱ Monatȱȱ144ȱ Multiplikationȱȱ112ȱ Multiplizitätȱȱ8,ȱ11,ȱ12,ȱ13,ȱ22,ȱ134ȱ einfachȱ1ȱȱ81ȱ vieleȱ*ȱȱ72,ȱ74,ȱ78ȱ Nachfolgerknotenȱȱ118ȱ
326ȱ
Preorderȱȱ191ȱ Navigationsrichtungȱȱ206ȱ negativȱȱ112ȱ NeueȱZeileȱȱ157ȱ next()ȱȱ287ȱ node()ȱȱ217ȱ Normalformȱȱ14ȱ Normalisierungȱȱ15,ȱ20ȱ Nullȱȱ16,ȱ39,ȱ45ȱ numerischerȱDatentypȱȱ135ȱ Nutzdatenȱȱ2,ȱ16ȱ Oberbegriffȱȱ9ȱ Obergrenzeȱȱ113ȱ Objektȱȱ107ȱ Objektattributȱȱ293ȱ Objektelementȱȱ292,ȱ293ȱ Objektidentitätȱȱ108ȱ objektorientierteȱAnalyseȱȱ13ȱ
Sachwortverzeichnisȱ objektorientierterȱEntwurfȱȱ13ȱ
Parserȱȱ109ȱ
objektorientiertesȱDatenbankmodellȱȱ14ȱ
SQLȬParserȱȱ32ȱ
Objektorientierungȱȱ7,ȱ59ȱ
validierenderȱȱ41,ȱ60ȱ
occurrenceȱindicatorȱȱ134ȱ
XQueryȬParserȱȱ32ȱ
Oderȱ dynamischesȱȱ183ȱ
PASSINGȱȱ264ȱ PATHȱȱ264ȱ
OIDȱȱ108ȱ
patternȱȱ303ȱ
Operandȱȱ157ȱ
Pfadȱ
Operationȱȱ157ȱ Operationsmengeȱȱ131ȱ Operatorȱȱ157ȱ Additionȱȱ164ȱ arithmetischȱȱ112ȱ castȱasȱȱ134ȱ Divisionȱdivȱȱ164ȱ Divisionȱganzzahligȱidivȱȱ164ȱ Divisionsrestȱmodȱȱ164ȱ dyadischȱȱ111,ȱ178ȱ Kommaoperatorȱȱ158ȱ logischȱODERȱȱ179ȱ logischȱUNDȱȱ179ȱ Mulitiplikationȱȱ164ȱ Subtraktionȱȱ164ȱ toȱȱ159,ȱ160ȱ
hierarchischȱȱ78ȱ Pfadausdruckȱȱ178,ȱ199ȱ abgekürzteȱSchreibweiseȱȱ227ȱ absolutȱȱ200ȱ Knotenart,ȱKnotentypȱȱ208ȱ Navigationsachseȱȱ208ȱ Prädikatȱȱ208ȱ relativȱȱ200,ȱ203ȱ Positionȱ inȱSequenzȱȱ159ȱ nachherȱȱ178ȱ relativȱȱ178ȱ vorherȱȱ178ȱ positivȱȱ112ȱ Prädikatȱȱ42,ȱ159,ȱ221ȱ Gleichheitsprädikatȱȱ77ȱ
OPTIONȱEMPTYȱONȱNULLȱȱ39,ȱ45,ȱ77ȱ
ISȱVALIDATEDȱȱ299ȱ
OPTIONȱNULLȱONȱNULLȱȱ39,ȱ45ȱ
komplexesȱȱ225ȱ
orderȱȱ114ȱ orderȱbyȱȱ233ȱ outerȱjoinȱȱ256ȱ OWLȱȱ5ȱ Pȱ[nY]ȱ[nM]ȱ[nD]ȱ[Tȱ[nH]ȱ[nM]ȱ[mS]ȱ]ȱȱ 148ȱ parentȱȱ214ȱ
Prädikatsklammerȱ[]ȱȱ208ȱ XMLEXISTS()ȱȱ265ȱ Präfixȱȱ8,ȱ60ȱ Namensraumpräfixȱȱ59ȱ xdtȱȱ130ȱ xsȱȱ130ȱ
ParentȬKnotenȱȱ38ȱ
preserveȱȱ303ȱ
parserȱȱ33ȱ
Primärschlüsselȱȱ15,ȱ16ȱ
327ȱ
Sachwortverzeichnisȱ PrimaryȱKeyȱȱ16ȱ
registrierenȱȱ295ȱ
primitiverȱDatentypȱȱ142ȱ
regulärerȱAusdruckȱȱ303ȱ
primitiverȱTypȱȱ135ȱ
Relationȱȱ17,ȱ105,ȱ110ȱ
print()ȱȱ287ȱ
relationalesȱDatenbankmodellȱȱ14ȱ
Prioritätȱȱ164,ȱ179ȱ
Relationstypȱȱ14,ȱ15,ȱ20ȱ
processingȬinstructionȱȱ124ȱ
relativerȱPfadausdruckȱȱ203ȱ
processingȬinstruction()ȱȱ218ȱ
Relatorȱȱ176ȱ
Projektionȱȱ20,ȱ23ȱ
replaceȱȱ303ȱ
Prologȱȱ1ȱ
ResourceȱDescriptionȱFrameworkȱȱ5ȱ
Prototypingȱ
restrictionȱȱ298,ȱ303ȱ
evolutionäresȱȱ68ȱ
ResultSetȱȱ287ȱ
PSVIȱȱ29,ȱ106ȱ
returnȱȱ114,ȱ233,ȱ269ȱ
Punktrechnungȱȱ112ȱ
REVOKEȱȱ17ȱ
qualifiedȱȱ308ȱ
satisfiesȱȱ183ȱ
Qualifikationȱȱ77ȱ
schemaȱȱ298,ȱ308ȱ
Qualifikationsoperatorȱȱ59ȱ
Schemaȱȱ8ȱ
Qualifikationspräfixȱȱ60ȱ
Schemaattributȱȱ293ȱ
qualifizierterȱNameȱȱ59ȱ
Schemaebeneȱȱ292ȱ
Qualifizierungȱȱ60ȱ
Schemaelementȱȱ292,ȱ293ȱ
Quantifizierungȱ
komplexesȱȱ305ȱ
existenzielleȱȱ183ȱ
SchemaȬRepositoryȱȱ291ȱ
universelleȱȱ183ȱ
schemaȬvalideȱȱ292ȱ
queueȱȱ105ȱ
Schleifeȱȱ235ȱ
RDBDȱȱ14,ȱ105ȱ
Schlussfolgerungȱȱ5ȱ
RDFȱȱ5ȱ
Schnittmengeȱȱ184,ȱ186ȱ
REALȱȱ136ȱ
Schrägstrichȱȱ200ȱ
Realweltȱȱ291ȱ
Schreibdisziplinȱȱ82ȱ
Realweltobjektȱȱ293ȱ
SELECTȱȱ16,ȱ17ȱ
Recommendationȱȱ1ȱ
Selektorȱȱ59ȱ
Redundanzȱȱ21,ȱ24ȱ
selfȱȱ211ȱ
Redundanzfreiheitȱȱ20ȱ
Senderȱȱ3ȱ
Referenzvariableȱȱ157ȱ
Sequenzȱȱ105,ȱ108,ȱ110,ȱ157,ȱ194,ȱ196,ȱ305ȱ
Regelȱȱ3ȱ
anonymȱȱ157ȱ
REGISTERȱȱ310ȱ
leerȱȱ112,ȱ265ȱ
XMLSCHEMAȱȱ299ȱ REGISTERȱXMLSCHEMAȱȱ304ȱ
328ȱ
Sequenzausdruckȱȱ111,ȱ159ȱ sequenceȱȱ309ȱ
Sachwortverzeichnisȱ serialisierenȱȱ30,ȱ40ȱ implizitȱȱ114ȱ Serialisierungȱ explizitȱȱ98ȱ implizitȱȱ98ȱ
Strichrechnungȱȱ113ȱ StructuredȱQueryȱLanguageȱȱ16ȱ Strukturȱ flachȱȱ20ȱ Strukturdiagrammȱȱ7ȱ
SETȱȱ276ȱ
StrukturierteȱAnfragespracheȱȱ16ȱ
SGMLȱȱ1ȱ
Subtraktionȱȱ113ȱ
shreddingȱȱ261ȱ
SuffixȱXMLȱȱ44ȱ
Sichtȱ
SUMȱȱ64ȱ
externeȱSichtȱȱ22ȱ simpleTypeȱȱ298,ȱ305ȱ skalarerȱWertȱȱ106ȱ SMALLINTȱȱ136ȱ someȱȱ183ȱ
Syntaxȱȱ17ȱ Systemzweckȱȱ12ȱ Tabelleȱȱ16,ȱ20ȱ temporäreȱȱ73ȱ virtuelleȱȱ22,ȱ24ȱ
sortierenȱȱ66ȱ
TABLEȱȱ75ȱ
Spalteȱȱ17ȱ
Tabulatorȱȱ157ȱ
Spaltenfunktionȱȱ64ȱ
Tagȱȱ16,ȱ144ȱ
Spezialisierungȱȱ9,ȱ11ȱ
targetNamespaceȱȱ298,ȱ300ȱ
Spezialisierungsdiagrammȱȱ131ȱ
Teilȱȱ8ȱ
Spiegelbildlichkeitȱȱ68ȱ
Teilschlüsselabhängigkeitȱȱ14ȱ
Spitzklammerȱȱ13ȱ
TERRITORYȱDEȱȱ17ȱ
Sprachelementȱȱ292ȱ
textȱȱ125ȱ
SQLȱȱ16ȱ
Textȱȱ57ȱ
2003ȱȱ16ȱ
text()ȱȱ218ȱ
2007ȱȱ16ȱ
Textknotenȱȱ37,ȱ38ȱ
SQL/XMLȱȱ29ȱ SQL:2003ȱȱ29ȱ SQL3ȱȱ14ȱ SQLȬPrädikatȱȱ267ȱ Startelementȱȱ2ȱ StartȬtagȱȱ38ȱ Startwertȱȱ159ȱ Stereotypȱȱ7,ȱ13,ȱ15,ȱ22,ȱ306ȱ Sternȱȱ14ȱ Steuerzeichenȱȱ157ȱ
TIMESTAMPȱȱ143ȱ totalDigitsȱȱ303ȱ transformȱȱ269ȱ transitiveȱAbhängigkeitȱȱ14ȱ trueȱȱ151ȱ Tupelȱȱ105,ȱ110ȱ Typȱȱ7ȱ abgeleiteterȱȱ135ȱ anonymerȱȱ302ȱ benannterȱȱ302ȱ einfacherȱȱ302ȱ
329ȱ
Sachwortverzeichnisȱ globalerȱȱ302ȱ
Validierungȱȱ33,ȱ299ȱ
komplexerȱȱ302,ȱ304ȱ
valueȱspaceȱȱ131ȱ
primitiverȱȱ135ȱ
VALUESȱȱ40,ȱ109ȱ
Typangleichungȱȱ138ȱ Typhierarchieȱȱ131ȱ Typkonstruktorȱȱ133ȱ typstrengeȱSpracheȱȱ128,ȱ138ȱ Typumwandlungsoperationȱȱ133ȱ
Variableȱȱ114,ȱ157ȱ VennȬDiagrammȱȱ184ȱ Verarbeitungshinweisknotenȱȱ37,ȱ38ȱ Verbundȱ Gleichheitsverbundȱȱ252ȱ
UDBMSȱȱ14ȱ
Verbundoperatorȱȱ20ȱ
UMLȱȱ7,ȱ11,ȱ14,ȱ20ȱ
Vereinigungsmengeȱȱ184,ȱ185ȱ
Umsetzungsausdruckȱȱ269ȱ
Vergleichȱ
unbekanntȱȱ16ȱ
Gleichheitȱȱ176ȱ
Undȱ
größerȱalsȱȱ176ȱ
booleschȱȱ159ȱ
größerȱoderȱgleichȱȱ176ȱ
dynamischȱȱ184ȱ
kleinerȱalsȱȱ176ȱ
Ungleichheitȱȱ176ȱ
kleinerȱoderȱgleichȱȱ176ȱ
Unicodeȱȱ17,ȱ141,ȱ297ȱ
Ungleichheitȱȱ176ȱ
UnifiedȱModelingȱLanguageȱȱ7ȱ
Vergleichsausdruckȱȱ226ȱ
UniversalȱResourceȱIdentifierȱȱ60ȱ
Vergleichsoperatorȱȱ176ȱ
UniversalȱTimeȱCoordinatedȱȱ144ȱ
VERSIONȱȇ1.0ȇȱȱ41ȱ
universellesȱDatenbanksystemȱȱ14ȱ
Verstehbarkeitȱȱ45ȱ
Unixȱȱ199ȱ
Viewȱȱ22ȱ
Unteranfrageȱȱ73,ȱ77ȱ
Vokabelȱȱ3,ȱ291,ȱ297ȱ
korreliertȱȱ77,ȱ78,ȱ81ȱ
Vokabelnȱȱ1ȱ
Unterbegriffȱȱ9ȱ
Vokabularȱȱ43,ȱ58,ȱ60,ȱ87ȱ
Untergrenzeȱȱ113ȱ
Vokabularienȱȱ1ȱ
Untertypensubstitutionȱȱ138ȱ
Vorgängerknotenȱȱ38,ȱ118ȱ
Untertypsubstitutionȱȱ138ȱ
Vorzeichenȱ
untypisiertȱȱ129ȱ
negativȱȱ164ȱ
UPDATEȱȱ16,ȱ270,ȱ276,ȱ278,ȱ280ȱ
positivȱȱ164ȱ
URIȱȱ60ȱ USINGȱCODESETȱȱ17ȱ UTCȱȱ144ȱ UTFȬ8ȱȱ17ȱ validierenȱȱ129,ȱ292,ȱ293ȱ Validiererȱȱ295ȱ
330ȱ
Vorzeichenoperatorȱȱ112,ȱ164ȱ W3Cȱȱ1,ȱ105ȱ Wagenrücklaufȱȱ157ȱ wahrȱȱ151ȱ Wahrheitswertȱȱ159ȱ
Sachwortverzeichnisȱ effektiverȱȱ222ȱ
xdt:untypedȱȱ129,ȱ138ȱ
falsch,ȱfalseȱȱ179ȱ
xdt:untypedAtomicȱȱ129,ȱ138ȱ
wahr,ȱtrueȱȱ179ȱ
xdt:yearMonthDurationȱȱ150ȱ
WebȱOntologyȱLanguageȱȱ5ȱ Wertebereichȱȱ113ȱ Wertemengeȱȱ131ȱ Werteraumȱȱ131ȱ Wertevergleichȱȱ176ȱ Wertknotenȱȱ118ȱ whereȱȱ114,ȱ233ȱ WHEREȬKlauselȱȱ77ȱ whiteȱspaceȱȱ97,ȱ157,ȱ303ȱ Wiederholungȱȱ235ȱ geschachtelteȱȱ235ȱ wiederkehrenderȱZeitpunktȱȱ142ȱ Windowȱȱ199ȱ wohlgeformtȱȱ96ȱ Wohlgeformtheitȱȱ29,ȱ122ȱ WorldȱWideȱWebȱConsortiumȱȱ1ȱ Wurzelȱȱ61ȱ Wurzelelementȱȱ53ȱ Wurzelknotenȱȱ2,ȱ117,ȱ122ȱ internerȱȱ37ȱ Wurzeltypȱȱ130,ȱ135ȱ XDMȱȱ29,ȱ37,ȱ105ȱ XDM/Baumȱȱ295ȱ XDMȬBaumȱȱ50,ȱ54,ȱ96ȱ einfügenȱȱ269ȱ ersetzenȱȱ269ȱ
xdt:yearMonthDuration()ȱȱ148ȱ XMLȱȱ1,ȱ14,ȱ16,ȱ291ȱ XMLȱQueryȱȱ29ȱ XMLȱSchemaȱȱ14,ȱ33,ȱ106,ȱ128,ȱ141,ȱ291,ȱ 292,ȱ301,ȱ306ȱ XMLAGGȱȱ30,ȱ64,ȱ66ȱ XMLATTRIBUTESȱȱ30,ȱ38,ȱ50ȱ XMLCASTȱȱ31,ȱ61ȱ XMLCAST()ȱȱ98,ȱ134ȱ XMLCOMMENTȱȱ30,ȱ54,ȱ57ȱ XMLCONCATȱȱ30,ȱ61ȱ XMLDOCUMENTȱȱ31,ȱ37,ȱ38ȱ XMLȬDokumentȱȱ37ȱ XMLȬElementȱȱ2,ȱ3,ȱ38,ȱ57ȱ einfachȱȱ47,ȱ57ȱ gemischtȱȱ57,ȱ58ȱ komplexȱȱ47ȱ leerȱȱ38,ȱ47ȱ XMLELEMENTȱȱ31,ȱ38,ȱ39,ȱ45,ȱ49,ȱ59,ȱȱ 60,ȱ61ȱ XMLȬElementȬKnotenȱȱ50ȱ XMLEXISTSȱȱ31ȱ XMLEXISTS()ȱȱ265ȱ XMLFORESTȱȱ31,ȱ45ȱ XMLȬKontextȱȱ59ȱ XMLNAMESPACESȱȱ31,ȱ59ȱ xmlns:xsȱȱ297ȱ
löschenȱȱ269ȱ
XMLPARSEȱȱ31ȱ
umbenennenȱȱ269ȱ
XMLPARSE()ȱȱ97,ȱ300,ȱ311ȱ
XDMȬKnotenȱȱ62,ȱ106,ȱ108,ȱ116ȱ
XMLȬParserȱȱ292ȱ
xdtȱȱ130ȱ
XMLPIȱȱ31,ȱ62ȱ
xdt:dayTimeDurationȱȱ150,ȱ168ȱ
XMLQUERYȱȱ31ȱ
xdt:dayTimeDuration()ȱȱ148ȱ
XMLQUERY()ȱȱ270,ȱ275ȱ
331ȱ
Sachwortverzeichnisȱ XMLȬSchemaȱȱ33,ȱ60,ȱ129ȱ
xs:gMonthDayȱȱ146,ȱ150ȱ
XMLȬSchemamodellȱȱ42ȱ
xs:gYearȱȱ145,ȱ150ȱ
XMLSERIALIZEȱȱ31,ȱ40ȱ
xs:gYearMonthȱȱ146,ȱ150ȱ
XMLSERIALIZE()ȱȱ98ȱ
xs:hexBinaryȱȱ152,ȱ154ȱ
XMLȬSpeicherȱȱ32,ȱ95ȱ
xs:IDȱȱ140ȱ
XMLTABLEȱȱ31ȱ
xs:IDREFȱȱ140ȱ
XMLTABLE()ȱȱ261ȱ
xs:intȱȱ136ȱ
XMLTEXTȱȱ31,ȱ57ȱ
xs:integerȱȱ128,ȱ136ȱ
XMLȬTypȱȱ129ȱ
xs:languageȱȱ140ȱ
XMLVALIDATEȱȱ32ȱ
xs:longȱȱ136ȱ
XMLVALIDATE()ȱȱ300,ȱ311ȱ
xs:Nameȱȱ140ȱ
XMLȬValidiererȱȱ33ȱ
xs:NCNameȱȱ140ȱ
XMLȬWertȱȱ29ȱ
xs:negativeIntegerȱȱ136ȱ
XPathȱ2.0ȱȱ190,ȱ199ȱ
xs:NMTOKENȱȱ140ȱ
XQueryȱȱ14,ȱ29,ȱ105ȱ
xs:nonNegativeIntegerȱȱ136ȱ
XQUERYȱȱ32,ȱ109ȱ
xs:nonPositiveIntegerȱȱ136ȱ
XQueryȱDataȱModelȱȱ29,ȱ37ȱ
xs:normalizedStringȱȱ140ȱ
XQuery_Referenz_Variableȱȱ264ȱ
xs:NOTATIONȱȱ154,ȱ155ȱ
XQueryȬVariableȱȱ114,ȱ157ȱ
xs:positiveIntegerȱȱ136ȱ
xsȱȱ130ȱ
xs:QNameȱȱ154,ȱ155ȱ
xs:anyAtomicTypeȱȱ135,ȱ142,ȱ150ȱ
xs:shortȱȱ136ȱ
xs:anyTypeȱȱ130,ȱ135ȱ
xs:stingȱȱ128ȱ
xs:anyURIȱȱ154,ȱ155ȱ
xs:stringȱȱ140,ȱ151ȱ
xs:base64Binaryȱȱ152,ȱ154ȱ
xs:timeȱȱ146,ȱ149ȱ
xs:booleanȱȱ151,ȱ154ȱ
xs:tokenȱȱ140ȱ
xs:byteȱȱ136ȱ
xs:unsignedByteȱȱ136ȱ
xs:dateȱȱ143,ȱ145,ȱ149,ȱ167,ȱ170ȱ
xs:unsignedIntȱȱ136ȱ
xs:dateTimeȱȱ143,ȱ145,ȱ150,ȱ168,ȱ170ȱ
xs:unsignedLongȱȱ136ȱ
xs:decimalȱȱ128,ȱ135,ȱ136ȱ
xs:unsignedShortȱȱ136ȱ
xs:decimal()ȱȱ130,ȱ133ȱ
XSRȱȱ291,ȱ295,ȱ299,ȱ310ȱ
xs:doubleȱȱ128,ȱ135,ȱ136ȱ
zeroȱZeitversatzȱȱ144ȱ
xs:durationȱȱ147,ȱ150ȱ
Zeichenketteȱȱ128ȱ
xs:duration()ȱȱ148ȱ
Zeichenkettenwertȱȱ108ȱ
xs:ENTITYȱȱ141ȱ
Zeichenreferenzȱȱ141ȱ
xs:floatȱȱ135,ȱ136ȱ
Zeitarithmetikȱȱ148ȱ
xs:gDayȱȱ146,ȱ150ȱ
Zeitdauerȱȱ143ȱ
xs:gMonthȱȱ146,ȱ150ȱ
332ȱ
Sachwortverzeichnisȱ Zeitpunktȱ
Zeitzoneȱȱ144ȱ
einmaligȱȱ142ȱ
Zugriffspfadȱȱ203ȱ
wiederkehrendȱȱ142,ȱ146ȱ
Zusammenfassungȱȱ249ȱ
Zeitraumȱȱ143,ȱ147,ȱ148ȱ
Zuweisungsoperatorȱȱ114ȱ
Zeitstempeltypȱȱ143,ȱ145ȱ ȱ
Zwischenknotenȱȱ2ȱ
333ȱ