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 &amp;&amp; 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&apos;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&apos;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&apos;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>
. . .