Laboratorium 3

Transkrypt

Laboratorium 3
Laboratorium 3
Perspektyw, indeksy i synonimy, słownik danych użytkownika
Pracujemy na własnych kontach bazując na danych przygotowanych na laboratorium 2.
Będziemy używać funkcji LISTAGG agregującej wartości z wybranych kolumn wszystkich
zwracanych rekordów. Agregacja może się odbywać na wszystkich zwracanych wierszach albo na tych
należących do grup – jeśli zapytanie zawiera klauzulę GROUP BY. Przykłady:
-- lista nazwisk wszystkich dzieci posortowana rosnąco, w jednym wierszy w jednej kolumnie
-- separatorem jest średnik
SELECT LISTAGG(nazwisko,'; ') WITHIN GROUP (ORDER BY nazwisko) FROM DZIECI;
-- lista imion wszystkich dzieci urodzonych w tym samym roku, imiona w porządku alfabetycznym
-- malejącym, tym razem separatorem jest przecinek
SELECT LISTAGG(imie,', ') WITHIN GROUP(ORDER BY imie DESC) as Imiona
FROM DZIECI GROUP BY TO_CHAR(DATA_UR, 'YYYY');
Zadanie 1
Stworzyć perspektywę DZIECI_POSILKI, która wyświetla imię, nazwisko, wiek dziecka oraz rodzaj
posiłków, na które dziecko jest zapisane. Rodzaje posiłku mają być nazwą, nie ID_POSILKU
(wystarczy złączenie). Wyniki wyświetlane przez perspektywę powinny być posortowane po rodzaju
posiłku.
Zadanie 2
Proszę spróbować zmienić za pośrednictwem perspektywy DZIECI_POSILKI rodzaj posiłków z 'obiad'
na 'tylko drugie danie'. Czy można wykonać taką zamianę danych? Dlaczego?
Zadanie 3
Proszę spróbować zmienić za pośrednictwem perspektywy DZIECI_POSILKI nazwisko jednego
dziecka w warunku podając jego nazwisko, imię albo obie te dane jeśli będą potrzebne dla
jednoznacznego określenia dziecka. Czy można wykonać taką zamianę danych? Dlaczego?
Zadanie 4
Proszę wyświetlić treść zapytania, na podstawie którego stworzono widok DZIECI_POSILKI
(końcówka 2 wykładu).
Zadanie 5
Jakie są obecnie indeksy są utworzone w waszym schemacie? Jak sprawdzić ich listę? Które z nich są
kluczami głównymi? (końcówka 2 wykładu)
Zadanie 6
Utworzyć indeks unikalny na kolumnie NAZWISKO tabeli DZIECI. Czy przy powtarzających się
nazwiskach można utworzyć taki indeks? Gdyby się jednak utworzył, to do zrobienia następnego
zadania będzie trzeba go usunąć.
Zadanie 7
Utworzyć złożony indeks nieunikalny na kolumnach IMIE, NAZWISKO tabeli DZIECI.
Sprawdzić utworzenie indeksu w odpowiednich perspektywach prezentujących metadane.
Zadanie 8
Utworzyć synonim GD dla tabeli GODZINY_DODATKOWE. Utworzyć synonim MOJE_INDEKSY
do widoku USER_INDEXES. Przetestować działanie obu synonimów.
Zadanie 9
Można utworzyć synonim do tabeli (bądź dowolnego obiektu) innego użytkownika. Jeśli ma się
uprawnienia do odczytu np. tabeli w schemacie innego użytkownika to taki takiego synonimu można
będzie używać.
Utworzyć synonim RYBA dla tabeli RYBA użytkownika BD15_GR1. Sprawdzić jego działanie.
Zmienić nazwę tego synonimu na dowolną inną.
Usunąć synonim GD utworzony w poprzednim zadaniu.
Zadanie 10
Korzystając z funkcji LISTAGG stworzyć perspektywę DZIECI_ZAJECIA_CENY zawierającą cztery
kolumny:
ID_DZIECKA
LICZBA_ZAJEC
-- zawierającą liczbę zajęć dodatkowych każdego dziecka
RODZAJ_ZAJEC
-- zawiera listę zajęć dodatkowych każdego dziecka (funkcja LISTAGG)
CENA_ZAJEC_DOD -- suma opłaty miesięcznej za każde dziecko za uczęszczanie na zajęcia dod.
Korzystamy tutaj z dwóch tabel: DZIECI_ZAJECIA oraz ZAJECIA_DODATKOWE. Grupowanie jest
po ID_DZIECKA. Za pomocą tej perspektywy nie może się dać zmienić danych tabel bazowych.
Na początek warto sobie otrzymać takie dane (tylko na tabeli DZIECI_ZAJECIA):
ID_DZIECKA LISTA_ID_ZAJECIA
1
1;7
2
2;3
3
4
4
5;6
5
2
7
1;3;7
Korzystamy z funkcji LISTAGG, separatorem jest tutaj średnik.
Zadanie 11
Korzystając z wyników zadania poprzedniego jako widoku albo w formie podzapytania utworzyć
perspektywę DZIECI_WSZYSTKO zawierającą wszystkie informacje o każdym dziecku, łącznie z
sumą opłat (nie uwzględniając jeszcze godzin dodatkowych, które dziecko spędziło w przedszkolu).
Perspektywa ma zawierać następujące kolumny:
ID_DZIECKA
IMIE
NAZWISKO
DATA_UR
POSILKI
-- zawartość taka jak w tabeli dzieci, numer wskazujący na posiłek
CENA_POSILKI
-- zawartość kolumny CENA tabeli POSILKI
RODZAJ_POSILKI
-- nazwa posiłku, na jakie jest wpisane każde dziecko
LICZBA_ZAJEC
-- zawierającą liczbę zajęć dodatkowych każdego dziecka
RODZAJ_ZAJEC
-- zawiera listę zajęć dodatkowych każdego dziecka (funkcja LISTAGG)
CENA_ZAJEC_DOD
-- suma opłaty miesięcznej za każde dziecko za uczęszczanie na zajęcia dod.
KOMITET_RODZICIELSKI
CENA_SUMARYCZNA -- suma wszystkich opłat za każde dziecko (nie licząc godzin dodatkowych)
Widok DZIECI_WSZYSTKO też powinien być tylko do odczytu.
Zadanie 12 (dla chętnych)
Zmodyfikować treść zapytania do zadania 10 albo 11 (łatwiej w zadaniu 11 bo tam jest już złączenie z
trzech tabel) aby trochę poprawić jakoś wyświetlanych wyników.
W przypadku kiedy dziecko nie jest zapisane na żadne zajęcia dodatkowe kolumna LICZBA_ZAJEC ma
mieć wartość zero, a kolumna RODZAJ_ZAJEC ma mieć wartość '--- brak ---'. Będzie to wymagało
złączenia zewnętrznego trzech tabel. Da się zrobić.

Podobne dokumenty