XQuery - zadania
Transkrypt
XQuery - zadania
XQuery – Zadania PoniŜsze ćwiczenia moŜna zrealizować korzystając z trzech środowisk: A. Bazy danych dokumentów XML – eXists B. Relacyjnej bazy danych Oracle C. Relacyjnej bazy danych DB2 PoniŜej kilka przydatnych informacji dla kaŜdego ze środowisk: A. eXists Podczas pracy z bazą danych eXists korzystamy z aplikacji: • eXist XML-DB Klient, lub • XQuery Sandbox (preferowane) Oprogramowanie to jest dostępne pod adresem http://<host>:8080/exist. W przypadku eXist XML-DB Klient korzystamy z bazy danych identyfikowanej przez URI: xmldb:exist://<host>:8080/exist/xmlrpc i konta podanego przez prowadzącego. Przejście do zadawania zapytań w eXists XML-DB Klient: • Logujemy się do aplikacji • Wybieramy przycisk „Query the database…” • • Ustawiamy właściwy kontekst Zadajemy zapytania kaŜdorazowo wysyłając je do wykonania przyciskiem „Submit” B. Oracle Podczas pracy z bazą danych korzystamy ze środowiska iSQLPlus lub lokalnego SQLPlus w wersji 9i i wyŜszych. Łączymy się z bazą danych devel11g. Korzystamy z własnych kont INF…. Aby uŜyć zapytań XQuery w bazie danych Oracle moŜna skorzystać z funkcji XMLQUERY. Przydatne funkcje XQuery: • ora:view ([db-schema STRING,] db-table STRING) RETURNS document-node(element()) Dostęp do danych w tabeli jako zbioru dokumentów XML o postaci kanonicznej [ROW] • doc Dostęp do określonego dokumentu zawartego w XML Repository • collection Dostęp do określonego katalogu traktowanego jako kolekcja zawartego w XML Repository Przykłady uŜycia funkcji XMLQuery w bazie danych Oracle dostępne są na slajdach wykładowych. W SQL*Plusie (wersja 10g lub wyŜsza) moŜna takŜe wpisywać polecenia XQuery bezpośrednio poprzedzając je słowem kluczowym XQUERY Oracle wspiera praktycznie wszystkie (istnieją małe wyjątki) funkcje i operatory zawarte w specyfikacji XQuery 1.0 and XPath 2.0 Functions and Operators C. DB2 Podczas pracy z bazą danych korzystamy z edytora komend wchodzącego w skład klienta bazy danych DB2 w wersji 9.1 i wyŜszych. Łączymy się z bazą danych ZSBD_DB działającej pod instancją DB2 na komputerze <host>. Korzystamy z konta podanego przez prowadzącego. Aby uŜyć zapytań XQuery w bazie danych DB2 moŜna skorzystać z funkcji XMLQUERY. Przydatne funkcje XQuery: • db2-fn:xmlcolumn ('db-table.tab-column') Dostęp do danych zawartych w kolumnie typu XML (funkcjonuje jak kolekcja dokumentów) • db2-fn:sqlquery('SQL-query') Dostęp do XML danych wydobytych na podstawie zapytania SQL (funkcjonuje jak kolekcja dokumentów) Polecenia XQuery moŜna takŜe wpisywać bezpośrednio poprzedzając je słowem kluczowym XQUERY I. Wykorzystując A. Dokument bib.xml znajdujący się w kolekcji bib B. Dokument /public/bib.xml znajdujący się w repozytorium XML i funkcję doc pozwalającą odwołać się do tego dokumentu C. Dokument bib.xml umieszczony w jedynej krotce tabeli BIBS znajdującej się w schemacie ZSBD_OWNER wykonaj poniŜsze ćwiczenia. Schemat dokumentu bib.xml: <!ELEMENT <!ELEMENT <!ATTLIST <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT bib book book author editor title last first affiliation publisher price (book* )> (title, (author+ | editor+ ), publisher, price )> year CDATA #REQUIRED > (last, first )> (last, first, affiliation )> (#PCDATA )> (#PCDATA )> (#PCDATA )> (#PCDATA )> (#PCDATA )> (#PCDATA )> 1. Pobierz nazwiska wszystkich autorów ksiąŜek. <last>Stevens</last> <last>Stevens</last> <last>Abiteboul</last> <last>Buneman</last> <last>Suciu</last> 2. Dla kaŜdej pary elementów title, author istniejących w jednym elemencie book stwórz element ksiąŜka posiadający w sobie dwa podelementy title, author. <ksiazka> <author> <last>Stevens</last> <first>W.</first> </author> <title>TCP/IP Illustrated</title> </ksiazka> <ksiazka> <author> <last>Stevens</last> <first> W.</first> </author> <title>Advanced Programming in the Unix environment</title> </ksiazka> <ksiazka> <author> <last>Abiteboul</last> <first>Serge</first> </author> <title>Data on the Web</title> </ksiazka> <ksiazka> <author> <last>Buneman</last> <first>Peter</first> </author> <title>Data on the Web </title> </ksiazka> <ksiazka> <author> <last>Suciu</last> <first>Dan</first> </author> <title>Data on the Web</title> </ksiazka> 3. Dla kaŜdej pary title, author stwórz element ksiąŜka posiadający w sobie dwa podelementy tytuł, autor. <ksiazka> <autor>StevensW.</autor> <tytul>TCP/IP Illustrated</tytul> </ksiazka> <ksiazka> <autor>StevensW.</autor> <tytul>Advanced Programming in the Unix e nvironment</tytul> </ksiazka> <ksiazka> <autor>AbiteboulSerge</autor> <tytul>Data on the Web</tytul> </ksiazka> <ksiazka> <autor>BunemanPeter</autor> <tytul>D ata on the Web</tytul> </ksiazka> <ksiazka> <autor>SuciuDan</autor> <tytul>Data on the Web</tytul> </ksiazka> 4. W powyŜszym zapytaniu utwórz znacznik obejmujący rezultat zapytania <wynik>. W przypadku zastosowania podzapytania pamiętaj o objęciu podzapytania klamrami { }. <wynik> <ksiazka> <autor>StevensW.</autor> <tytul>TCP/IP Illustrated</tytul> </ksiazka> <ksiazka> <autor>StevensW.</autor> <tytul>Advanced Programming in the Unix e nvironment</tytul> . . . </wynik> 5. Wyświetl imiona autorów ksiąŜki "Data on the Web". <imiona> <imie>Serge</imie> <imie>Peter</imie> <imie>Dan</imie> </imiona> 6. Uzyskaj informację o całym elemencie – ksiąŜce, posiadającej tytuł "Data on the Web". Uzyskaj ten wynik na dwa sposoby: za pomocą odpowiedniego wyraŜenia ścieŜkowego oraz za pomocą klauzuli WHERE. <DataOnTheWeb> <book year="2000"> <title>Data on the Web</title> <author> <last>Abiteboul</last> <first>Serge</first> </author> <author> <last>Buneman</last> <first>Peter</first> </author> <author> <last>Suciu</last> <first>Dan</first> </author> <publisher>Morg an Kaufmann Publishers</publisher> <price>39.95</price> </book> </DataOnTheWeb> 7. Pobierz elementy nazwiska autorów ksiąŜek, które w tytule posiadają ciąg znaków „Data”. Zastosuj funkcję ora:contains. <Data> <nazwisko>Abiteboul</nazwisko> <nazwisko>Buneman</nazwisko> <nazwisko>Suciu</nazwisko> </Data> 8. Dołącz do nazwisk tytuł ksiąŜki, której tytuł posiada ciąg znaków „Data”. <Data> <title>Data on the Web</title> <nazwisko>Abiteboul</nazwisko> <nazwisko>Buneman</nazwisko> <nazwisko>Suciu</nazwisko> </Data> 9. Wyświetl te tytuły ksiąŜek, które mają nie więcej niŜ dwóch autorów (<=2) <title>TCP/IP Illustrated</title> <title>Advanced Programming in the Unix environment</title> <title>The Economics of Technology and Content for Digital TV</title> 10. Podaj tytuły ksiąŜek i liczbę ich autorów <ksiazka> <title>TCP/IP Illustrated</title> <autorow>1</autorow> </ksiazka> <ksiazka> <title>Advanced Programming in the Unix environment</title> <autorow>1 </autorow> </ksiazka> <ksiazka> <title>Data on the Web</title> <autorow>3</autorow> </ksiazka> <ksiazka> <title>The Economics of Technology and Content for Digital TV</title> <autorow>0</autorow> </ksiazka> 11. Podaj przedział lat, jaki obejmują ksiąŜki zawarte w kolekcji dokumentów <ksiazka>1,992E+003 - 2,0E+003</ksiazka> 12. Sprawdź jaka jest róŜnica cen pomiędzy najdroŜszą i najtańszą ksiąŜką. Jeśli jest taka potrzeba, zmień wartość parametru NLS_NUMERIC_CHARACTERS (Oracle). <ksiazka>8.9999999999999986E+001</ksiazka> 13. Znajdź tytuły i autorów (jeśli istnieją) najdroŜszych ksiąŜek <najdroŜsze> <najdroŜsza> <title>The Economics of Technology and Content for Digital TV</title> </najdroŜsza> </najdroŜsze> 14. Dla kaŜdego autora wyświetl tytuły jego ksiąŜek <autor> <last>Abiteboul</last> <title>Dat a on the Web</title> </autor> <autor> <last>Buneman</last> <title>Data on the Web</title> </autor> <autor> <last>Stevens </last> <title>TCP/IP Illustrated</title> <title>Advanced Programming in the Unix environment</title> </autor> <autor> <last>Suciu</last> <title>Data on the Web</title> </autor> II. Wykorzystując A. zawartość kolekcji lp3/notowanie1000 B. dokument dotyczący 1000-nego notowania LP3 znajdujący się w tabeli LP3.LP3XML pod indeksem 1000 (DOC_ID=1000) C. dokument dotyczący 1000-nego notowania LP3 znajdujący się w tabeli ZSBD_OWNER.LP3XML pod indeksem 1000 (DOC_ID=1000) wykonaj poniŜsze ćwiczenia. 15. Zobacz jaki był prowadzący tego notowania. MoŜesz zastosować funkcję string(). <NOTOWANIE> <NR>1000</NR> <PROWADZACY>NiedźwieckiMarek</PROWADZACY> </NOTOWANIE> 16. Wyświetl wykonawców z pierwszych dziesięciu miejsc. <WYNIK> <TOP10> <LP>1</LP> <TYTUL>A Thousand Years</TYTUL> <WYKONAWCA>Sting</WYKONAWCA> </TOP10> <TOP10> <LP>2</LP> <TYTUL>Malcziki</TYTUL> <WYKONAWCA>Yugoton && Kazik</WYKONAWCA> </TOP10> <TOP10> <LP>3</LP> <TYTUL>King Of Sorrow</TYTUL> <WYKONAWCA>Sade</WYKONAWCA> </TOP10> . . . </WYNIK> III. Wykorzystując A. Kolekcję lp3/dziesiec_pierwszych B. Zawartość tabeli LP3.LP3XML10 C. Zawartość tabeli ZSBD_OWNER.LP3XML10 wykonaj poniŜsze ćwiczenia. 17. Wyświetl nazwisko prowadzącego, który prowadził wszystkie notowania <wynik></wynik> 18. Znajdź notowanie, w którym liczba miejsc była róŜna od 30 <notowanie><DATA>05.06.1982</DATA><ile_miejsc>31</ile_miejsc></notowanie> IV. Wykorzystując A. B. funkcję ora:view oraz tabele PRACOWNICY i ZESPOLY C. funkcje SQL/XML oraz tabele PRACOWNICY i ZESPOLY wykonaj poniŜsze ćwiczenia. 19. Wyświetl to, co daje w wyniku B. funkcja ora:view(„ZESPOLY”) C. funkcje SQL/XML zastosowane dla tabeli ZESPOLY <ROW> <ID_ZESP>10</ID_ZESP> <NAZWA>ADMINISTRACJA</NAZWA> <ADRES>PIOTROWO 3A</ADRES> </ROW> <ROW> <ID_ZESP>20</ID_ZESP> <NAZWA>SYSTEMY ROZPROSZONE</NAZWA> <ADRES>PIOTROWO 3A</ADRES> </ROW> . . . 20. Wyświetl nazwy zespołów oraz liczbę ich pracowników. Wyniki posortuj wg liczby pracowników. <ZESPOL> <NAZWA>BADANIA OPERACYJNE</NAZWA> <LICZBA>0</LICZBA> </ZESPOL> <ZESPOL> <NAZWA>ALGORYTMY</NAZWA> <LICZBA>1</LICZBA> </ZESPOL> <ZESPOL> <NAZWA>ADMINISTRACJA</NAZWA> <LICZBA>2</LICZBA> </ZESPOL> <ZESPOL> <NAZWA>SYSTEMY EKSPERCKIE</NAZWA> <LICZBA>4</LICZBA> </ZESPOL> <ZESPOL> <NAZWA>SYSTEMY ROZPROSZONE</NAZWA> <LICZBA>7</LICZBA> </ZESPOL> 21. Wyświetl pracowników i ich podwładnych. Pomiń pracowników bez podwładnych. <SZEFOWIE> <SZEF ID_PRAC="100"> <NAZWISKO>WEGLARZ</NAZWISKO> <PODWLADNI> <NAZWISKO>BLAZEWICZ</NAZWISKO> <NAZWISKO>SLOWINSKI</NAZWISKO> <NAZWISKO>BRZEZINSKI</NAZWISKO> <NAZWISKO>MAREK</NAZWISKO> </PODWLADNI> </SZEF> <SZEF ID_PRAC="110"> <NAZWISKO>BLAZEWICZ</NAZWISKO> <PODWLADNI> <NAZWISKO>KONOPKA</NAZWISKO> </PODWLADNI> </SZEF> . . . </SZEFOWIE> 22. Wyświetl nazwy zespołów oraz element zaleŜny od liczby ich pracowników. Warianty to: 0, 1, n, max. Wyniki posortuj wg liczby pracowników. <ZESPOL> <NAZWA>BADANIA OPERACYJNE</NAZWA> <BRAK_PRACOWNIKOW></BRAK_PRACOWNIKOW> </ZESPOL> <ZESPOL> <NAZWA>ALGORYTMY</NAZWA> <PRACOWNIK>BLAZEWICZ</PRACOWNIK> </ZESPOL> <ZESPOL> <NAZWA>ADMINISTRACJA</NAZWA> <LICZBA>2</LICZBA> </ZESPOL> <ZESPOL> <NAZWA>SYSTEMY EKSPERCKIE</NAZWA> <LICZBA>4</LICZBA> </ZESPOL> <ZESPOL> <NAZWA>SYSTEMY ROZPROSZONE</NAZWA> <NAJWIECEJ></NAJWIECEJ> </ZESPOL> V. Wykorzystując A. Kolekcję /shakespeare/all_plays B. Funkcję collection oraz kolekcję /public/shakespeare w repozytorium XML C. Tabelę ZSBD_OWNER.SHAKESPEARE_XML wykonaj poniŜsze ćwiczenia. Dokumenty w tej kolekcji są zgodne z poniŜszym DTD: <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT PLAY (TITLE, FM, PERSONAE, SCNDESCR, PLAYSUBT, INDUCT?, PROLOGUE?, ACT+, EPILOGUE?)> FM (P+)> PERSONAE (TITLE, (PERSONA | PGROUP)+)> PGROUP (PERSONA+, GRPDESCR)> INDUCT (TITLE, SUBTITLE*, (SCENE+|(SPEECH|STAGEDIR|SUBHEAD)+))> ACT (TITLE, SUBTITLE*, PROLOGUE?, SCENE+, EPILOGUE?)> SCENE (TITLE, SUBTITLE*, (SPEECH | STAGEDIR | SUBHEAD)+)> PROLOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)> EPILOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)> SPEECH (SPEAKER+, (LINE | STAGEDIR | SUBHEAD)+)> LINE (#PCDATA | STAGEDIR)*> 23. Wyświetl tytuły sztuk. <WYNIK> <TITLE>The Tragedy of Antony and Cleopatra</TITLE> <TITLE>All's Well That Ends Well</TITLE> <TITLE>As You Like It</TITLE> <TITLE>The Comedy of Errors</TITLE> <TITLE>The Tragedy of Coriolanus</TITLE> . . . 24. Wyświetl tytuły sztuk. Wykorzystując funkcję XMLTable doprowadź do umieszczenia kaŜdego z tytułów w oddzielnym wierszu. Funkcja XMLTable jako argument posiada zapytanie XQuery. KaŜdy „wiersz” uzyskiwany przez zapytanie XQuery jest oddzielnym wierszem w wyniku. <TITLE>The Tragedy of Antony and Cleopatra</TITLE> <TITLE>All's Well That Ends Well</TITLE> <TITLE>As You Like It</TITLE> <TITLE>The Comedy of Errors</TITLE> <TITLE>The Tragedy of Coriolanus</TITLE> <TITLE>Cymbeline</TITLE> . . . 37 wierszy zostało wybranych. 25. Dla kaŜdej sztuki podaj jej tytuł oraz krótką statystkę <wynik> <sztuka> <TITLE>The Tragedy of Antony and Cleopatra</TITLE> <postaci>10</postaci> <aktow>5</aktow> <scen>42</scen> </sztuka> <sztuka> <TITLE>All's Well That Ends Well</TITLE> <postaci>11</postaci> <aktow>5</aktow> <scen>23</scen> </sztuka> . . . VI. (Tylko B) Wykorzystując kolekcję /public/zespoly tabelę ZESPOLY oraz dokument znajdujący się pod adresem http://www.cs.put.poznan.pl/kjankiewicz/pds/etaty.xml wykonaj następujące zadania. 26. Wykonaj operację połączenia tabeli ZESPOLY z informacją o pracownikach w kolekcji /public/zespoly <wynik> <PRACOWNIK> <NAZWA>ADMINISTRACJA</NAZWA> <NAZWISKO>WEGLARZ</NAZWISKO> </PRACOWNIK> <PRACOWNIK> <NAZWA>ADMINISTRACJA</NAZWA> <NAZWISKO>MAREK</NAZWISKO> </PRACOWNIK> <PRACOWNIK> <NAZWA>ALGORYTMY</NAZWA> <NAZWISKO>BLAZEWICZ</NAZWISKO> </PRACOWNIK> . . . 27. Dla kaŜdego etatu z dokumentu o podanym adresie wyświetl jego nazwę oraz listę pracowników zatrudnionych na tym etacie. PoniŜej przykład zapytania pobierającego zawartość dokumentu o podanym adresie. <WYNIK> <ETAT> <NAZWA>PROFESOR</NAZWA> <PRACOWNICY> <NAZWISKO>BLAZEWICZ</NAZWISKO> <NAZWISKO>SLOWINSKI</NAZWISKO> <NAZWISKO>BRZEZINSKI</NAZWISKO> <NAZWISKO>MORZY</NAZWISKO> </PRACOWNICY> </ETAT> . . . <ETAT> <NAZWA>BEZROBOTNY</NAZWA> <PRACOWNICY/> </ETAT> </WYNIK> Przykładowe zapytanie: select XMLQuery( ' for $e in $etaty return $e' passing xmlparse(document(httpuritype('http://www.cs.put.poznan.pl/kjankiewicz/pds/etaty.xml').getclob())) as "etaty" returning content) from dual; 28. Wykorzystując wszystkie trzy źródła uzyskaj następujący wynik <WYNIK> <PRACOWNIK> <NAZWA>ADMINISTRACJA</NAZWA> <NAZWISKO>WEGLARZ</NAZWISKO> <KATEGORIE_ETATOWE> <NAZWA>STAZYSTA</NAZWA> <NAZWA>DYREKTOR</NAZWA> </KATEGORIE_ETATOWE> </PRACOWNIK> <PRACOWNIK> <NAZWA>ADMINISTRACJA</NAZWA> <NAZWISKO>MAREK</NAZWISKO> <KATEGORIE_ETATOWE> <NAZWA>ASYSTENT</NAZWA> <NAZWA>SEKRETARKA</NAZWA> </KATEGORIE_ETATOWE> </PRACOWNIK> . . . 29. Wykorzystując tabelę zespoły i kolekcję /public/zespoly wyświetl nazwy zespołów, w których kaŜdy z pracowników zarabia powyŜej 1000 zł <NAZWA>ALGORYTMY</NAZWA> 30. Na zakończenie, wykorzystując tabelę PRACOWNICY wyświetl płace pracowników w przeliczeniu na dostępne w dokumencie http://www.nbp.pl/Kursy/xml/a248z051223.xml waluty. <PRACOWNIK> <NAZWISKO>WEGLARZ</NAZWISKO> <PLACA_POD> <WARTOSC></WARTOSC> <WALUTA>USD</WALUTA> </PLACA_POD> <PLACA_POD> <WARTOSC></WARTOSC> <WALUTA>AUD</WALUTA> </PLACA_POD> . . . </PRACOWNIK> <PRACOWNIK> <NAZWISKO>MAREK</NAZWISKO> <PLACA_POD> <WARTOSC></WARTOSC> <WALUTA>USD</WALUTA> </PLACA_POD> <PLACA_POD> <WARTOSC></WARTOSC> <WALUTA>AUD</WALUTA> </PLACA_POD> </PRACOWNIK> . . .