PostgreSQL umożliwia zarówno generację dokumentów XML na podstawie danch relacyjnych, jak i gromadzenie i przetwarzanie dokumentów XML. Opis funkcji umożliwiających dostęp do danych XML znajduje się pod adresem: http://www.postgresql.org/docs/9.1/static/functions-xml.html
Dana jest tabela kompozycje
w bazie danych Internetowej Kwiaciarni:
Table "public.kompozycje" Column | Type | Modifiers --------------+------------------------+----------- idkompozycji | character(5) | not null nazwa | character varying(40) | not null opis | character varying(100) | cena | numeric(7,2) | minimum | integer | stan | integer |
Napisz odpowiednie zapytanie tworzące w/w tabelę.
Wykonaj skrypt kwiaciarnia-kompozycje.sql umieszczający przykładowe dane w w/w tabeli.
Napisz odpowiednie zapytanie, które zwróci kompletny dokument XML reprezentujący kompozycje, których stan jest większy niż 4. Dokument ma być zgodny z przykładem poniżej.
<flowers> <bouquet id="ko2" quant="12" price="120"> <name>Kosz rozyczek</name> <description>tuzin czerwonych rozyczek, molucella, gips, sizal, koszyk czerwony z palakiem</description> </bouquet> ... </flowers>
Utwórz tabelę printers
umożliwiającą przechowywanie informacji o drukarkach tj. nazwę oraz dokument XML opisujący jej parametry. Zbuduj również odpowiedni klucz główny.
Informacje o drukarkach dane są w postaci zbioru plików XML.
Załaduj w/w dokumenty XML do tabeli printers
.
Możesz zainspirować się poniższym skryptem:
#!/bin/bash for i in *.xml do cat <<EOT INSERT INTO printer (name,description) VALUES( '$i', '`cat $i`'); EOT done
Sprawdź czy operacja ładowania się powiodła i informacje o drukarkach znajdują sie w tabeli.
Uwaga: używając powyższej metody może pojawić się problem z apostrofami w dokumentach XML! Aby problem rozwiązać można zamienić wszystkie apostrofy na podwójne apostrofy przy tworzeniu odpowiednich zapytań INSERT.
Posłuż się przykładem z wykładu, aby zbudować odpowiednie wyrażenia XPath mające zastosowanie poniżej.
Napisz zapytanie, które znajdzie nazwy i rozdzielczości poziome wszystkich drukarek.
Rozdzielczość reprezentowana jest przez element x
w dpi
w resolution
w mechanism
w printer
Napisz zapytanie, które znajdzie nazwy i rozdzielczości poziome wszystkich drukarek i uporządkuj je rosnąco z uwagi na rozdzielczość zakłądająć, że rozdzielczość jesty typu text
(dokonaj odpowiedniego rzutowania).
Rozdzielczość reprezentowana jest przez element x
w dpi
w resolution
w mechanism
w printer
Napisz zapytanie, które znajdzie nazwy i rozdzielczości poziome wszystkich drukarek i uporządkuj je rosnąco z uwagi na rozdzielczość zakłądająć, że rozdzielczość jesty typu int
(dokonaj odpowiedniego rzutowania).
Rozdzielczość reprezentowana jest przez element x
w dpi
w resolution
w mechanism
w printer
Napisz zapytania, które znajdzie nazwy wszystkich kolorowych drukarek o rozdzielczości poziomej większej niż 1200.
Rozdzielczość reprezentowana jest przez element x
w dpi
w resolution
w mechanism
w printer
Drukarka kolorowa będzie zawierała element color
w mechanism
w printer
.
Zweryfikuj wydajność zapytań z poprzedniego ćwiczenia z użyciem EXPLAIN.
Utwórz indeks na wartości rozdzielczości poziomej (skorzystaj z przykładu z wykładu).
Zweryfikuj wydajność zapytań z poprzedniego ćwiczenia.
Uwaga, może zaistnieć konieczność przekonania bazy danych o użyciu indeksów:
SET ENABLE_SEQSCAN TO OFF;
Uwaga, zwróć uwagę na typ danych tworzonego indeksu i typ danych używany w zapytaniach. Indeks zostanie użyty jedynie gdy typy będą takie same.