oracle - Aragorn

Transkrypt

oracle - Aragorn
ORACLE
ZJAZD 3
Bloki PL/SQL, kursory
Zad. 1
Stworzyć tabele: Ksiazka1 (będącą kopią tabeli Ksiazka) oraz Wiad składającą się z dwóch kolumn (jednej
numerycznej, drugiej tekstowej). Tabela Ksiazka1 powinna zawierać wszystkie wiersze tabeli Ksiazka.
Zad. 2
Stworzyć blok PL/SQL, w którym wybrane by zostały tytuły dwóch najdroższych książek. Przykład:
"Potop"
100
"Zemsta"
90
"Zbrodnia i kara"
100
"Lesio"
50
Wynikiem są tytuły: "Potop", "Zemsta", "Zbrodnia i kara", ponieważ 100 i 90 są dwiema najwyższymi cenami.
Tytuł książki wraz z ceną powinny się znaleźć w tabeli Wiad.
Zad. 3 (NA KOPII TABELI Ksiazka)
Stworzyć blok PL/SQL zwiększający cenę książki o 5% zaczynając od książek najtańszych i zgodnie z
kolejnością alfabetyczna tytułów. Przykład:
id_ksiazki
tytul cena
1
A
10
2
B
28
3
C
10
4
D
30
Kolejność sprawdzania cen (id_ksiazki): 1, 3, 2, 4
Jeśli suma cen wszystkich książek (po podwyżce i przed podwyżką) przekroczy podaną przez użytkownika
granicę, to cena żadnej innej książki nie powinna ulec zmianie.
Zad. 4
Stworzyć blok PL/SQL, który sprawdzi tytuły książek najczęściej i najrzadziej zamawianych. Informacje o
tytułach i ilościach zamówień powinny znaleźć się w tabeli Wiad. (Zadanie powinno zostać rozwiązane przy
użyciu kursorów jawnych).
Zad. 5
Stworzyć blok PL/SQL, który wypisze informacje dotyczące danej książki w zależności od ilości rozdziałów w
tej książce:
a) ilość rozdziałów mniejsza od średniej ilości rozdziałów (całkowitej części średniej),
b) ilość rozdziałów równa średniej ilości rozdziałów (całkowitej części średniej),
c) ilość rozdziałów większa od średniej ilości rozdziałów (całkowitej części średniej).
Zad. 6
Stworzyć tabelę Wiad2 z pięcioma kolumnami numerycznymi, przy czym pierwsza kolumna stanowi klucz
główny. Wstawić do niej wiersze postaci:
nr_przedziału_cenowego
cena_od
cena_do
ilosc_stron_od
ilosc_stron_do
Użytkownik podaje na ile przedziałów cenowych (książek) mamy rozbić. Należy wyznaczyć: dla atrybutu cena
równe przedziały, wartości dla kolumn odpowiadających ilościom stron i wstawić wyznaczone wartości do
tabeli Wiad2.
POMOC
1. Tworzenie tabel
CREATE TABLE N_TABELI AS WYR_SELECT;
2. Wstawianie wierszy
INSERT INTO N_TABELI (LISTA KOLUMN) (WYR_SELECT);
3. Bloki PL/SQL anonimowe
[
DECLARE
n_zmiennej typ_danych;.......
]
BEGIN
END;
instrukcje;
[ EXCEPTION
obsluga wyjatkow ]
Aby wykonać instrukcje zawarte w bloku należy wcisnąć znak '/' i ENTER
n_zmiennej n_tabeli.n_kolumny%type;
n_zmiennej n_tabeli%rowtype;
4. Instrukcja SELECT INTO
SELECT n_kolumn
INTO n_zmiennych
FROM n_tabeli..........
Wyrażenie SELECT INTO zwraca jeden wiersz!
Lista zmiennych: zmienne po przecinkach
SELECT INTO pobiera wartości i wstawia pod zmienne.
5. Kursor
Skupia wiele wierszy wybranych na podstawie jakiegoś WYR_SELECT (zapytania), różny od polecenia SELECT
INTO ze względu właśnie na tę ilość wierszy: różną od 1.
a) jawny
Deklaracja
CURSOR n_kursora (parametry) IS WYR_SELECT; (w sekcji deklaracyjnej bloku)
Otwieranie kursora
OPEN n_kursora(parametry);
Pobieranie danych z kursora
FETCH n_kursora INTO zmienna (zmienne);
Zamykanie kursora
CLOSE n_kursora;
Pętla kursorowa
FOR i IN n_kursora LOOP
.....
END LOOP;
- w tym przypadku nie trzeba poleceń OPEN, FETCH, CLOSE; FOR otwiera i później zamyka kursor; FETCH
niepotrzebne, bo pod zmienną i automatycznie podstawiane są wyniki zapytania.
b) niejawny
FOR i IN (WYR_SELECT) LOOP
instrukcje;
END LOOP;
Pobranie wartości: i.(nazwa kolumny wybranej w WYR_SELECT)
Zmiennej i nie trzeba deklarować.
6. Wypisywanie komunikatów
dbms_output.put_line ('komunikat');
np.dbms_output.put_line ('Ksiazka '||i.tytul||' kosztuje '||i.cena);
Aby było to możliwe należy wykonać następujące polecenie:
set serveroutput on;
7. Instrukcje warunkowe
IF warunek THEN
instr
ELSIF warunek THEN
instr
....
ELSE
instr
END IF;
8. Pętle
LOOP
instr
END LOOP;
WHILE war LOOP
instr
END LOOP;
FOR i IN [REVERSE] min..max LOOP
instr
END LOOP;
EXIT- bezwarunkowe wyjście z pętli
EXIT WHEN- warunkowe
9. Pobranie wartości od użytkownika
&parametr: użytkownik poproszony zostanie o podanie wartości dla parametr
&&parametr: j.w., ale podana wartość zostanie zapamiętana (parametr będzie miał określoną wartość do
momentu rozłączenia)