XQuery – konkurencja dla SQL? - Instytut Automatyki i Informatyki

Transkrypt

XQuery – konkurencja dla SQL? - Instytut Automatyki i Informatyki
XQuery – konkurencja dla SQL?
Wprowadzenie – czym jest XQuery?
Podstawy składni języka XQuery
UŜycie XQuery
XQuery – konkurencja dla SQL?
XQuery w Oracle 10g r. 2
Oracle XML Query Service
Tomasz Traczyk
Podsumowanie
Wydział Elektroniki i Technik Informacyjnych
Politechnika Warszawska
T. Traczyk
XQuery – konkurencja dla SQL?
2
Po co XQuery
XQuery??
Po co język zapytań do XML?
•
Wyszukiwanie w
– dokumentach XML
» z plików
» z baz danych
– innych źródłach w XML-u
» strony WWW
Wprowadzenie – czym jest XQuery
» usługi sieciowe (Web services)
» bazy danych
» itp.
•
Przetwarzanie danych z tych źródeł
– obliczenia
– łączenie danych
– kształtowanie formatu wyniku
– przetwarzanie w stylu bliŜszym programistom (w porównaniu do XSLT)
T. Traczyk
XQuery – konkurencja dla SQL?
3
T. Traczyk
XQuery – konkurencja dla SQL?
4
Język zapytań dla XML
Czym jest XQuery
XQuery??
XQuery (XML Query)
Czego oczekujemy od języka zapytań?
•
1. Powinien umoŜliwiać zapisanie złoŜonych warunków wyszukiwania
Deklaratywny język zapytań
2. Powinien być deklaratywny
– przeznaczony do wyszukiwania w źródłach XML-owych
3. Powinien zwracać wyniki w tej samej formie, w jakiej otrzymuje dane źródłowe
– bazujący na XPath 2.0
– umoŜliwiający konstruowanie dokumentów XML
4. Powinien umoŜliwiać sortowanie
– o moŜliwościach porównywalnych z językami zapytań dla baz danych
5. Powinien umoŜliwiać wykonywanie przekształceń wyszukanej informacji,
•
w tym agregacji
Język funkcyjny
– wolny od efektów ubocznych
– z moŜliwością silnego typowania
Dlaczego nie wystarczy XPath?
•
•
•
•
Języki zapytań do baz danych (np. SQL, OQL) spełniają te oczekiwania
Składnia XQuery
– ma być czytelna dla człowieka
XPath spełnia tylko 1. i 2.
» nie jest dialektem XML
Ale na bazie XPath moŜna zbudować język zapytań mający pozostałe poŜądane cechy
T. Traczyk
XQuery – konkurencja dla SQL?
5
XQuery – konkurencja dla SQL?
T. Traczyk
Przykład
Przykład, c.d.
Przeszukiwany dokument:
Zapytanie XQuery:
– wyszukiwanie publikacji z roku 1998
<?xml version = '1.0' encoding = 'windows-1250'?>
<publikacje>
<publikacja id="360" typ="REFERAT">
<tytul>Język XML w aplikacjach z bazami danych</tytul>
<autorzy>
<autor afiliacja="WEiTI">
<nazwisko>Traczyk</nazwisko><imiona>Tomasz</imiona>
</autor>
<autor afiliacja="WEiTI">
<nazwisko>Macewicz</nazwisko><imiona>Włodzimierz</imiona>
</autor>
</autorzy>
<cechy>
<cecha id="TYTUŁ_KONFER">
IV Konferencja uŜytkowników i developerów Oracle
</cecha>
<cecha id="MIEJSCE_KONF">Kościelisko</cecha>
<cecha id="ORGANIZATOR">PLOUG</cecha>
<cecha id="STRONY">133-146</cecha>
</cechy>
<rok>1998</rok>
</publikacja>
<publikacja>
...
</publikacja>
...
Uproszczony fragment danych wyjściowych z systemu informacji
</publikacje>
o publikacjach na Wydziale Elektroniki i Technik Informacyjnych
Politechniki Warszawskiej
T. Traczyk
6
XQuery – konkurencja dla SQL?
Zmienna $b przebiega sekwencję węzłów będącą wynikiem ścieŜki XPath
<odpowiedz>
{
for $b in doc("/public/publikacje.xml")
)//publikacja
doc(
where $b//rok="1998"
return
<referat rok="{
{$b/rok}
}" miejsce="{
{$b//cecha[@id='MIEJSCE_KONF']}
}">
{$b/tytul}
}
</referat>
}
</odpowiedz>
7
T. Traczyk
XQuery – konkurencja dla SQL?
8
Przykład, c.d.
Przykład, c.d.
Zapytanie XQuery:
Zapytanie XQuery:
– wyszukiwanie publikacji z roku 1998
– wyszukiwanie publikacji z roku 1998
Warunek where pozwala dodatkowo ograniczyć wynik
<odpowiedz>
{
for $b in doc("/public/publikacje.xml")
)//publikacja
doc(
where $b//rok="1998"
return
<referat rok="{
{$b/rok}
}" miejsce="{
{$b//cecha[@id='MIEJSCE_KONF']}
}">
{$b/tytul}
}
</referat>
}
</odpowiedz>
<odpowiedz>
w treści wyniku moŜna uŜyć wyraŜeń odwołujących się do zmiennych
{
for $b in doc("/public/publikacje.xml")
)//publikacja
doc(
where $b//rok="1998"
return
<referat rok="{
{$b/rok}
}" miejsce="{
{$b//cecha[@id='MIEJSCE_KONF']}
}">
{$b/tytul}
}
</referat>
}
</odpowiedz>
T. Traczyk
XQuery – konkurencja dla SQL?
Klauzula return kształtuje postać wyniku;
9
T. Traczyk
Przykład, c.d.
XQuery – konkurencja dla SQL?
10
Przykład, c.d.
Zapytanie XQuery:
Zapytanie XQuery:
– wyszukiwanie publikacji z roku 1998
– wyszukiwanie publikacji z roku 1998
Cały wynik zapytania moŜna „wmontować” w strukturę XML
<odpowiedz>
{
for $b in doc("/public/publikacje.xml")
)//publikacja
doc(
where $b//rok="1998"
return
<referat rok="{
{$b/rok}
}" miejsce="{
{$b//cecha[@id='MIEJSCE_KONF']}
}">
{$b/tytul}
}
</referat>
}
</odpowiedz>
<odpowiedz>
{
for $b in doc("/public/publikacje.xml")
)//publikacja
doc(
where $b//rok="1998"
return
<referat rok="{
{$b/rok}
}" miejsce="{
{$b//cecha[@id='MIEJSCE_KONF']}
}">
{$b/tytul}
}
</referat>
}
</odpowiedz>
Wynik:
<odpowiedz>
<referat rok="1998" miejsce="Kościelisko">
<tytul>
Język XML w aplikacjach z bazami danych
</tytul>
</referat>
...
</odpowiedz>
T. Traczyk
XQuery – konkurencja dla SQL?
11
T. Traczyk
XQuery – konkurencja dla SQL?
12
ZałoŜenia XQuery
Czytelność składni języka dla człowieka
Deklaratywność
NiezaleŜność od protokołów i środowisk uŜycia
Uwzględnienie XML-owego modelu danych, przestrzeni nazw i schematów XML
Działanie takŜe bez dostępu do schematów dokumentów
Silne typowanie (typy proste i złoŜone)
Istnienie kwantyfikatorów
MoŜliwość operowania na hierarchiach i sekwencjach
MoŜliwość łączenia informacji z wielu źródeł
MoŜliwość wykonywania agregacji
Transformacje dokumentów XML i moŜliwość tworzenia wynikowych struktur XML
MoŜliwość nawigowania po odwołaniach (referencjach) do identyfikatorów
T. Traczyk
Standaryzacja XQuery
Ciało standaryzujące
XQuery – konkurencja dla SQL?
•
•
Standaryzacja jest prowadzona przez XML Query Working Group w ramach W3C
Język XQuery jest silnie zaleŜny od XPath 2.0 – standaryzacją zajmuje się ta sama grupa
Stan standaryzacji
•
Główne dokumenty dotyczące standaryzacji XQuery mają status
Candidate Recommendation (listopad 2005)
•
Proces standaryzacyjny wciąŜ trwa, ale jest bliski ukończenia
13
T. Traczyk
XQuery – konkurencja dla SQL?
14
Podstawowe zasady języka
Język funkcyjny
Sekwencje
•
Wszystkie konstrukcje języka są wyraŜeniami
zwracającymi wartość
•
•
MoŜna je zagnieŜdŜać
Podstawy składni języka XQuery
15
•
Sekwencji nie moŜna zagnieŜdŜać
•
Porządek w sekwencji
– zgodny z tzw. porządkiem dokumentu
– chyba Ŝe uŜyto klauzuli order by
•
Format języka
XQuery – konkurencja dla SQL?
Pojedyncza jednostka jest toŜsama
z jednoelementową sekwencją
Na wyjściu teŜ sekwencja
– dokument lub fragment
T. Traczyk
•
– wynik wyraŜenia z zagnieŜdŜeniem
zostaje „spłaszczony”
– kolekcja dokumentów lub fragmentów
•
•
•
– węzłów
Na wejściu tzw. sekwencja
– dokument lub fragment
•
Uporządkowany ciąg jednostek (items):
– wartości atomowych
Wartości zwracane przez wyraŜenia są
tzw. sekwencjami (w sensie XPath 2.0)
Charakter przetwarzanej informacji
•
•
Jawny zapis sekwencji:
(jednostka1, jednostka2, ...)
Swobodny
Wielkość liter ma znaczenie
Słowa kluczowe pisze się małymi literami
T. Traczyk
XQuery – konkurencja dla SQL?
16
Podstawowe elementy ję
języka
WyraŜenia
•
•
Podstawowe elementy ję
języka,
zyka, c.d.
Wartości logiczne
Wartości wszystkich wyraŜeń są sekwencjami
WyraŜenia zawierają
– stałe i jawnie zapisane sekwencje
•
•
•
– odwołania do zmiennych
Operatory i porównania
Wartości true i false
•
•
Operatory or i and oraz funkcja not()
Efektywna wartość logiczna wyraŜeń
» liczba 0 lub NaN
– wywołania funkcji wbudowanych
i uŜytkownika
» pusta sekwencja
•
– prawda w przeciwnym wypadku
– wyraŜenia FLWOR
– nie dotyczy to jawnych konwersji cast as
•
•
Mogą, ale nie muszą, być deklarowane
•
•
17
Część else jest obowiązkowa
XQuery – konkurencja dla SQL?
T. Traczyk
Podstawowe elementy języka, c.d.
18
Budowa zapytania XQuery
Funkcje wbudowane
•
•
Postać:
then wyraŜenie1
else wyraŜenie2
Komentarze moŜna zagnieŜdŜać
XQuery – konkurencja dla SQL?
Stosowane np. w klauzuli where
if warunek
Oznaczenie: (: ... :)
– mogą być silnie typowane
T. Traczyk
Badają elementy sekwencji
WyraŜenia warunkowe
Porównywanie całych gałęzi
(z węzłami podrzędnymi): deep-equal()
Komentarze
Oznacza się $nazwa
Porównywanie toŜsamości węzłów
– porządek: <<, >>
•
•
•
satisfies warunek
•
•
– identyczność: is
– wyraŜenia warunkowe
Zmienne
satisfies warunek
– some $zmienna in sekwencja
Porównania ogólne: =, !=, <, <=, >, >=
sekwencji z kwantyfikatorem exists
•
Postać:
– every $zmienna in sekwencja
– połączenie porównania elementów
» pusty napis
– ścieŜki XPath
•
Porównania prostych wartości:
eq, ne, lt, le, gt, ge
– fałsz jeśli:
– operatory
Kwantyfikatory
Typowe operatory arytmetyczne i logiczne
XPath
Wielka liczba funkcji wbudowanych XPath 2.0
•
Obejmują m.in.
Źródła danych
Najprostszym zapytaniem XQuery jest
•
sama ścieŜka XPath
– operacje na sekwencjach: insert-before(), remove(), reverse(), empty(),
union(), intersect()
•
Wszystkie zapytania bazują
– zmiennej
na ścieŜkach XPath
– operacje na węzłach: node-before(), name(),local-name()
– funkcji – źródła danych
– ścieŜka pozwala „dostać się”
– operacje na wartościach: string(), data()
– operacje arytmetyczne: abs(), floor(), round()
do właściwych danych
– agregacje: count(), sum(), min()
w strukturze hierarchicznej
ŚcieŜka XPath uŜyta w XQuery musi zaczynać
się od źródła danych
•
Funkcje wbudowane udostępniające
dane zewnętrzne:
– doc(URI) – udostępnia dokument
– moŜna w niej umieścić złoŜone warunki
– operacje na tekstach: concat(), substring(), string-length(), upper-case(),
contains(), starts-with()
•
– wyraŜenia regularne: matches(), replace()
» Oracle10g:
W XQuery moŜna korzystać ze składni ścieŜek
nieco okrojonej w stosunku do XPath 2.0
URI dokumentu w repozytorium XDB
– collection(URI) – udostępnia kolekcję
» w Oracle10g r. 2 implementacja niezgodna ze specyfikacją
» Oracle10g:
– operacje na datach i czasie: date-equal(), date-less-than(), time-equal(),
time-less-than(), year-from-date(), day-from-date(),
adjust-time-to-timezone()
URI folderu w repozytorium XDB
– operacje na przedziałach czasu: add-yearMonthDurations(), add-dayTimeDurations()
– obsługę błędów i śledzenie
T. Traczyk
XQuery – konkurencja dla SQL?
19
T. Traczyk
XQuery – konkurencja dla SQL?
20
WyraŜenia FLWOR
WyraŜenia FLWOR
WyraŜenia FLWOR, c.d.
Zasady
Przykład: wypisanie w kolejności chronologicznej
tytułów publikacji mających tylko jednego
autora
for $p in doc(
"/public/publikacje.xml")
)//publikacja
let $a := $p/autorzy/autor
where count($a) = 1
order by $p/rok
return $p/tytul
Wynik (fragment, a nie dokument!):
...
<tytul>Język XSL</tytul>
<tytul>Czy juŜ warto uŜywać XML?</tytul>
<tytul>Schematy XML</tytul>
...
•
•
ZagnieŜdŜanie wyraŜeń FLWOR
•
Wszystkie klauzule są opcjonalne
– musi wystąpić for lub let
WyraŜenia FLWOR moŜna zagnieŜdŜać
Klauzula for
•
•
SłuŜy do organizowania iteracji
Przypisuje do zmiennej kolejne elementy
sekwencji – wyniku wyraŜenia
Klauzula let
•
•
SłuŜy do wykonywania podstawień
Przypisuje do zmiennej całą wartość wyraŜenia
na raz
Wynik:
Klauzula where
•
<spis>
<pozycja tytul="Język XML w aplikacjach z bazami danych">
<autor>Traczyk Tomasz</autor>
<autor>Macewicz Włodzimierz</autor>
</pozycja>
...
</spis>
Określa warunki filtrowania sekwencji
zwróconej przez klauzule for i let
Klauzula order by
•
Określa sortowanie tej sekwencji
Klauzula return
•
Kształtuje postać wyniku
XQuery – konkurencja dla SQL?
T. Traczyk
Pozwala tworzyć wielopoziomowe struktury
<spis>
{
for $p in doc("/public/publikacje.xml")
)//publikacja
doc(
return
<pozycja tytul="{
{$p/tytul}
}">
{
for $a in $p//autor
return
<autor> {$a/nazwisko/text()} {" "} {$a/imiona/text()} </autor>
}
</pozycja>
}
</spis>
21
T. Traczyk
Budowa zapytania XQuery, c.d.
Konstruowanie struktur wynikowych
•
Umieszczanie (literalnie) elementów
wynikowej struktury („szablonu”) w treści
zapytania
– wartości wyraŜeń XQuery wstawia się do
„szablonu” przez ujęcie wyraŜeń w { }
•
Stosowanie computed constructors
– konstruktory:
» element, attribute, text
» pi, comment
» nazw
» wartości wstawianych jednostek
T. Traczyk
Łączenie danych z róŜnych źródeł
Przykład:
for $p in doc("/public/publikacje.xml")//publikacja
return
<publikacja tytul="{$p/tytul/text()}">
{
for $c in $p//cecha
return
element {lower-case($c/@id)}
}
{
(
if ($c/@id="DATA_KONFER")
) then
attribute rok {$p/rok/text()}
}
else
nil
,
$c/text()
)
}
}
</publikacja>
•
•
XQuery dobrze nadaje się do łączenia danych z róŜnych źródeł
MoŜna wykonywać np.
– operacje podobne do złączeń relacyjnych
– wyszukania zagnieŜdŜone
Przykład:
•
Dodatkowy dokument:
<instytucje>
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
<instytucja kod="IAiIS">Instytut Automatyki i Informatyki Stosowanej</instytucja>
...
</instytucje>
<publikacja
tytul="Język XML w aplikacjach z bazami danych">
<tytuł_konfer>
IV Konferencja uŜytkowników i developerów Oracle:
Ewolucja systemów informatycznych: dane, sprzęt,
oprogramowanie i aplikacje
</tytuł_konfer>
<miejsce_konf>Kościelisko</miejsce_konf>
<data_konfer rok="1998">XI 1998</data_konfer>
<organizator>PLOUG</organizator>
<strony>133-146</strony>
</publikacja>
XQuery – konkurencja dla SQL?
22
Łączenie danych
Wynik:
– umoŜliwiają wyliczanie
XQuery – konkurencja dla SQL?
•
23
Łączone będą dane
– publikacji
– instytucji, w których afiliowani są autorzy
T. Traczyk
XQuery – konkurencja dla SQL?
24
Łączenie danych, c.d.
Łączenie danych, c.d.
Złączenie danych z róŜnych źródeł
ZagnieŜdŜenie danych z róŜnych źródeł
for $p in doc("/public/publikacje.xml")
)//publikacja,
doc(
$i in doc("/public/instytucje.xml")
)//instytucja
doc(
where $i/@kod = $p//autor/@afiliacja
return
<pozycja>
{$p/tytul}
{$i}
</pozycja>
for $p in doc("/public/publikacje.xml")
)//publikacja
doc(
return
<pozycja>
{$p/tytul}
{
)//instytucja
for $i in doc("/public/instytucje.xml")
doc(
where $i/@kod = $p//autor/@afiliacja
return $i
}
</pozycja>
Wynik:
Wynik:
<pozycja>
<tytul>Język XML w aplikacjach z bazami danych</tytul>
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
</pozycja>
<pozycja>
<tytul>Język XML w aplikacjach z bazami danych</tytul>
<instytucja kod="IAiIS">Instytut Automatyki i Informatyki Stosowanej</instytucja>
</pozycja>
<pozycja>
<tytul>Język XML w aplikacjach z bazami danych – po roku</tytul>
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
</pozycja>
...
•
<pozycja>
<tytul>Język XML w aplikacjach z bazami danych</tytul>
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
<instytucja kod="IAiIS">Instytut Automatyki i Informatyki Stosowanej</instytucja>
</pozycja>
<pozycja>
<tytul>Język XML w aplikacjach z bazami danych – po roku</tytul>
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
</pozycja>
...
Uzyskano powtórzenia, jak to przy złączeniu
T. Traczyk
XQuery – konkurencja dla SQL?
25
XQuery – konkurencja dla SQL?
T. Traczyk
Grupowanie i agregacje
Grupowanie i agregacje, c.d.
Grupowanie
•
•
26
Unikalność
•
Brak specyficznych konstrukcji językowych do grupowania
Efekt grupowania moŜna uzyskać np. przez odpowiednie zagnieŜdŜanie wynikowych
elementów XML
for $a in distinctdistinct-values( doc("/public/publikacje.xml")//autor/@afiliacja )
return
<instytucja kod="{$a}">
{
for $p in doc("/public/publikacje.xml")//publikacja[.//autor/@afiliacja = $a]
return <publikacja>{$p/tytul/text()}</publikacja>
}
</instytucja>
Funkcja distinct-values()
– eliminuje powtórzenia z wyniku zapytania
– uŜywana np. w części in klauzuli for
– działa na danych prostych typów
Funkcje agregujące
• sum(),
avg(), count(), max() i
min()
Przykład: zliczenie publikacji związanych z poszczególnymi instytucjami
for $i in doc("/public/instytucje.xml")//instytucja
let $p := doc("/public/publikacje.xml")//publikacja[.//autor/@afiliacja = $i/@kod]
return
<instytucja liczba="{count(
count($p)
">
count( )}"
{$i/text()}
</instytucja>
Wynik:
<instytucja kod="IAiIS">
<publikacja>Język XML w aplikacjach z bazami danych</publikacja>
</instytucja>
<instytucja kod="WEiTI">
<publikacja>Język XML w aplikacjach z bazami danych</publikacja>
<publikacja>Język XML w aplikacjach z bazami danych – po roku</publikacja>
...
</instytucja>
...
T. Traczyk
XQuery – konkurencja dla SQL?
Wynik:
<instytucja liczba="7">Wydział Elektroniki i Technik Informacyjnych</instytucja>
<instytucja liczba="1">Instytut Automatyki i Informatyki Stosowanej</instytucja>
27
T. Traczyk
XQuery – konkurencja dla SQL?
28
Modularyzacja
Budowa modułu
Moduły
•
•
Kod moŜe być podzielony na moduły
– zapytań
– biblioteczne
•
Moduły biblioteczne
– zawierają obowiązkowo deklarację
module
–
–
–
–
–
Zmienne zewnętrzne (external)
– pełnią rolę parametrów
– wartości są dostarczane przez środowisko
wykonania
•
•
Oracle10g r. 2
Przykład:
Funkcje uŜytkownika
Prolog
– deklaracja xquery (opcjonalna)
» wersja
» strona kodowa
– deklaracja module
(w modułach bibliotecznych)
– włączane do modułów zapytań deklaracją
import module
•
Modularyzacja, c.d.
•
declare
declare function
local:
($param)
)
local:liczba-autorow(
{ count($param//autor) }
;
MoŜliwe jest
– definiowanie funkcji uŜytkownika
– wykorzystanie ich w zapytaniach
•
•
•
» docelowa przestrzeń nazw
deklaracje import schema
deklaracje import module
deklaracje przestrzeni nazw
deklaracje zmiennych
deklaracje funkcji
•
– przeciąŜać nazw funkcji uŜytkownika
for $p in doc(
doc("/public/publikacje.xml”
)//publikacja
let $c := local:
($p)
)
local:liczba-autorow(
return
<pozycja autorow="{
{$c}
}">
{$p/tytul}
}
</pozycja>
– definiować funkcji o zmiennej liczbie
parametrów
Wynik:
Funkcje mogą mieć parametry
Parametry i wartość funkcji mogą być typowane
Nie moŜna
Funkcje lokalne muszą być umieszczone w
predefiniowanej przestrzeni nazw local
<pozycja autorow="2">
<tytul>Język XML w aplikacjach
z bazami danych</tytul>
</pozycja>
<pozycja autorow="1">
<tytul>Język XML w aplikacjach
z bazami danych – po roku</tytul>
</pozycja>
<pozycja autorow="1">
<tytul>Język XSL</tytul>
</pozycja>
...
Ciało
– zapytanie (wyraŜenie XQuery)
– nie zaimplementowano modularyzacji
» wszystko w module głównym
T. Traczyk
XQuery – konkurencja dla SQL?
29
T. Traczyk
Typowanie
•
Gdzie przydaje się typowanie
– sortowanie i porównywanie
•
•
Typy predefiniowane XML Schema
•
Typy ze schematu powiązanego z danym
dokumentem
– operacje wymagające konwersji
– wykrywanie błędów w zapytaniach
•
Typowanie dynamiczne
•
Typy predefiniowane XPath 2.0, np.
xdt:untyped, xdt:untypedAtomic,
xdt:anyAtomicType
Typowanie w XQuery
– w oparciu o schemat dokumentu
Deklaracje typów
•
•
– gdy brak schematu
» jawne deklaracje typu
» w ostateczności:
przetwarzanie reprezentacji tekstowej
Import schematów: import schema
•
Jawne deklaracje typów
– zmiennych
» domyślne i jawne konwersje
•
30
Typowanie c.d.
Dostępne typy
Typy
XQuery – konkurencja dla SQL?
– parametrów i wyników funkcji
Jawne określenie typu wyraŜeń: treat as
(statyczne, bez konwersji)
Operacje na typach
Walidacja na podstawie schematu
– wyraŜenie validate
» działa na węźle
» sprawdza zgodność ze schematem
» przypisuje dynamicznie typy
– tryby walidacji
» strict – elementy spoza schematu
powodują błąd
» lax – elementy spoza schematu
pozostają nieznanego typu
Sprawdzenia w czasie wykonania
– wykonalności operacji
– poprawności jawnych i domyślnych
konwersji
– zgodności typów z deklaracjami
•
Konstrukcje XPath 2.0 pozwalające wyszukać
elementy/atrybuty określonego typu, np.
element(*, nazwa_typu)
•
•
Jawne konwersje typów: cast as
•
Przetwarzanie zaleŜne od typu:
typeswitch... case... default...
•
Wydobywanie wartości:
Badanie czy element sekwencji jest danego
typu: instance of
– znakowej: fn:string() – daje
konkatenację reprezentacji znakowych
– typowanej: fn:data() – daje sekwencję
wartości typowanych
Typowanie statyczne
•
•
•
T. Traczyk
XQuery – konkurencja dla SQL?
31
Opcjonalne (Static Typing Feature)
Polega na sprawdzaniu poprawności typów w
czasie kompilacji zapytania XQuery
Zaimplementowane w Oracle 10g r. 2
T. Traczyk
XQuery – konkurencja dla SQL?
32
XQuery a przestrzenie nazw
XQueryX
Predefiniowane przestrzenie i prefiksy
Co to takiego?
• xs
– typy danych XML Schema
• xsi – prefiks atrybutu wskazującego instancję schematu
• xdt – typy danych XPath 2.0
• fn
– funkcje wbudowane
• local – funkcje uŜytkownika zdefiniowane lokalnie w module zapytania
• ora – funkcje rozszerzające dodane przez Oracle
•
•
Przykład:
for $t in doc("/public/publikacje.xml")
)/publikacje/publikacja/tytul return $t
doc(
<xq:query
query xmlns:xq="http://www.w3.org/2001/06/xqueryx">
<xq:flwr
flwr>
flwr
<xq:forAssignment
forAssignment variable="$t">
<xq:step
step axis="CHILD">
<xq:function
function name="doc">
<xq:constant
constant datatype="CHARSTRING">publik.xml</xq:constant
constant>
constant
</xq:function
function>
function
<xq:identifier
identifier>publikacje</xq:identifier
identifier>
identifier
identifier
</xq:step
step>
step
<xq:step
step axis="CHILD">
<xq:identifier
identifier>publikacja</xq:identifier
identifier>
identifier
identifier
</xq:step
step>
step
<xq:step
step axis="CHILD">
<xq:identifier
identifier>tytul</xq:identifier
identifier>
identifier
identifier
</xq:step
step>
step
</xq:forAssignment
forAssignment>
forAssignment
<xq:return
return>
return
<xq:variable
variable>$t</xq:variable
variable>
variable
variable
</xq:return
return>
return
</xq:flwr
flwr>
flwr
</xq:query
query>
query
UŜycie przestrzeni nazw
•
•
•
Przetwarzanie XQuery wykorzystuje przestrzenie nazw
UŜycie przestrzeni nazw w definicjach funkcji uŜytkownika jest obowiązkowe
Deklaracje przestrzeni nazw
– declare namespace – definiuje inne przestrzenie nazw (i prefiksy)
– declare default element namespace – określa przestrzeń domyślną
– deklaracje działają i na dane wejściowe, i wyjściowe
declare namespace p="urn://ploug.org";
for $i in doc("/public/instytucje.xml")//instytucja
return <p:instytucja>{$i/text()}</p:instytucja>
<p:instytucja xmlns:p="urn://ploug.org">
Wydział Elektroniki i Technik Informacyjnych
</p:instytucja>
...
T. Traczyk
XQuery – konkurencja dla SQL?
Reprezentacja XQuery w składni XML
Nieczytelna dla człowieka, ale łatwa do przetwarzania za pomocą narzędzi XML-owych
33
XQuery – konkurencja dla SQL?
T. Traczyk
34
Do czego XQuery?
Funkcje
•
Wyszukiwanie
– w źródłach XML-owych
– w źródłach mieszanych
•
Transformacje
– przekształcanie XML
– scalanie XML z wielu źródeł
•
•
•
•
UŜycie XQuery
Agregacje i inne obliczenia
Integracja danych heterogenicznych
Usługi sieciowe (Web Services)
Przetwarzane informacje
•
•
•
Środowiska
•
•
Dynamiczne serwisy WWW
– w połączeniu z XSLT i CSS
•
•
T. Traczyk
XQuery – konkurencja dla SQL?
35
T. Traczyk
Dokumenty XML
– w tym informacja semistrukturalna
Dane z baz danych
– przekształcone do XML
Usługi sieciowe (Web Services)
Systemy inter- i intranetowe
Systemy wielowarstwowe
– warstwa DBMS
– warstwa mid-tier
Systemy rozproszone
– zwłaszcza bazujące na SOAP
Systemy EDI i e-business
– zwłaszcza B2B
XQuery – konkurencja dla SQL?
36
XQuery a XSLT
XSLT
•
XQuery a SQL
XQuery
Programowanie deklaratywne (szablony)
•
XQuery
•
•
•
•
•
•
Programowanie deklaratywne
i proceduralne (np. iteracje)
•
•
•
•
•
Mało podatny na optymalizację zapytań
Bardziej podatny na optymalizację zapytań
Dość nienaturalny sposób programowania
•
•
•
•
•
•
Rozwlekły i mało czytelny kod
•
Kod dość zwarty, ale czytelny
Przeznaczony pierwotnie do formatowania
Przetwarza w zasadzie jedno źródło
Dość trudny do nauczenia
Przeznaczony do przetwarzania danych
MoŜe przetwarzać wiele źródeł
Łatwiejszy do nauczenia
Sposób programowania bliŜszy programistom,
SQL
Deklaratywny
Podatny na optymalizację zapytań
Tylko zapytania
Przetwarza dane hierarchiczne
Zwraca sekwencje (z węzłami)
Kolejność danych w odpowiedzi zgodna
•
•
•
•
•
•
z kolejnością dokumentu
zwłaszcza znającym inne języki zapytań
Deklaratywny
Podatny na optymalizację zapytań
Zapytania, DML i DDL
Przetwarza dane relacyjne
Zwraca relacje (tabele)
Kolejność danych w odpowiedzi losowa
(jeśli bez sortowania)
(jeśli bez sortowania)
•
Dobry do przetwarzania informacji strukturalnej
•
Przetwarza tylko informację strukturalną
i semistrukturalnej
XQuery – konkurencja dla SQL?
T. Traczyk
37
Implementacje XQuery
Najbardziej znane implementacje
•
– Saxon
Testy implementacji XQuery
•
Mogą być składane za pomocą „konsol” XQuery
•
Rozbudowany zestaw zapytań testowych
•
SłuŜyć mogą do zapytań ad-hoc, nauki języka,
testowania zapytań itp.
Narzędzia automatyzujące testowanie
Usługi WWW (Web Services)
– Qexo (GNU)
•
XQuery a Java
Zapytania interaktywne
•
•
– Qizx/open
Komercyjne
•
Narzędzia do XQuery
– Oracle 10g r. 2
•
– MS SQL Server 2005
•
– BEA AquaLogic Data Services Platform
•
38
Konteksty uŜycia XQuery
BumbleBee
Open-source itp.
XQuery – konkurencja dla SQL?
T. Traczyk
•
Stylus Studio XQuery Tools
Oracle JDeveloper 10g
•
•
MoŜna uŜyć JDBC i funkcji SQL/XML
– OJXQI (Oracle Java XQuery API)
Opracowywany jest standard interfejsu
– zaangaŜowane Oracle, IBM, BEA, Sun,
Sybase i in.
Oracle10g r. 2 udostępnia wyniki zapytań
– „ideologia” zgodna z JDBC
XQuery przez protokół SOAP
– „stylistyka” API zgodna z JDBC i JAXP
Przetwarzanie w DBMS
•
Istniejące implementacje mają własne API
programistycznego XQJ
XQuery zwraca XML, jest więc idealnym
językiem zapytań dla WebServices
Altova XMLSpy XQuery Development
•
– nawigacyjny mechanizm dostępu („kursory”)
– przewidziana jest obsługa transakcji
XQuery w postaci SQL/XML daje się
zanurzać w PL/SQL
Przetwarzanie w warstwie mid-tier
•
T. Traczyk
XQuery – konkurencja dla SQL?
39
Interfejsy API do języka Java
T. Traczyk
XQuery – konkurencja dla SQL?
40
XML i XQuery w integracji danych
XML jako format integracji
•
•
•
•
•
•
XQuery jako narzędzie do integracji
Bardzo odpowiedni format do integracji
DuŜa siła wyrazu
– moŜe reprezentować dowolne dane
mające postać tekstową
Elastyczność
Łatwo dostępne narzędzia
Własny język wielu źródeł danych
– serwisy w XML, XHTML
– Web Services
Stosunkowo łatwa konwersja innych źródeł
– bazy danych
– arkusze kalkulacyjne
– HTML
– itp.
T. Traczyk
•
•
•
Dobre narzędzie do integracji danych XML
Cechy języka zapytań XQuery
– deklaratywny
» łatwe pisanie zapytań
nie trzeba kodować algorytmów
– uniwersalny
» łatwe łączenie dane z wielu źródeł
» dowolne formatowanie wyniku
– wydajny
» zapytania podlegają optymalizacji
XQuery umoŜliwia
– integrację źródeł danych
» w czasie rzeczywistym
» bez replikowania informacji
– efektywność
» dobry stosunek wydajności
i jakości wyniku do nakładów
– elastyczność integracji
» łatwe rozszerzanie
» łatwa adaptacja do zmian
danych źródłowych
XQuery – konkurencja dla SQL?
XQuery w Oracle 10g r. 2
41
T. Traczyk
XQuery w technologii Oracle
•
•
•
42
Konsola XQuery
Oracle10g release 2
•
XQuery – konkurencja dla SQL?
SQL*Plus 10g r. 2
Wbudowane rozwiązania zgodne z XQuery 1.0 Working Draft April 2005
– z niewielkimi odstępstwami
Nowe funkcje SQL/XML (wg SQL:2005)
– XMLQuery
» zwraca w wyniku fragment dokumentu (o typie XMLType)
– XMLTable
» elementy wynikowej sekwencji umieszcza w wierszach wirtualnej tabeli,
która moŜe być wykorzystana w klauzuli FROM zapytań SQL
Dodatkowe funkcje rozszerzające XPath
Nowe polecenie SQL*Plus: xquery
Przykłady zapytań XQuery, umieszczone w niniejszej prezentacji,
zostały sprawdzone przy uŜyciu tej właśnie implementacji XQuery
•
Nowe polecenie xquery umoŜliwia interaktywne wykonywanie zapytań XQuery
SQL*Plus: Release 10.2.0.1.0 – Production
Połączono z:
Personal Oracle Database 10g Release 10.2.0.1.0 - Production
SQL> xquery doc("/public/publikacje.xml")//publikacja[@id="354"]//autor
2 /
Result Sequence
-----------------------------------------------------------------------------------<autor afiliacja="WEiTI"><nazwisko>Traczyk</nazwisko><imiona>Tomasz</imiona></autor>
•
Dodano kilka nowych komend set, sterujących działaniem polecenia xquery
Oracle JDeveloper 10g release 3
•
•
Wsparcie dla składni XQuery (w tym wbudowany schemat)
Wykonywanie zapytań XQuery wprost z IDE
Oracle Application Server 10g release 3
•
Technologia XQS (XML Query Service, dawniej XDS) w AS10g r. 3
T. Traczyk
XQuery – konkurencja dla SQL?
43
T. Traczyk
XQuery – konkurencja dla SQL?
44
XQuery w SQL/XML
XQuery w SQL/XML, c.d.
Funkcja xmlquery()
xmlquery()
•
•
•
•
Funkcja xmltable()
xmltable()
Przyjmuje tekstowo zapytanie XQuery
Zwraca wynikowy XML w postaci XMLType
– klauzula returning content jest obowiązkowa
– w Oracle10g nie ma opcji returning sequence
W celu otrzymania wyniku tekstowego naleŜy uŜyć metody getclobval() lub getstringval()
Dodatkowo moŜna uŜyć metody extract() by sformatować wynik
•
•
•
•
select x.column_value.getclobval()
from xmltable('
xmltable(
for $p in doc("/public/publikacje.xml")//publikacja
return
<publikacja>
{$p/tytul}
<autor1>
{$p//autor[1]/nazwisko/text(), " ",
$p//autor[1]/imiona/text()}
</autor1>
</publikacja>
')
) x;
select xmlquery('doc("/public/publikacje.xml")//publikacja'
xmlquery(
returning content).extract('.').getclobval()
content)
as xml
from dual;
•
Przyjmuje tekstowo zapytanie XQuery
Do deklarowania przestrzeni nazw w słuŜy specjalne wyraŜenie
xmltable( xmlnamespaces('urn://ploug.org'
as "p")
"),
xmlnamespaces(
") ...)
Kolejne elementy wynikowej sekwencji umieszcza w wierszach wirtualnej tabeli
Tej wirtualnej tabeli moŜna uŜyć w klauzuli from zapytania SQL
W ten sposób moŜna uŜyć dowolnej konsoli SQL jako konsoli XQuery
<publikacja>
<tytul>Język XML w aplikacjach z bazami danych</tytul>
<autor1>Traczyk Tomasz</autor1>
</publikacja>
<publikacja>
<tytul>Język XML w aplikacjach z bazami danych – po roku</tytul>
<autor1>Traczyk Tomasz</autor1>
</publikacja>
...
T. Traczyk
XQuery – konkurencja dla SQL?
45
XQuery w SQL/XML, c.d.
46
Źródła danych dla XQuery w Oracle 10g
10g r. 2
Funkcja xmltable()
xmltable(),
() c.d.
Repozytorium XML DB
•
Wynik zapytania moŜe być interpretowany jako zbiór kolumn
•
– sterowanie klauzulami columns i path
– jeśli źródło jest w postaci „kanonicznej”, klauzulę path moŜna pominąć
Nadaje się więc do transformacji XML w dane relacyjne
• doc(URI) – udostępnia dokument przez URI dokumentu w repozytorium XDB
• collection(URI) – udostępnia kolekcję przez URI folderu w repozytorium XDB
select x.*
from xmltable('
xmltable(
for $p in doc("/public/publikacje.xml")//publikacja
return
<publikacja>
{$p/tytul}
<autor1>
{($p//autor[1]/nazwisko/text(), " ",
$p//autor[1]/imiona/text())}
</autor1>
</publikacja>'
columns tytul VARCHAR2(100) path '//tytul' ,
autor1 VARCHAR2(50) path '//autor1'
) x;
TYTUL
AUTOR1
Język XML w aplikacjach z bazami danych
Traczyk Tomasz
Język XML w aplikacjach z bazami danych – po roku
Traczyk Tomasz
...
...
T. Traczyk
XQuery – konkurencja dla SQL?
T. Traczyk
XQuery – konkurencja dla SQL?
Przykład: wypisanie nazwy elementu głównego
doc("/public/publikacje.xml")
)/name(./*)
doc(
zwraca:
publikacje
collection("/public")
)/name(./*)
collection(
zwraca:
instytucje publikacje
47
T. Traczyk
XQuery – konkurencja dla SQL?
48
Źródła danych dla XQuery w Oracle 10g
10g r. 2, c.d.
Źródła danych dla XQuery w Oracle 10g
10g r. 2, c.d.
Obiekty XMLType
Tabela/perspektywa
•
•
Funkcja ora:view rozszerzająca XPath
– udostępnia dane z tabeli lub perspektywy w postaci „kanonicznej” XML
» sekwencja elementów <ROW>, zawierających elementy nazwane tak jak kolumny
» nazwy wielkimi literami
– dla danych relacyjno-obiektowych tworzy odpowiednie struktury zagnieŜdŜone
Przykłady:
Tabela:
Zapytanie:
•
Przykłady:
Tabela r-o: CREATE TABLE instytucje_xml (kod VARCHAR2(12), opis XMLType)
XMLType
CREATE TABLE instytucje (kod VARCHAR2(12), nazwa VARCHAR2(100));
select xmlquery('$i
xmlquery $i/instytucja'
$i
passing opis as "i"
returning content)
from instytucje_xml;
ora:view("instytucje")/.
ora:view
<ROW>
<KOD>WEiTI</KOD>
<NAZWA>Wydział Elektroniki i Technik Informacyjnych</NAZWA>
</ROW>
<ROW>
<KOD>IAiIS</KOD>
<NAZWA>Instytut Automatyki i Informatyki Stosowanej</NAZWA>
</ROW>
Zapytanie:
Pochodzące np. z
– wierszy tabel obiektów, kolumn tabel relacyjnych,
– perspektyw XML-owych
Dostęp za pomocą klauzuli passing as funkcji xmlquery lub xmltable
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
<instytucja kod="IAiIS">Instytut Automatyki i Informatyki Stosowanej</instytucja>
ora:view("instytucje")//NAZWA
ora:view
<NAZWA>Wydział Elektroniki i Technik Informacyjnych</NAZWA>
<NAZWA>Instytut Automatyki i Informatyki Stosowanej</NAZWA>
Tabela r-o:
CREATE TABLE instytucje_xml (kod VARCHAR2(12), opis XMLType)
XMLType
Zapytanie :
ora:view("instytucje_xml")/.
ora:view
select ro.kod, xml.column_value.getclobval()
from instytucje_xml ro,
xmltable('$i
passing opis as "i")
xmltable $i/instytucja'
$i
"i" xml;
<ROW>
<KOD>WEiTI</KOD>
<OPIS>
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
</OPIS>
</ROW>
XQuery – konkurencja dla SQL?
T. Traczyk
49
WEiTI
<instytucja kod="WEiTI">Wydział Elektroniki i Technik Informacyjnych</instytucja>
IAiIS
<instytucja kod="IAiIS">Instytut Automatyki i Informatyki Stosowanej</instytucja>
Źródła danych dla XQuery w Oracle 10g
10g r. 2, c.d.
•
•
•
Dostęp do danych
•
Dokumenty zewnętrzne XML dostępne przez protokół http mogą być wykorzystane
w zapytaniach XQuery
Wykorzystuje się funkcję httpuritype()
UmoŜliwia to integrację danych zewnętrznych w zapytaniach w DBMS
Wydajność jest ograniczona
– konieczność parsowania XML
XQuery – konkurencja dla SQL?
Funkcja ora:view()
WyraŜenia regularne
•
•
Funkcje ora:matches() i ora:replace()
WyraŜenia regularne w Oracle10g nie są zgodne ze standardem XPath
Wyszukiwanie pełnotekstowe
•
•
select xmlquery('$i
xmlquery $i/.‘
$i
passing
xmlparse(
xmlparse(
document httpuritype('http://.../instytucje.xml').getclob()
httpuritype(
).getclob()
) as "i"
returning content)
from dual;
T. Traczyk
50
Oracle 10g
10g r. 2 – funkcje rozszerzające XPath
Dokumenty zewnętrzne
•
XQuery – konkurencja dla SQL?
T. Traczyk
Funkcja ora:contains pozwala wyszukiwać z uŜyciem mechanizmów pełnotekstowych
UŜywana zwykle w klauzuli where wyraŜenia FLWOR
Obliczenia
•
51
Funkcja ora:sqrt wylicza pierwiastek kwadratowy
T. Traczyk
XQuery – konkurencja dla SQL?
52
Oracle10g
Oracle10g r. 2 – wydajność zapytań XQuery
Optymalizacja zapytań XQuery
•
•
•
Zapytanie XQuery jest optymalizowane
– łącznie z otaczającym SQL
– w podobny sposób
Optymalizacja XQuery
– zapytanie XQuery jest zamieniane na bloki podzapytań SQL
ze specjalnymi operatorami działającymi na sekwencjach
– te bloki są optymalizowane w kontekście całego zapytania SQL
– eliminuje się zbędne pośrednie materializacje wyników
– nieliczne konstrukcje XQuery, które nie dają się zamienić na podzapytania SQL,
są interpretowane przez wbudowany interpreter
Optymalizacja XPath
– mechanizm XPath rewrite
» zamienia zapytania ścieŜkowe XPath na zapytania relacyjne, jeśli moŜna
» umoŜliwia wykorzystanie indeksów
Oracle XML Query Service
Przykład:
Indeks: CREATE UNIQUE INDEX
instytucje_idx
ON instytucje(kod);
T. Traczyk
XQuery – konkurencja dla SQL?
53
T. Traczyk
Oracle XQS
•
MoŜliwe źródła danych
•
•
Narzędzie do integracji danych
– działające w warstwie middle-tier
– napisane w Jawie (aplikacja serwera OC4J)
– uŜywające XML jako wspólnego formatu danych
– uŜywające języka XQuery do definiowania sposobu integracji
•
•
•
Dostępność
– składnik AS10g r. 3
Dostęp do źródeł w XQuery
Dokumenty XML
Dokumenty nie-XML
– transformowane na bieŜąco
– opis transformacji w D3L
Dane z baz relacyjnych
– przez JDBC
Dane uzyskiwane z Web Services przez SOAP
XML zwracany przez klasę Java lub EJB
– dostępne przez WSIF Provider
(Web Services Invocation Framework)
•
•
XQuery – konkurencja dla SQL?
55
XQS moŜe buforować dane źródłowe
– polepszenie wydajności
– parametry buforowania ustawiane
w pliku konfiguracyjnym
T. Traczyk
Przez funkcje zastępujące standardową doc()
– definiowane deklaratywnie
(pliki konfiguracyjne XQS)
D3L (Data Definition Description Lang.)
•
•
Buforowanie danych
T. Traczyk
54
Źródła danych dla XQS
XML Query Service (dawniej XML Data Synthesis)
•
XQuery – konkurencja dla SQL?
•
Część technologii Oracle Application Server
Integration InterConnect
Język opisu formatów nie-XML-owych
– dialekt XML
– określa
» format źródła
» sposób jego udostępnienia w XML
Motor D3L wbudowano w XQS
– definicja źródła danych moŜe odwoływać
się do URL opisu w D3L
– XQS wykonuje translację on-line
i udostępnia do integracji dane w XML
XQuery – konkurencja dla SQL?
56
Wyniki XQS
Dostęp do wyników integracji
•
•
•
Przykład – zadanie
•
Biblioteka znaczników JSP
•
Zapytania XQuery
– zapamiętane w plikach .xq
API klienta dla języka Java
Komponenty sesyjne EJB
•
» mogą być sparametryzowane za
•
pomocą zmiennych zewnętrznych
(declare variable ... external )
– bezstanowy
– zachowujący stan
•
w wielu krokach
•
– zdefiniowane w pliku konfiguracyjnym
» umoŜliwia pobieranie wyniku
•
Dane wejściowe
Widoki XQuery
UŜycie:
Widoki XQuery udostępnione
– jako źródła danych w innych zapytaniach
jako Web Services
– jako usługi sieciowe
Opis zadania
•
•
XQuery – konkurencja dla SQL?
Zestawić repety za ostatni semestr z podaniem terminu opłaty i kwoty opłaty w złotych
Rozwiązanie
•
T. Traczyk
Spis repet studentów w poszczególnych semestrach
– perspektywa w bazie danych Oracle
Cennik opłat za powtarzanie przedmiotów, ceny w euro
– plik Excela w formacie CSV
Lista terminów wnoszenia opłat
– plik XML
Kursy walut
– usługa sieciowa
57
Cztery źródła danych
– SQL
– dokument tekstowy z konwersją przez D3L
– dokument XML
– Web Service
Integracja w XQS przez zapytanie XQuery
T. Traczyk
Źródło danych: dokument XML
Konfiguracja w pliku xqs-config.xml
<document-source isCached="false">
<function-name namespace="http://xmlns.oracle.com/ias/xqs">
ceny_dokumentCSV
</function-name>
<documentURL>http://.../ceny.csv</documentURL >
<XMLTranslate method="D3L">
<schema-file>http://.../ceny_CSV2XML.xml</schema-file>
</XMLTranslate>
</document-source>
<xqs-sources>
<document
documentdocument-source isCached="false">
<function-name namespace="http://xmlns.oracle.com/ias/xqs">
terminy_dokumentXML
</function-name>
<documentURL>http://.../terminy.xml</documentURL>
</document
documentdocument-source>
source
...
</xqs-sources>
Konfiguracja D3L
<?xml version="1.0"?>
<!DOCTYPE message SYSTEM "d3l.dtd">
<message name="excelData" type="ceny_repet">
<imparray id="wiersz">
<struct>
<field name="typ_zaliczenia"><termstring endchar=","/></field>
<field name="nazwa_typu"><termstring endchar=","/></field>
<field name="cena_w_euro"><number><termstring endchar="\n"/></number></field>
</struct>
<ceny_repet>
</imparray>
<repeta>
<struct id="ceny_repet">
<typ_zaliczenia>E</typ_zaliczenia>
<field name="repeta">
<nazwa_typu>Egzamin</nazwa_typu>
<typeref type="wiersz"/>
<cena_w_euro>150</cena_w_euro>
</field>
</repeta>
</struct>
...
</message>
</ceny_repet>
<terminy_platnosci>
<termin typ_zaliczenia="E">2005-10-20</termin>
<termin typ_zaliczenia="Z">2005-10-20</termin>
<termin typ_zaliczenia="P">2005-09-25</termin>
<termin typ_zaliczenia="L">2005-09-25</termin>
</terminy_platnosci>
XQuery – konkurencja dla SQL?
58
Źródło danych: dokument CSV
Konfiguracja w pliku xqs-config.xml
T. Traczyk
XQuery – konkurencja dla SQL?
59
T. Traczyk
XQuery – konkurencja dla SQL?
60
Źródło danych: zapytanie SQL
Źródło danych: usługa sieciowa (Web
(Web Service)
Service)
Konfiguracja w pliku xqs-config.xml
Konfiguracja w pliku xqs-config.xml
<wsdl-source isCached="false">
<function-name prefix="xqs">repety_zrodloSQL</function-name>
<wsdlURL>http://.../repety_SQL.wsdl</wsdlURL>
<operation>pobierzDaneSQL</operation>
<port>portSQL</port>
<input-parameters>
<part position="1" name="semestr">
<schema-type prefix="xs">string</schema-type>
</part>
</input-parameters>
</wsdl-source>
<wsdl-source isCached="true">
<function-name prefix="xqs">kursyWalut_WebService</function-name>
<wsdlURL>http://.../CurrencyExchangeService.wsdl</wsdlURL>
<operation>getRate</operation>
<service>CurrencyExchangeService</service>
<port>CurrencyExchangePort</port>
<input-parameters>
<part position="1" name="country1"">
<schema-type prefix="xs">string</schema-type>
</part>
<part position="2" name="country2"/>
<schema-type prefix="xs">string</schema-type>
</part>
</input-parameters>
</wsdl-source>
Konfiguracja „usługi” w pliku WSDL (fragment)
<binding name="wiazanieSQL" type="oe:zrodloSQL_typ">
<sql:binding/>
<ROW num="1">
<operation name="pobierzDaneSQL">
<ID_STUDENTA>120032</ID_STUDENTA>
<sql:operation XMLtransform="XSU-client">
<NAZWISKO>Abacki</NAZWISKO>
select * from repety where semestr = :1
</sql:operation>
<IMIONA>Aleksander</IMIONA>
<input name="SqlInput">
<KOD_PRZEDMIOTU>BD1</KOD_PRZEDMIOTU>
<sql:input>semestr</sql:input>
</input>
<SEMESTR>05L</SEMESTR>
<output name="SqlResult"/>
<TYP_ZALICZENIA>L</TYP_ZALICZENIA>
<fault name="SqlFault"/>
</operation>
</ROW>
</binding>
...
<service name="repety_SQL">
<port name="portSQL" binding="oe:wiazanieSQL">
<sql:address data-source-location="jdbc/OracleCoreDS" user="..." password="..." />
</port>
</service>
T. Traczyk
XQuery – konkurencja dla SQL?
•
61
Konfiguracja odwołuje się do „obcego” dokumentu WSDL, opisującego usługę
T. Traczyk
XQuery – konkurencja dla SQL?
62
Zapytanie XQuery
declare
declare
declare
declare
declare
namespace xqs = "http://xmlns.oracle.com/ias/xqs";
function xqs:repety_zrodloSQL ($id_semestru as xs:string) external;
function xqs:ceny_dokumentCSV() external;
function xqs:kursyWalut_WebService($j1 as xs:string, $j2 as xs:string) external;
function xqs:terminy_dokumentXML() external;
let $t := xqs:terminy_dokumentXML(),
$c := xqs:ceny_dokumentCSV(),
$k := xqs:kursyWalut_WebService("euro", "poland")
return
<oplaty>
{
for $r in xqs:repety_zrodloSQL('05L')//ROW
let $ce := $c//repeta[typ_zaliczenia=$r//TYP_ZALICZENIA]/cena_w_euro/text(),
$cz := $ce * $k,
$te := $t//termin[@typ_zaliczenia=$r//TYP_ZALICZENIA]/text()
order by $r//KOD_PRZEDMIOTU, $r//TYP_ZALICZENIA, $r//NAZWISKO, $r//IMIONA
return
<oplaty>
<repeta>
<repeta>
<oplata>
<oplata>
{$r//KOD_PRZEDMIOTU}
<KOD_PRZEDMIOTU>BD1</KOD_PRZEDMIOTU>
{$r//TYP_ZALICZENIA}
<TYP_ZALICZENIA>E</TYP_ZALICZENIA>
<kwota waluta="EUR">{$ce}</kwota>
<kwota waluta="EUR">150</kwota>
<kwota waluta="PLN">{$cz}</kwota>
<kwota waluta="PLN">588,450014591217</kwota>
<termin_wplaty>{$te}</termin_wplaty>
<termin_wplaty>2005-10-20</termin_wplaty>
</oplata>
</oplata>
<student>
<student>
{$r//NAZWISKO}
<NAZWISKO>Cabacki</NAZWISKO>
{$r//IMIONA}
<IMIONA>Cezary</IMIONA>
</student>
</student>
</repeta>
}
</repeta>
</oplaty>
...
Podsumowanie
</oplaty>
T. Traczyk
XQuery – konkurencja dla SQL?
63
T. Traczyk
XQuery – konkurencja dla SQL?
64
XQuery a SQL
Podsumowanie
Przewagi XQuery
•
•
•
•
Standard XQuery
•
•
Bogatsza postać przetwarzanej informacji
Dostosowanie do przetwarzania informacji semistrukturalnej
Bardziej konsekwentna składnia języka
Bardzo dobre dopasowanie do potrzeb środowiska WWW, w tym Web Services
Braki XQuery
•
•
Przewagi SQL
•
•
•
•
•
•
•
•
Raczej uzupełnieniem w zastosowaniach związanych z XML, WWW, integracją danych itp.
Alternatywą dla SQL/XML
A konkurencją – jeszcze nie dziś...
T. Traczyk
XQuery – konkurencja dla SQL?
65
XQuery – konkurencja dla SQL?
T. Traczyk
XQuery – konkurencja dla SQL?
Brak DML – nie ma instrukcji DML ani zarządzania transakcjami
Brak mechanizmu refleksji (np. funkcji typu eval())
Praktyczne znaczenie języka XQuery
Prostota przetwarzanej informacji
Dostosowanie do licznych narzędzi i interfejsów
Wielka rzesza specjalistów
Efektywne metody optymalizacji i szeroko znane sposoby strojenia
DML i DDL
XQuery konkurencją dla SQL?
•
•
•
Wspierany przez wielkich producentów oprogramowania
Bliski ukończenia
67
Szybko rośnie
Czynniki wzrostu znaczenia XQuery
– pojawienie się implementacji
» zintegrowanych z DBMS – spełnione
» zintegrowanych z wyszukiwarkami internetowymi – jeszcze brak
Spodziewana rola XQuery
– wygodny środek do jednolitego wyszukiwania informacji w Internecie,
bazach danych i innych zasobach informacji
– narzędzie do scalania i przekształcania informacji
– język zapytań uzupełniający moŜliwości SQL
T. Traczyk
XQuery – konkurencja dla SQL?
66