Bazy Danych 2007/2008 by Dzik.

Wielkość: px
Rozpocząć pokaz od strony:

Download "Bazy Danych 2007/2008 by Dzik."

Transkrypt

1 Ćwiczenia 1 powtórzenie z SQL Bazy Danych 2007/2008 by Dzik. 1. Wyswietlic nazwy i liczbe zatrudnionych z tych wydzialow o najwiekszej liczba aktualnie zatrudnionych osob WITH pomoc AS (SELECT w.nazwa, COUNT(z.id_wydz) liczba_os WHERE o.id = z.id_os AND w.id = z.id_wydz AND z.do IS NULL GROUP BY w.nazwa) SELECT * FROM pomoc WHERE liczba_os = (SELECT MAX(liczba_os) FROM pomoc); 2. Wyswietlic te osoby aktualnie zatrudnione, ktore aktualnie pobieraja maksymalna pensje SELECT o.*, p.pensja FROM osoby o, zatrudnienia z, pensje p WHERE o.id = z.id_os AND o.id = p.id_os AND z.do IS NULL AND p.do IS NULL AND p.pensja = (SELECT MAX(pp.pensja) FROM osoby oo, pensje pp, zatrudnienia zz WHERE oo.id = zz.id_os AND oo.id = pp.id_os AND zz.do IS NULL); 3. Wyswietlic na kazdym z wydzialow osoby aktualnie zatrudnione pobierajace aktualnie maksymalna pensje SELECT w.nazwa, o.*, p.pensja FROM osoby o, wydzialy w, pensje p, zatrudnienia z WHERE o.id = z.id_os AND o.id = p.id_os AND z.do IS NULL AND p.do IS NULL AND w.id = z.id_wydz AND p.pensja = (SELECT MAX(pp.pensja) FROM osoby oo, wydzialy ww, pensje pp, zatrudnienia zz WHERE oo.id = zz.id_os AND oo.id = pp.id_os AND zz.do IS NULL AND pp.do IS NULL AND ww.id = zz.id_wydz AND w.nazwa = ww.nazwa);

2 Ćwiczenia 2 bloki anonimowe i kursory niejawne (SELECT INTO) 1. Napisac kod bloku anonimowego w języku PL/SQL za pomoca ktorego z tabeli Osoby bedzie mozna wybrac osobe o okreslonym Nazwisku i Imieniu (Lis, Jan) ktore zostana zadeklarowane poprzez odpowiednie zainicjowanie w sekcji deklaracji programu dwoch zmiennych tekstowych o wartosciach Lis i Jan. Komunikat: Osoba wybrana jest osoba Lis Jan! z_imie osoby.imie1%type; z_nazwisko osoby.nazwisko%type; SELECT o.nazwisko, o.imie1 INTO z_nazwisko, z_imie FROM osoby o WHERE INITCAP(o.nazwisko) = 'Lis' AND INITCAP(o.imie1) = 'Jan'; -- INITCAP ustawia pierwsza litere stringa na wielką, a resztę na małe DBMS_OUTPUT.PUT_LINE('Wybrana osoba to ' z_nazwisko ' ' z_imie); 2. Jak w zadaniu 1, z tymze nalezy znalezc osobe poprzez zadeklarowanie jednej zmiennej PL/SQL-owej o wartosci Lis Jan. z_imienazwisko VARCHAR2(30); SELECT INITCAP(o.imie1) ' ' INITCAP(o.nazwisko) INTO z_imienazwisko FROM osoby o WHERE INITCAP(o.imie1) = 'Jan'AND INITCAP(o.nazwisko) = 'Lis'; DBMS_OUTPUT.PUT_LINE('Wybrana osoba jest ' z_imienazwisko);

3 3. Za pomoca anonimowego bloku PL/SQL-owego wyswietlic na danym wydziale ktorego nazwa jest zainicjowana zmienna PL/SQL-owa o wartosci Matematyka. Dane tej osoby, aktualnie na niej zatrudnionej, ktorej suma dlugosci nazwiska i imienia jest najwieksza. Komunikat: osoba aktualnie zatrudniona na wydziale Matematyka o najwiekszej sumie dlugosci imienia i nazwiska jest osoba o id = 8, tj. Duda Barbara, a dl wynosi 11. z_wydzial VARCHAR2(20) := 'Matematyka'; z_imienazwisko VARCHAR2(50); z_dlugosc NUMBER; z_id osoby.id%type; SELECT o.id, o.imie1 ' ' o.nazwisko, LENGTH(o.imie1 ' ' o.nazwisko) INTO z_id, z_imienazwisko, z_dlugosc FROM osoby o, zatrudnienia z, wydzialy w WHERE o.id = z.id_os AND z.do IS NULL AND w.id = z.id_wydz AND INITCAP(w.nazwa) = z_wydzial AND LENGTH(o.imie1 ' ' o.nazwisko) = (SELECT MAX(LENGTH(oo.imie1 ' ' oo.nazwisko)) FROM osoby oo, zatrudnienia zz, wydzialy ww WHERE oo.id = zz.id_os AND zz.do IS NULL AND ww.id = zz.id_wydz AND w.nazwa = ww.nazwa); DBMS_OUTPUT.PUT_LINE('Osoba aktualnie zatrudniona na wydziale ' z_wydzial ' o najwiekszej sumie dlugosci imienia i nazwiska jest osoba o id = ' z_id ', tj. ' z_imienazwisko ', a dlugosc wynosi ' z_dlugosc);

4 4. Za pomoca bloku anonimowego PL/SQL wyswietlic na danym wydziale ktorego nazwa jest zainicjowana zmiennia PLSQL najmlodsza aktualnie zatrudniona kobieta i najmlodszego aktualnie zatrudnionego mezczyzne. z_nazwa VARCHAR2(20) := 'Matematyka'; z_imienazwiskom VARCHAR2(50); z_id osoby.id%type; z_data DATE; SELECT o.id, o.imie1 ' ' o.nazwisko, o.d_ur INTO z_id, z_imienazwisko, z_data WHERE o.plec = 'K' AND o.id = z.id_os AND w.id = z.id_wydz AND z.do IS NULL AND INITCAP(w.nazwa) = z_nazwa AND o.d_ur = (SELECT MAX(oo.d_ur) FROM osoby oo, wydzialy ww, zatrudnienia zz WHERE oo.plec = 'K' AND oo.id = zz.id_os AND ww.id = zz.id_wydz AND zz.do IS NULL AND ww.nazwa = w.nazwa); DBMS_OUTPUT.PUT_LINE('Najmlodsza kobieta zatrudniona na wydziale ' z_nazwa ' jest osoba o id = ' z_id ', ' z_imienazwisko ' urodzona w dniu ' z_data); SELECT o.id, o.imie1 ' ' o.nazwisko, o.d_ur INTO z_id, z_imienazwisko, z_data WHERE o.plec = 'M' AND o.id = z.id_os AND w.id = z.id_wydz AND z.do IS NULL AND INITCAP(w.nazwa) = z_nazwa AND o.d_ur = (SELECT MAX(oo.d_ur) FROM osoby oo, wydzialy ww, zatrudnienia zz WHERE oo.plec = 'M' AND oo.id = zz.id_os AND ww.id = zz.id_wydz AND zz.do IS NULL AND ww.nazwa = w.nazwa); DBMS_OUTPUT.PUT_LINE('Najmlodszym mezczyzna zatrudnionym na wydziale ' z_nazwa ' jest osoba o id = ' z_id ', ' z_imienazwisko ' urodzona w dniu ' z_data);

5 Ćwiczenia 3 rekordy, ROWID 1. a) Zdefiniowac rekord t_rekordosoba przeznaczony do przechowywania wspolnych danych osoby z tabelki osoby, id, nazwisko, imie, data_ur, plec. Pobrac dane przykladowej osoby za pomoca zmiennej rekordowej tego typu i wyswietlic je na ekranie. b) za pomoca typu rekordowego zdefiniowanego deklaracja zakotwiczona -- rekord dla podpunktu a) TYPE t_rekordosoba1 IS RECORD (z_id NUMBER, z_nazwisko VARCHAR2(20), z_imie VARCHAR2(20), z_data DATE, z_plec CHAR(1) ); -- rekord dla podpunktu b) TYPE t_rekordosoba2 IS RECORD (z_id osoby.id%type, z_nazwisko osoby.nazwisko%type, z_imie osoby.imie1%type, z_data osoby.d_ur%type, z_plec osoby.plec%type ); z_osoba1 t_rekordosoba1; z_osoba2 t_rekordosoba2; -- podpunkt a SELECT id, nazwisko, imie1, d_ur, plec INTO z_osoba1 FROM osoby WHERE id = 1; DBMS_OUTPUT.PUT_LINE('Wybrano osobe o danych: id = ' z_osoba1.z_id ', ' z_osoba1.z_nazwisko ' ' z_osoba1.z_imie ', urodzona ' z_osoba1.z_data ' plec: ' z_osoba1.z_plec); -- podpunkt b SELECT id, nazwisko, imie1, d_ur, plec INTO z_osoba2 FROM osoby WHERE id = 1; DBMS_OUTPUT.PUT_LINE('Wybrano osobe o danych: id = ' z_osoba2.z_id ', ' z_osoba2.z_nazwisko ' ' z_osoba2.z_imie ', urodzona ' z_osoba2.z_data ' plec: ' z_osoba2.z_plec);

6 2. Zdefiniowac dwa typy rekordowe t_rekordosoba1, t_rekordosoba2 zawierajace nastepujace pola: z_id, z_nazwisko, z_imie, z_data_ur. Nastepnie zadeklarowac po dwie zmienne rekordowe dla kazdego typu. Niech pola jednej ze zmiennych jednego z typow rekordowych maja przypisane nastepujace wartosci: z_id = 20, z_nazwisko = 'Kowalska', z_imie = 'Maria', z_data_ur = 05/05/90 Wykonac operacje przypisania agregujacego do zmiennej drugiego typu oraz zmiennej tego samego typu. TYPE t_rekordosoba1 IS RECORD ( z_id osoby.id%type, z_nazwisko osoby.nazwisko%type, z_imie osoby.imie1%type, z_d_ur osoby.d_ur%type ); TYPE t_rekordosoba2 IS RECORD ( z_id osoby.id%type, z_nazwisko osoby.nazwisko%type, z_imie osoby.imie1%type, z_d_ur osoby.d_ur%type ); z_rekord1a t_rekordosoba1; z_rekord1b t_rekordosoba1; z_rekord2a t_rekordosoba2; z_rekord2b t_rekordosoba2; -- niestety przypisywanie danych trzeba robic po komorce... z_rekord1a.z_id := 20; z_rekord1a.z_nazwisko := 'Kowalska'; z_rekord1a.z_imie := 'Maria'; z_rekord1a.z_d_ur := TO_DATE('05/05/90','dd/mm/yyyy'); z_rekord1b := z_rekord1a; z_rekord2a.z_imie := z_rekord1a.z_imie; z_rekord2a.z_nazwisko := z_rekord1a.z_nazwisko; z_rekord2a.z_id := z_rekord1a.z_id; z_rekord2a.z_d_ur := z_rekord2a.z_d_ur; --z_rekord2b := z_rekord1a; --to wyzej NIGDY nie podziala

7 3. Wstawic do tabeli osoby nastepujacy rekord danych id = 15, nazwisko = Pawloska, imie Marta, data ur=23/05/82, plec=k. Wstawienie tego wiersza danych do tabeli bazodanowej przeprowadzic za pomoca zmiennej typu rekordowego. TYPE r_osoba IS RECORD (z_id osoby.id%type, z_nazwisko osoby.nazwisko%type, z_imie osoby.imie1%type, z_data osoby.d_ur%type, z_plec osoby.plec%type ); z_osoba r_osoba; z_osoba.z_id := 15; z_osoba.z_nazwisko := 'Pawloska'; z_osoba.z_imie := 'Marta'; z_osoba.z_data := TO_DATE('23/05/1982','dd/mm/yyyy'); z_osoba.z_plec := 'K'; INSERT INTO osoby VALUES (z_osoba.z_id, z_osoba.z_nazwisko, z_osoba.z_imie, NULL, z_osoba.z_data, z_osoba.z_plec); -- btw, dużo prościej byłoby użyć osoby%rowtype...

8 4. Napisac kod programu, ktory wykorzystuje identyfikator wiersza (ROWID). W tym celu zdefiniowac typ rekordowy dotyczacy cech osoby (oparty na tabeli osoby). Wstawic rekord danych do tabeli osoby: id = 30, nazwisko = 'Tomczyk', imie = 'Jan', d_ur = '21/01/80', plec = M. Po wstawieniu wydrukowac ROWID wstawianego rekordu: Identyfikator ROWID wstawianego wiersza to:... Nastepnie zaktualizowac rekord z tabeli osoby ktorego ROWID jest rowny ROWIDowi wstawianego rekordu. Przyklad: nazwisko='tomczak', imie='janusz'. Wyswietlic rekord przy pobraniu danych zaktualizowanego rekordu klauzula RETURNING... INTO... Nastepnie usunac wiersz z tabeli osoby, tej osoby ktorej id odpowiada aktualizowanego rekordu. Wydrukowac ROWID usuwanego rekordu: "Identyfikator usuwanego rekordu jest postaci..." z_rowid ROWID; TYPE r_osoba IS RECORD (z_id osoby.id%type, z_nazwisko osoby.nazwisko%type, z_imie osoby.imie1%type, z_data osoby.d_ur%type, z_plec osoby.plec%type ); z_osoba r_osoba; z_osoba.z_id := 30; z_osoba.z_nazwisko := 'Tomczyk'; z_osoba.z_imie := 'Jan'; z_osoba.z_data := TO_DATE('21/01/1980','dd/mm/yyyy'); z_osoba.z_plec := 'M'; INSERT INTO osoby VALUES (z_osoba.z_id, z_osoba.z_nazwisko, z_osoba.z_imie, NULL, z_osoba.z_data, z_osoba.z_plec) RETURNING ROWID INTO z_rowid; DBMS_OUTPUT.PUT_LINE('Identyfikator ROWID wstawianego wiersza to: ' z_rowid); UPDATE osoby SET imie1 = 'Janusz', nazwisko = 'Tomczak' WHERE ROWID = z_rowid RETURNING ROWID INTO z_rowid; DBMS_OUTPUT.PUT_LINE('Identyfikator ROWID zmienianego wiersza to: ' z_rowid);

9 DELETE osoby WHERE id = z_osoba.z_id RETURNING ROWID INTO z_rowid; DBMS_OUTPUT.PUT_LINE('Identyfikator ROWID usuwanego wiersza to: ' z_rowid); 5. Napisac kod programu, ktory wyswietli nastepujacy komunikat "Osoba wybrana, ktora jest Lis Jan ma inicjaly L.J." nalezy wykorzystac zmienne do podstawiania inicjalow, ktore sa typu zadeklarowanego przez uzytkownika jako typ tekstowy stalej dlugosci dlugosci 1. z_imie CHAR(1); z_nazwisko CHAR(1); z_imienazwisko VARCHAR2(50); SELECT imie1 ' ' nazwisko, SUBSTR(imie1,1,1), SUBSTR(nazwisko,1,1) INTO z_imienazwisko, z_imie, z_nazwisko FROM osoby WHERE id = 1; DBMS_OUTPUT.PUT_LINE('Osoba wybrana, ktora jest ' z_imienazwisko ' ma inicjaly' z_imie '.' z_nazwisko '.');

10 Ćwiczenia 4 instrukcje sterujące 1. Napisac kod bloku anonimowego w jezyku PL/SQL za pomoca ktorego dla danej osoby zostanie podany odpowiedni komunikat dotyczacy dlugosci jej imienia i nazwiska, a mianowicie gdy to suma dlugosci jest mniejsza od 8 to "Osoba o krotkiej dlugosci imienia i nazwiska, od 8 do 15 "osoba o duizej sumie dl imienia i nazwiska", zas powyzej o 15 "osoba o bardzo dluzej sumie dl imienia i nazwiska". z_imie osoby.imie1%type; z_nazwisko osoby.nazwisko%type; z_dlugosc NUMBER; SELECT o.imie1, o.nazwisko, LENGTH(o.imie1 ' ' o.nazwisko) INTO z_imie, z_nazwisko, z_dlugosc FROM osoby o WHERE o.id = 1; z_dlugosc := z_dlugosc - 1; IF z_dlugosc < 8 THEN DBMS_OUTPUT.PUT_LINE('Osoba o krotkiej dlugosci imienia i nazwiska'); ELSIF z_dlugosc >= 8 AND z_dlugosc <= 15 THEN DBMS_OUTPUT.PUT_LINE('Osoba o sredniej dlugosci imienia i nazwiska'); ELSE DBMS_OUTPUT.PUT_LINE('Osoba o duzej sumie dlugosci imienia i nazwiska'); END IF;

11 2. Napisac kod bloku anonimowego w jezyku PL/SQL w ktorym wybrana osoba bedzie przydzielona do odpowiedniej grupy wynagrodzen: 1 - ponizej 800zl zl, zl zl zl zl zl itd co 500zl X - >6000zl użyc instrukcji CASE wyszukującej z_grupa NUMBER; z_id osoby.id%type; z_pensja pensje.pensja%type; SELECT o.id, p.pensja INTO z_id, z_pensja FROM osoby o, pensje p WHERE o.id = p.id_os AND p.do IS NULL AND o.id = 2; CASE WHEN z_pensja <= 800 THEN z_grupa := 1; WHEN z_pensja > 800 AND z_pensja <= 1100 THEN z_grupa := 2; WHEN z_pensja > 1100 AND z_pensja <= 1400 THEN z_grupa := 3; WHEN z_pensja > 1400 AND z_pensja <= 1700 THEN z_grupa := 4; WHEN z_pensja > 1700 AND z_pensja <= 2000 THEN z_grupa := 5; WHEN z_pensja > 2000 AND z_pensja <= 2500 THEN z_grupa := 6; WHEN z_pensja > 2500 AND z_pensja <= 3000 THEN z_grupa := 7; WHEN z_pensja > 3000 AND z_pensja <= 3500 THEN z_grupa := 8; WHEN z_pensja > 3500 AND z_pensja <= 4000 THEN z_grupa := 9; WHEN z_pensja > 4000 AND z_pensja <= 4500 THEN z_grupa := 10; WHEN z_pensja > 4500 AND z_pensja <= 5000 THEN z_grupa := 11; WHEN z_pensja > 5000 AND z_pensja <= 5500 THEN z_grupa := 12;

12 WHEN z_pensja > 5500 AND z_pensja <= 6000 THEN z_grupa := 12; WHEN z_pensja > 6000 THEN z_grupa := 13; END CASE; DBMS_OUTPUT.PUT_LINE('Osoba o id = ' z_id ', nalezy aktualnie do ' z_grupa ' grupy wynagrodzen, bo aktualnie zarabia ' z_pensja); 3. Napisac program, ktory bedzie podawal dla wybranej osoby komunikat w ktorym miesiacu sie urodziala np Osoba o id = 1 tj. Jan Lis urodzil sie w pazdzierniku. Zastosowac instrukcje CASE sprawdzajaca. z_imienazwisko VARCHAR2(50); z_msc VARCHAR2(2); z_mscslownie VARCHAR2(30); z_id osoby.id%type; SELECT id, imie1 ' ' nazwisko, TO_CHAR(d_ur,'MM') INTO z_id, z_imienazwisko, z_msc FROM osoby WHERE id = 1; CASE z_msc WHEN '01' THEN z_mscslownie := 'styczniu'; WHEN '02' THEN z_mscslownie := 'lutym'; WHEN '03' THEN z_mscslownie := 'marcu'; WHEN '04' THEN z_mscslownie := 'kwietniu'; WHEN '05' THEN z_mscslownie := 'maju'; WHEN '06' THEN z_mscslownie := 'czerwcu'; WHEN '07' THEN z_mscslownie := 'lipcu'; WHEN '08' THEN z_mscslownie := 'sierpniu'; WHEN '09' THEN z_mscslownie := 'wrzesniu'; WHEN '10' THEN z_mscslownie := 'pazdzierniku'; WHEN '11' THEN z_mscslownie := 'listopadzie'; WHEN '12' THEN z_mscslownie := 'grudniu'; ELSE z_mscslownie := 'blad!'; END CASE; DBMS_OUTPUT.PUT_LINE('Osoba o id = ' z_id ', tj. ' z_imienazwisko ' urodzila sie w ' z_mscslownie);

13 4. Napisac kod bloku anonimowego PL/sQL za pomoca ktorego bedzie wyswietlany dla osob o id od 1 do 10 komunikat: 1. Jan Lis ma inicjaly JL... z_imienazwisko VARCHAR2(50); z_inicjal1 CHAR(1); z_inicjal2 CHAR(2); FOR z_licznik IN LOOP SELECT imie1 ' ' nazwisko, SUBSTR(imie1,1,1), SUBSTR(nazwisko,1,1) INTO z_imienazwisko, z_inicjal1, z_inicjal2 FROM osoby WHERE id = z_licznik; DBMS_OUTPUT.PUT_LINE(z_ImieNazwisko ' ma inicjaly ' z_inicjal1 '.' z_inicjal2 '.'); 5. Napisac kod bloku anonimowego z wykorzystaniem petli numerycznych FOR, za pomoca ktorego bedzie wyswietlona lista osob zatrudnionych na poszczegolnych wydzialach (zakladamy iz nie ma luk w numeracji id osob oraz sa trzy wydzialy i 10 osob) Trochę nieprecyzyjne polecenie, ponieważ należałoby jeszcze założyć, że wszystkie 10 osób aktualnie pracuje gdzieś (można to osiągnąć poniższą komendą). z_imienazwisko VARCHAR2(50); z_wydzial wydzialy.nazwa%type; z_wydzial_spr wydzialy.nazwa%type; z_licznik NUMBER; <<p_wydzialow>> FOR z_liczwydz IN 1..3 LOOP SELECT nazwa INTO z_wydzial FROM wydzialy WHERE id = z_liczwydz; DBMS_OUTPUT.PUT_LINE(z_Wydzial ' lista zatrudnionych'); z_licznik := 1;

14 <<p_osob>> FOR z_liczosob IN LOOP SELECT w.nazwa, o.imie1 ' ' o.nazwisko INTO z_wydzial_spr, z_imienazwisko WHERE o.id = z.id_os AND w.id = z.id_wydz AND z.do IS NULL AND o.id = z_liczosob; IF z_wydzial_spr = z_wydzial THEN DBMS_OUTPUT.PUT_LINE(z_Licznik '. ' z_imienazwisko); z_licznik := z_licznik + 1; END IF; END LOOP p_osob; END LOOP p_wydzialow;

15 Ćwiczenia 5 kursory jawne 1. Napisac kod bloku anonimowego, ktory dla wszystkich osob wygeneruje komunikat: 1. Lis Jan pazdziernik 2. Kot Adam listopad... a) petla prosta b) petla WHILE -- podpunkt a CURSOR k_osoba IS SELECT imie1 ' ' nazwisko, TO_CHAR(d_ur,'MM') FROM osoby; z_imienazwisko VARCHAR2(50); z_licznik NUMBER := 1; z_msc VARCHAR2(2); z_mscslownie VARCHAR2(20); OPEN k_osoba; LOOP FETCH k_osoba INTO z_imienazwisko, z_msc; EXIT WHEN k_osoba%notfound; CASE z_msc WHEN '01' THEN z_mscslownie := 'styczniu'; WHEN '02' THEN z_mscslownie := 'lutym'; WHEN '03' THEN z_mscslownie := 'marcu'; WHEN '04' THEN z_mscslownie := 'kwietniu'; WHEN '05' THEN z_mscslownie := 'maju'; WHEN '06' THEN z_mscslownie := 'czerwcu'; WHEN '07' THEN z_mscslownie := 'lipcu'; WHEN '08' THEN z_mscslownie := 'sierpniu'; WHEN '09' THEN z_mscslownie := 'wrzesniu'; WHEN '10' THEN z_mscslownie := 'pazdzierniku'; WHEN '11' THEN z_mscslownie := 'listopadzie'; WHEN '12' THEN z_mscslownie := 'grudniu'; ELSE z_mscslownie := 'blad!'; END CASE; DBMS_OUTPUT.PUT_LINE(z_Licznik '. ' z_imienazwisko ', urodzony/a w ' z_mscslownie); z_licznik := z_licznik + 1; CLOSE k_osoba;

16 -- podpunkt b CURSOR k_osoba IS SELECT imie1 ' ' nazwisko, TO_CHAR(d_ur,'MM') FROM osoby; z_imienazwisko VARCHAR2(50); z_licznik NUMBER := 1; z_msc VARCHAR2(2); z_mscslownie VARCHAR2(20); OPEN k_osoba; FETCH k_osoba INTO z_imienazwisko, z_msc; WHILE k_osoba%found LOOP CASE z_msc WHEN '01' THEN z_mscslownie := 'styczniu'; WHEN '02' THEN z_mscslownie := 'lutym'; WHEN '03' THEN z_mscslownie := 'marcu'; WHEN '04' THEN z_mscslownie := 'kwietniu'; WHEN '05' THEN z_mscslownie := 'maju'; WHEN '06' THEN z_mscslownie := 'czerwcu'; WHEN '07' THEN z_mscslownie := 'lipcu'; WHEN '08' THEN z_mscslownie := 'sierpniu'; WHEN '09' THEN z_mscslownie := 'wrzesniu'; WHEN '10' THEN z_mscslownie := 'pazdzierniku'; WHEN '11' THEN z_mscslownie := 'listopadzie'; WHEN '12' THEN z_mscslownie := 'grudniu'; ELSE z_mscslownie := 'blad!'; END CASE; DBMS_OUTPUT.PUT_LINE(z_Licznik '. ' z_imienazwisko ', urodzony/a w ' z_mscslownie); z_licznik := z_licznik + 1; FETCH k_osoba INTO z_imienazwisko, z_msc; CLOSE k_osoba;

17 2. Napisac kod bloku anonimowego PL/SQL z kursorem jawnym umozliwiajacy wyswietlanie dla poszczegolnych plci osob zatrudnionych w poszczegolnych miesiacach K styczen 1 K marzec 4 CURSOR k_osoba IS SELECT o.plec, TO_CHAR(o.d_ur,'MM') miesiac, COUNT(o.id) ilosc FROM osoby o GROUP BY o.plec, TO_CHAR(o.d_ur,'MM') ORDER BY o.plec, TO_CHAR(o.d_ur,'MM'); z_mscslownie VARCHAR2(20); FOR z_tmp IN k_osoba LOOP CASE z_tmp.miesiac WHEN '01' THEN z_mscslownie := 'styczen'; WHEN '02' THEN z_mscslownie := 'luty'; WHEN '03' THEN z_mscslownie := 'marzec'; WHEN '04' THEN z_mscslownie := 'kwiecien'; WHEN '05' THEN z_mscslownie := 'maj'; WHEN '06' THEN z_mscslownie := 'czerwiec'; WHEN '07' THEN z_mscslownie := 'lipiec'; WHEN '08' THEN z_mscslownie := 'sierpien'; WHEN '09' THEN z_mscslownie := 'wrzesien'; WHEN '10' THEN z_mscslownie := 'pazdziernik'; WHEN '11' THEN z_mscslownie := 'listopad'; WHEN '12' THEN z_mscslownie := 'grudzien'; ELSE z_mscslownie := 'blad!'; END CASE; DBMS_OUTPUT.PUT_LINE(z_Tmp.plec ' ' z_mscslownie ' ' z_tmp.ilosc);

18 3. Zaprojektowac kursor jawny z blokada, ktorego zadaniem jest podniesienie aktualnej pensji wszystkim kobietom o 10%. Transakcje zatwierdzic. CURSOR k_podniespensjekobietom IS SELECT o.id, p.pensja FROM osoby o, pensje p WHERE o.plec = 'K' AND o.id = p.id_os AND p.do IS NULL FOR UPDATE OF p.pensja; FOR z_tmp IN k_podniespensjekobietom LOOP UPDATE pensje SET pensja = pensja * 1.1 WHERE CURRENT OF k_podniespensjekobietom; COMMIT; 4. Mamy 1000zl na podwyzke akltualnej pensji dla wszystkich aktualnie zatrudnionych osob. Zaprojketowac kursor jawny z blokada ktorego zadaniem jest podniesienie aktualnej pensji wszystkim osobom aktuyalnie zatrudnionym o te sama stawke. Zatwierdzic tranzakcje. CURSOR k_podniespensje IS SELECT o.id, p.pensja FROM osoby o, pensje p, zatrudnienia z WHERE o.id = z.id_os AND o.id = p.id_os AND z.do IS NULL AND p.do IS NULL FOR UPDATE OF p.pensja; z_iloscosob NUMBER; Osob FROM osoby o, pensje p, zatrudnienia z WHERE o.id = z.id_os AND o.id = p.id_os AND z.do IS NULL AND p.do IS NULL; FOR z_tmp IN k_podniespensje LOOP UPDATE pensje SET pensja = pensja + (1000 / z_iloscosob); WHERE CURRENT OF k_podniespensje; COMMIT;

19 Ćwiczenia 6 obsługa wyjątków 1. Mamy dokonac podwyzki aktualnej pensji wszystkim aktualnie zatrudnionym osobom kazda z nich ma dostac taka kwote podwyzki jaka wynika z ostatniego okresu pracy na danym wydziale (za kazdy pelny przepracowany rok osoba dostaje podwyzke w wysokosci 3,5% aktualnej pensji. Zaprojektowac kursor jawny z blokada przy pomocy ktorego zostanie zrealizowana powyzsza tranzakcja. Tranzjakcje zatwierdzic. CURSOR k_podnies IS SELECT TRUNC(MONTHS_BETWEEN(p.od,SYSDATE)/12,0) ile, p.pensja FROM pensje p, osoby o, zatrudnienia z WHERE o.id = z.id_os AND o.id = p.id_os AND p.do IS NULL AND z.do IS NULL FOR UPDATE OF p.pensja; FOR z_tmp IN k_podnies LOOP UPDATE pensje SET pensja = pensja + (z_tmp.ile * 0.035) * pensja WHERE CURRENT OF k_podnies; COMMIT; 2. W bloku anonimowym PL/SQL zdefiniowano zmienna z_nazwisko, typu VARCHAR2(10), zas w sekcji wykonania tego bloku przypisano wartosc 'Nowak - Konopacka'. Zaprojektowac obsluge tego wyjatku poprzez wyswietlenie komunikatu: 'Zbyt dlugi ciag znakow alfanumerycznych'. z_nazwisko VARCHAR2(10); z_nazwisko := 'Nowak Konopacka'; EXCEPTION WHEN value_error THEN DBMS_OUTPUT.PUT_LINE('Zbyt dlugi ciag znakow alfanumerycznych'); /* lub RAISE_APPLICATION_ERROR(-20000,'Zbyt dlugi ciag znakow alfanumerycznych'); */

20 3. Napisac kod bloku anonimowego anonimowego PL/SQL za pomoca ktorego zostana wyswietlone te aktualnie zatrudnione osoby, ktore przepracowaly wiecej niz x lat pracy na danym wydziale (x jest liczba calkowita zadana poprzez wartosc zmiennej PL/SQL). Zaprojektowac obsluge wszystkich mozliwych wyjatkow jakie moga wystapic przy zalozeniu iz w bloku wykorzystano kursor niejawny. z_latapracy NUMBER(2); z_osoba osoby%rowtype; z_wydzial wydzialy.nazwa%type; -- przykladowe dane z_latapracy := 2; z_wydzial := 'Fizyka'; SELECT o.* INTO z_osoba FROM osoby o, zatrudnienia z, wydzialy w WHERE o.id = z.id_os AND z.do IS NULL AND z.id_wydz = w.id AND w.nazwa = z_wydzial AND TRUNC(MONTHS_BETWEEN(z.od,SYSDATE)/12,0) >= z_latapracy; DBMS_OUTPUT.PUT_LINE(z_Osoba.id ' ' z_osoba.imie1 ' ' z_osoba.nazwisko ' ' z_osoba.d_ur ' ' z_osoba.plec); EXCEPTION WHEN value_error THEN RAISE_APPLICATION_ERROR(-20000, 'Nieprawidlowe kryteria!'); -- np. podanie, ze ktos przepracowal 1000 lat albo za dluga nazwa wydzialu WHEN no_data_found THEN RAISE_APPLICATION_ERROR(-20001, 'Nie znaleziono osoby!'); WHEN too_many_rows THEN RAISE_APPLICATION_ERROR(-20002, 'Wybrano wiecej, niz jedna osobe!'); WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20003, 'Nieznany blad!');

21 4. Do tabeli osoby i zatrudniono wprowadzono osobe o id = 11, ktora jak sie okazalo ma niepoprawne dane, gdyz jej data urodzila jest pozniejsza niz zatrudnienia i/lub data zatrudnienia jest pozniejsza niz data zwolnienia. Nalezy zaprojektowac obsluge wyjatkow, ktore wylapuja taka sytuacje dla dowolonej osoby. Obsluga wyjatkow ma polegac na wylapaniu i obsluzeniu nastepujacych bledow: a) data urodzenia jest pozniejsza niz data zatrudnienia b) data zatrudnienia jest pozniejsza niz zwolnienia c) data urodzenia jest pozniejsza niz data zatrudnienia oraz data zatrudnienia jest pozniejsza niz zwolnienia -- przykladowe dane wywolujace pierwszy wyjatek INSERT INTO osoby VALUES (11,'Pazdzioch','Marian',NULL,TO_DATE('2009/01/01','yyyy/mm/dd'),'M'); INSERT INTO ZATRUDNIENIA VALUES (11,11,TO_DATE('2008/02/01','yyyy/mm/dd'),TO_DATE('2007/01/04','yyyy/mm/dd'),2); -- rozwiazanie z_dataurodzenia DATE; z_datazatrudnienia DATE; z_datazwolnienia DATE; z_id osoby.id%type := 11; w_dataurodzeniapozniejsza EXCEPTION; w_datazatrudnieniapozniejsza EXCEPTION; w_obiedatyzle EXCEPTION; SELECT o.d_ur, z.od, z.do INTO z_dataurodzenia, z_datazatrudnienia, z_datazwolnienia FROM osoby o, zatrudnienia z WHERE o.id = z_id AND o.id = z.id_os; IF z_dataurodzenia > z_datazatrudnienia AND z_datazatrudnienia > z_datazwolnienia THEN RAISE w_obiedatyzle; ELSIF z_dataurodzenia > z_datazatrudnienia THEN RAISE w_dataurodzeniapozniejsza; ELSIF z_datazatrudnienia > z_datazwolnienia THEN RAISE w_datazatrudnieniapozniejsza; END IF; EXCEPTION WHEN w_obiedatyzle THEN RAISE_APPLICATION_ERROR(-20000,'Data urodzenia pozniejsza niz data zatrudnienia oraz data zatrudnienia pozniejsza niz data zwolnienia'); WHEN w_dataurodzeniapozniejsza THEN RAISE_APPLICATION_ERROR(-20001,'Data urodzenia pozniejsza niz data zatrudnienia'); WHEN w_datazatrudnieniapozniejsza THEN

22 RAISE_APPLICATION_ERROR(-20002,'Data zatrudnienia jest pozniejsza niz data zwolnienia');

23 Ćwiczenia 7 funkcje i procedury 1. Wykorzystac odpowiednie funkcje do zapisania kodu bledu komunikatu o tym bledzie, w przypadku zastosowania wyjatku OTHERS do obslugi tego bledu. Kod bledu i komunikat zapisac w tabeli tabela_bledow (kod bledu, komunikat bledow). Przykladowy blad, ktory obsluguje ten wyjatek OTHERS to pobranie kursorem niejawnym danych osoby o id = 50. DROP TABLE tabela_bledow; CREATE TABLE tabela_bledow ( kod_bledu NUMBER, komunikat_bledu VARCHAR2(200)); z_imienazwisko VARCHAR2(50); z_nrbledu tabela_bledow.kod_bledu%type; z_komunikatbledu tabela_bledow.komunikat_bledu%type; SELECT imie1 ' ' nazwisko INTO z_imienazwisko FROM osoby WHERE id = 50; EXCEPTION WHEN OTHERS THEN z_nrbledu := SQLCODE; z_komunikatbledu := SUBSTR(SQLERRM,1,200); INSERT INTO tabela_bledow VALUES (z_nrbledu,z_komunikatbledu);

24 2. a) Zaprojektowac procedure do wstawiania rekordow do tabeli osoby. b) obsluzyc wyjatek polegajacy na wprowadzeniu osoby o istniejacym id CREATE OR REPLACE PROCEDURE DodajOsobe (p_id osoby.id%type, p_nazwisko osoby.nazwisko%type, p_imie1 osoby.imie1%type, p_imie2 osoby.imie2%type, p_dataur DATE, p_plec osoby.plec%type) AS INSERT INTO osoby VALUES (p_id,p_nazwisko,p_imie1,p_imie2,p_dataur,p_plec); EXCEPTION WHEN dup_val_on_index THEN RAISE_APPLICATION_ERROR(-20000,'Osoba o podanym id istnieje!'); -- wywolanie EXECUTE DodajOsobe (1, 'Jozwiak', 'Marek', 'Janusz', TO_DATE('02/08/1962','dd/mm/yyyy'),'M'); 3. Zaprojektowac procedure i funkcje obliczania liczby wszystkich kobiet lub mezczyzn. Nastepnie wywolac je za pomoca instrukcji SQLowej i wydrukowac wynik. CREATE OR REPLACE FUNCTION IleOsob (p_plec osoby.plec%type) RETURN NUMBER AS z_ilosc NUMBER; SELECT COUNT(id) FROM osoby WHERE plec = p_plec; RETURN z_ilosc; -- wywolanie VARIABLE Ilosc NUMBER; EXECUTE :Ilosc := IleOsob('M'); -- lub -- CALL IleOsob('M') INTO :Ilosc; PRINT Ilosc;

25 4. Zaprojektowac funkcje ktora dla kazdego wyzialu poda nam w formie komunikatu informacje o procencie zatrudnionych aktualnie na nim osob w stosunku do liczby wszystkich aktualnie zatrudnionych osob. KOmunikaty: Wydzial zatrudnia ponad 50% aktualnie zatrudnionych osob. Wydzial zatrudnia od 25% do 50% aktualnie zatrudnionych osob. Wydzial zatrudnia ponizej 25% aktualnie zatrudnionych osob. Na wydziale nikt nie jest zatrudniony. UWAGA! Zastosowac instrukcje z wiecej niz jedna klauzula RETURN; CREATE OR REPLACE FUNCTION DajProcentZatrudnionych (p_nazwa wydzialy.nazwa%type) RETURN VARCHAR2 AS z_iloscwszystkich NUMBER; z_iloscnawydziale NUMBER; z_procent NUMBER; Wszystkich FROM osoby o, zatrudnienia z WHERE o.id = z.id_os AND z.do IS NULL; NaWydziale FROM osoby o, zatrudnienia z, wydzialy w WHERE o.id = z.id_os AND z.do IS NULL AND w.id = z.id_wydz AND INITCAP(w.nazwa) = INITCAP(p_Nazwa); z_procent := (z_iloscnawydziale / z_iloscwszystkich) * 100; IF z_procent > 50 THEN RETURN 'Wydzial zatrudnia ponad 50% aktualnie zatrudnionych osob'; ELSIF z_procent >= 25 AND z_procent <= 50 THEN RETURN 'Wydzial zatrudnia od 25% do 50% aktualnie zatrudnionych osob'; ELSE RETURN 'Wydzial zatrudnia ponizej 25% aktualnie zatrudnionych osob'; END IF; -- wywolanie VARIABLE Tekst VARCHAR2(100); EXECUTE :Tekst := DajProcentZatrudnionych('matematyka'); PRINT Tekst;

26 5. Zaprojektowac blok anonimowy PL/SQL za pomoca ktorego zostanie wyswietlona dla wszystkich liter alfabetu liczba osob na poszczegolnych wydzialach o imieniu na dana litere. Zaprojektowac przypadek braku osoby na wydziale o imieniu na dana litere na wyswietlenie moze da sie to rozwiazac latwiej, niestety nie da sie zrobic petli po literach alfabetu, takze --- nie wiem jakby to mialo wygladac -- moznaby ewentualnie stworzyc funkcje, aby oszczedzic na pisaniu... kursora jawnego chyba nie da sie uzyc... z_litera CHAR(1); z_ilosc NUMBER; z_wydzial wydzialy.nazwa%type; CURSOR k_wydzialy IS SELECT nazwa FROM wydzialy; FOR z_tmp IN k_wydzialy LOOP z_wydzial := z_tmp.nazwa; DBMS_OUTPUT.PUT_LINE('Wydzial: ' INITCAP(z_Wydzial)); z_litera := 'a'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'b'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'c'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial;

27 DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'd'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'e'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'f'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'g'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'h'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'i';

28 WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'j'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'k'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'l'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'm'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'n'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc);

29 z_litera := 'o'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'p'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'r'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 's'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 't'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'q';

30 WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'u'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'w'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'x'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'y'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); z_litera := 'z'; WHERE UPPER(SUBSTR(o.imie1,1,1)) = UPPER(z_Litera) AND z.do IS NULL AND o.id = z.id_os AND w.id = z.id_wydz AND w.nazwa = z_wydzial; DBMS_OUTPUT.PUT_LINE('Litera: ' z_litera ', osob: ' z_ilosc); DBMS_OUTPUT.PUT_LINE('====================');

31

32 Zajęcia 8 kolekcje 1. Zadeklarowac 3 tabele indeksowane, do ktorych wprowadzic odpowiednio: nazwiska, imiona i daty urodzin osob z tabeli osoby, przy czym kolejne indeksy elementow tych tabel maja byc nieujemnymi liczbami calkowitymi podzielnymi przez 5, a ponadto osoby maja byc wprowadzone do tabel alfabetycznie (nazwiska i imiona) - wydrukowac elementy tych tabel bezposrednio po wprowadzeniu do nich danych. TYPE t_nazwiska IS TABLE OF osoby.nazwisko%type INDEX BY BINARY_INTEGER; TYPE t_imiona IS TABLE OF osoby.imie1%type INDEX BY BINARY_INTEGER; TYPE t_datyur IS TABLE OF DATE INDEX BY BINARY_INTEGER; z_licznik NUMBER := 0; z_nazwiska t_nazwiska; z_imiona t_imiona; z_datyur t_datyur; CURSOR k_osoba IS SELECT nazwisko, imie1, d_ur FROM osoby ORDER BY nazwisko, imie1; FOR z_tmp IN k_osoba LOOP z_nazwiska(z_licznik) := z_tmp.nazwisko; z_imiona(z_licznik) := z_tmp.imie1; z_datyur(z_licznik) := z_tmp.d_ur; DBMS_OUTPUT.PUT_LINE(z_Licznik ': ' z_nazwiska(z_licznik) ' ' z_imiona(z_licznik) ' ' z_datyur(z_licznik)); z_licznik := z_licznik + 5;

33 2. Przypisując w ten sam sposób dane z tabeli osoby do tabel indeksowanych oraz nie znajac liczby osob, ktorych dane zostaly wprowadzone do tabel indeksowanych wydrukowac w innej petli niz wprowadzenie danych, a mianowicie w petli FOR elementy tabel indeksowanych. UWAGA - nie liczymy elementow w tabeli osoby, ale elementy tabel indeksowanych. TYPE t_nazwiska IS TABLE OF osoby.nazwisko%type INDEX BY BINARY_INTEGER; TYPE t_imiona IS TABLE OF osoby.imie1%type INDEX BY BINARY_INTEGER; TYPE t_datyur IS TABLE OF DATE INDEX BY BINARY_INTEGER; z_licznik NUMBER := 0; z_nazwiska t_nazwiska; z_imiona t_imiona; z_datyur t_datyur; CURSOR k_osoba IS SELECT nazwisko, imie1, d_ur FROM osoby ORDER BY nazwisko, imie1; FOR z_tmp IN k_osoba LOOP z_nazwiska(z_licznik) := z_tmp.nazwisko; z_imiona(z_licznik) := z_tmp.imie1; z_datyur(z_licznik) := z_tmp.d_ur; z_licznik := z_licznik + 5; FOR i IN 0..z_Nazwiska.COUNT-1 LOOP z_licznik := i * 5; DBMS_OUTPUT.PUT_LINE(z_Licznik ': ' z_nazwiska(z_licznik) ' ' z_imiona(z_licznik) ' ' z_datyur(z_licznik));

34 3. Przypisac nazwiska i imiona z tabeli osoby do elementow tabeli indeksowanej w ten sposob, iz indeksy sa nieujemnymi liczbami calkowitymi podzielnymi przez 3. Wydrukowac te elementy w petli FOR nie znajac ich liczby. Nastepnie usunac te elementz tabeli nieindeksowanej ktorzch indeks jest podyielnz prey 6 i powtornie wzdrukowac te elementy przy wykorzystaniu petli FOR. z_licznik NUMBER := 0; TYPE t_nazwiska IS TABLE OF osoby.nazwisko%type INDEX BY BINARY_INTEGER; TYPE t_imiona IS TABLE OF osoby.imie1%type INDEX BY BINARY_INTEGER; z_nazwiska t_nazwiska; z_imiona t_imiona; CURSOR k_osoba IS SELECT nazwisko, imie1 FROM osoby; FOR z_tmp IN k_osoba LOOP z_nazwiska(z_licznik) := z_tmp.nazwisko; z_imiona(z_licznik) := z_tmp.imie1; z_licznik := z_licznik + 3; FOR i IN 0..z_Nazwiska.COUNT-1 LOOP z_licznik := i * 3; DBMS_OUTPUT.PUT_LINE(z_Licznik ': ' z_nazwiska(z_licznik) ' ' z_imiona(z_licznik)); FOR i IN 0..z_Nazwiska.COUNT-1 LOOP z_licznik := i * 3; IF MOD(z_Licznik,6) = 0 THEN z_nazwiska.delete(z_licznik); z_imiona.delete(z_licznik); END IF;

35 DBMS_OUTPUT.PUT_LINE('Po usunieciu:'); z_licznik := 3; FOR i IN 0..z_Nazwiska.COUNT-1 LOOP z_licznik := 3 + i * 6; DBMS_OUTPUT.PUT_LINE(z_Licznik ': ' z_nazwiska(z_licznik) ' ' z_imiona(z_licznik)); -- moznaby tez sprobowac cos zdzialac przy uzyciu metody NEXT 4. Utworzyc kolekcje typu tabela zagniezdzona, ktorych elementami sa liczby. Zainicjowac zmienna tego typu liczbami pierwszymi niewiekszymi niz 20. Nastepnie wydrukowac te elementy tej tabeli zagniezdzonej, ktore przy dzieleniu przez 3 daja reszte 1. Przy zalozeniu ze nie jest znana liczba tych elementow. TYPE t_liczby IS TABLE OF NUMBER; z_liczby t_liczby := t_liczby(2,3,5,7,11,13,17,19); FOR i IN 1..z_Liczby.COUNT LOOP IF MOD(i,3) = 1 THEN DBMS_OUTPUT.PUT_LINE(i ': ' z_liczby(i)); END IF;

36 5. Utworzyc kolekcje typu tabela o zmiennym rozmiarze, ktorej elementami sa liczby. Nastepnie zainicjowac zmienna tego typu liczbami pierwszymi niewiekszymi od 20. Obliczyc srednia arytmenyczna elementow tej kolekcji. Wybrac i wydrukowac te elementy z tabeli o zmiennym rozmiarze, ktorych wartosc jest wieksza niz dotychczasowa srednia. 6. W zadaniu 5 dopisac linie kodu pozwalajace wydrukowac aktualna liczbe elementow kolekcji oraz maksymalna liczbe elementow kolekcji. Wykonac polecenia jak w zadaniu 5. Nastepnie rozszerzyc kolekcje o 3 duplikaty trzeciego elementu kolekcji i powtorzyc obliczenia jak w zadaniu 5. TYPE t_liczby IS VARRAY(20) OF NUMBER; z_liczby t_liczby := t_liczby(2,3,5,7,11,13,17,19); z_srednia NUMBER; z_suma NUMBER := 0; FOR i IN 1..z_Liczby.COUNT LOOP z_suma := z_suma + z_liczby(i); z_srednia := z_suma / z_liczby.count; DBMS_OUTPUT.PUT_LINE('Srednia: ' TRUNC(z_Srednia,2)); DBMS_OUTPUT.PUT_LINE('Elementy wieksze niz srednia:'); FOR i IN 1..z_Liczby.COUNT LOOP IF z_liczby(i) > z_srednia THEN DBMS_OUTPUT.PUT_LINE(z_Liczby(i)); END IF; -- zadanie 6 DBMS_OUTPUT.PUT_LINE('============='); DBMS_OUTPUT.PUT_LINE('Ilosc elementow: ' z_liczby.count); DBMS_OUTPUT.PUT_LINE('Maksymalny rozmiar: ' z_liczby.limit); FOR i IN 1..3 LOOP z_liczby.ext z_liczby(z_liczby.last) := z_liczby(3); z_suma := 0; FOR i IN 1..z_Liczby.COUNT LOOP z_suma := z_suma + z_liczby(i); z_srednia := z_suma / z_liczby.count; DBMS_OUTPUT.PUT_LINE('Nowa srednia: ' TRUNC(z_Srednia,2));

37 Ćwiczenia 9 kolekcje, ciąg dalszy Zadanie 27 z ponadto: 1. Utworzyc klucz zlozony w tabeli wydzialy1 skladajacy sie z pol nazwa i kierunek, 2. Utworzyc klucz zlozony w tabeli WYKAZ_EGZAMINOW skladajacy sie z pol KOD_P i DATA_EGZ -- zmienilem nazwe z WYKAZ_EGZAMINOW na TABELA_EGZAMINOW, poniewaz byla taka sama jak kolumna w tabeli wydzialy, co koliduje z moją moralnościa ;) -- TABELE DROP TABLE przedmioty; DROP TABLE studenci; DROP TABLE wydzialy2; DROP TABLE tabela_egzaminow; -- klauzule NOT NULL pomijamy, bo nie ma o niej mowy w poleceniu CREATE TABLE przedmioty ( kod_p NUMBER(2) PRIMARY KEY, nazwa VARCHAR2(30), l_godz_wykl NUMBER(2), l_godz_cw NUMBER(2)); CREATE TABLE studenci ( id NUMBER(2) PRIMARY KEY, nazwisko VARCHAR2(20), imie VARCHAR2(20)); CREATE OR REPLACE TYPE t_wykaz_egzaminow AS VARRAY(20) OF NUMBER(2); / CREATE TABLE wydzialy2 ( nazwa VARCHAR2(20), kierunek VARCHAR2(20), wykaz_egzaminow t_wykaz_egzaminow, CONSTRAINT pk_wydzialy2 PRIMARY KEY (nazwa, kierunek)); CREATE OR REPLACE TYPE t_zdawany_przez AS TABLE OF NUMBER(2); / CREATE TABLE tabela_egzaminow ( kod_p NUMBER(2), data_egz DATE, zdawany_przez t_zdawany_przez, CONSTRAINT pk_tabela_egzaminow PRIMARY KEY(kod_p,data_egz)) NESTED TABLE zdawany_przez STORE AS st_tab; INSERT INTO przedmioty VALUES (10,'Analiza matematyczna',4,4); INSERT INTO przedmioty VALUES (20,'Bazy danych',2,2); INSERT INTO przedmioty VALUES (30,'Historia starozytna',3,0); INSERT INTO przedmioty VALUES (40,'Algebra',4,2);

38 INSERT INTO przedmioty VALUES (50,'Metody numeryczne',2,2); INSERT INTO przedmioty VALUES (60,'Historia Polski',4,0); INSERT INTO przedmioty VALUES (70,'Funkcje rzeczywiste',4,2); INSERT INTO studenci VALUES (1,'Nowak','Jerzy'); INSERT INTO studenci VALUES (2,'Kraska','Adam'); INSERT INTO studenci VALUES (3,'Rosiak','Monika'); INSERT INTO studenci VALUES (4,'Czaplinski','Mateusz'); INSERT INTO studenci VALUES (5,'Adamczyk','Elzbieta'); INSERT INTO studenci VALUES (6,'Daniec','Katarzyna'); INSERT INTO studenci VALUES (7,'Kraczycki','Piotr'); INSERT INTO wydzialy2 VALUES ('Matematyki', 'Matematyka', t_wykaz_egzaminow(10,40,70)); INSERT INTO wydzialy2 VALUES ('Historii', 'Dydaktyka historii', t_wykaz_egzaminow(30,60)); INSERT INTO wydzialy2 VALUES ('Matematyki', 'Informatyka', t_wykaz_egzaminow(20,50)); INSERT INTO tabela_egzaminow VALUES (10,TO_DATE('23/01/2001','dd/mm/yyyy'), t_zdawany_przez(1,3,5)); INSERT INTO tabela_egzaminow VALUES (20,TO_DATE('25/06/2001','dd/mm/yyyy'), t_zdawany_przez(4,7)); INSERT INTO tabela_egzaminow VALUES (30,TO_DATE('15/01/2001','dd/mm/yyyy'), t_zdawany_przez(2,6)); INSERT INTO tabela_egzaminow VALUES (40,TO_DATE('20/01/2001','dd/mm/yyyy'), t_zdawany_przez(1,3,5)); INSERT INTO tabela_egzaminow VALUES (50,TO_DATE('21/01/2001','dd/mm/yyyy'), t_zdawany_przez(4,7)); INSERT INTO tabela_egzaminow VALUES (60,TO_DATE('19/01/2001','dd/mm/yyyy'), t_zdawany_przez(2,6)); INSERT INTO tabela_egzaminow VALUES (70,TO_DATE('29/01/2001','dd/mm/yyyy'), t_zdawany_przez(3,5)); -- PROCEDURY CREATE OR REPLACE PROCEDURE lista_egzaminow AS CURSOR k_wydzialy IS SELECT nazwa, kierunek FROM wydzialy2; CURSOR k_egzaminy IS SELECT kod_p, nazwa FROM przedmioty; z_wykaz t_wykaz_egzaminow; z_kodprzedmiotu przedmioty.kod_p%type; z_nazwaprzedmiotu przedmioty.nazwa%type; <<petla_wydzialow>>

39 FOR z_tmpw IN k_wydzialy LOOP DBMS_OUTPUT.PUT_LINE('Egzaminy na wydziale ' z_tmpw.nazwa ' dla kierunku ' z_tmpw.kierunek ':'); <<petla_egzaminow>> FOR z_tmpegz IN k_egzaminy LOOP SELECT wykaz_egzaminow INTO z_wykaz FROM wydzialy2 WHERE nazwa = z_tmpw.nazwa AND kierunek = z_tmpw.kierunek; / FOR i IN 1..z_Wykaz.COUNT LOOP IF z_tmpegz.kod_p = z_wykaz(i) THEN DBMS_OUTPUT.PUT_LINE(z_TmpEgz.kod_p ' ' z_tmpegz.nazwa); END IF; END LOOP petla_egzaminow; END LOOP petla_wydzialow; CREATE OR REPLACE PROCEDURE lista_zdajacych (p_nazwa przedmioty.nazwa%type) AS z_zdajacy t_zdawany_przez; z_imienazwisko VARCHAR2(50); SELECT e.zdawany_przez INTO z_zdajacy FROM tabela_egzaminow e, przedmioty p WHERE e.kod_p = p.kod_p AND p.nazwa = p_nazwa; DBMS_OUTPUT.PUT_LINE('Osoby zdajace egzamin z przedmiotu ' p_nazwa ': '); FOR i IN 1..z_Zdajacy.COUNT LOOP SELECT nazwisko ' ' imie INTO z_imienazwisko FROM studenci WHERE id = z_zdajacy(i); / DBMS_OUTPUT.PUT_LINE(i '. ' z_imienazwisko); -- SPRAWDZENIE DZIALANIA CALL lista_egzaminow(); CALL lista_zdajacych('bazy danych');

40 UWAGI: 1. uzywajac CALL nawiasy sa konieczne, nawet jezeli wywolywana funkcja nie przyjmuje zadnych argumentow 2. jeżeli w poleceniu jest napisane, aby wywolac funkcje/procedure poleceniem SQL-owym, to uzywamy funkcji CALL, poniewaz funkcja EXECUTE jest funkcja srodowiska isqlplus, a nie samego języka

41 Ćwiczenia 10 pakiety 1. Zaprojektowac pakiet zawierajacy procedure wprowadzenia nowej osoby do tabeli osoby, procedure usuwania osoby juz wprowadzonej uprzednio do tabeli osoby, przy czym musi ona zawierac obsluge deklarowanego przez uzytkownika bledu nie znalezienia rekordu do usuniecia oraz procedure wyswietajaca liste aktualnie zatrudnionej osoby na wskazanym wydziale przy czym lista ta powinna byc zwracana przy wykorzystaniu odpowiedniego typu kolekcji (typow kolekcji). 2. Rozszerzyc pakiet z zadania 1 w ten sposob iz bedzie on zawieral procedure widoczna w obrebie samego pakietu ktora to procedura bedzie aktualizowala tabele plec_osob (plec, liczba_osob) ktora trzeba bedzie utworzyc w ten sposob, ze zawiera ona nazwe plci i liczbe osob danej plci. po kazdej operacji ustawienia badz usuniecia osoby z tabeli osoby za pomoca procedur z zadania 1. CREATE OR REPLACE PACKAGE p_osoby AS PROCEDURE DodajOsobe (p_osoba osoby%rowtype); PROCEDURE UsunOsobe (p_id osoby.id%type); TYPE t_osobyzatrudnione IS TABLE OF osoby%rowtype INDEX BY BINARY_INTEGER; PROCEDURE WypiszZatrudnionych (p_nazwa IN wydzialy.nazwa%type, p_osoby OUT t_osobyzatrudnione); END p_osoby; / -- tabela do zadania 2 CREATE TABLE plec_osob AS SELECT plec, COUNT(plec) ilosc FROM osoby ORDER BY plec; CREATE OR REPLACE PACKAGE BODY p_osoby AS -- procedura do zadania 2 PROCEDURE AktualizujPlecOsob AS CURSOR k_plec IS SELECT plec, COUNT(plec) ilosc FROM osoby GROUP BY plec; FOR z_tmp IN k_plec LOOP UPDATE plec_osob SET ilosc = z_tmp.ilosc WHERE plec = z_tmp.plec; PROCEDURE DodajOsobe (p_osoba osoby%rowtype) AS

42 INSERT INTO osoby VALUES (p_osoba.id, p_osoba.nazwisko, p_osoba.imie1, p_osoba.imie2, p_osoba.d_ur, p_osoba.plec); -- z jakiegos powodu nie da sie wstawic od razu calego rekordu akutalizacja tabeli z zadania 2 AktualizujPlecOsob; END DodajOsobe; PROCEDURE UsunOsobe (p_id osoby.id%type) AS w_brakosoby EXCEPTION; z_id osoby.id%type; SELECT id INTO z_id FROM osoby WHERE id = p_id; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE w_brakosoby; DELETE osoby WHERE id = p_id; DBMS_OUTPUT.PUT_LINE('Osoba o id = ' p_id ' zostala usunieta z tabeli osoby.'); -- aktualizacja tabeli z zadania 2 AktualizujPlecOsob; EXCEPTION WHEN w_brakosoby THEN DBMS_OUTPUT.PUT_LINE('Nie znaleziono osoby do usuniecia!'); PROCEDURE WypiszZatrudnionych (p_nazwa IN wydzialy.nazwa%type, p_osoby OUT t_osobyzatrudnione) AS z_liczbaosob NUMBER; CURSOR k_osoba IS SELECT o.id, w.nazwa WHERE o.id = z.id_os AND w.id = z.id_wydz AND z.do IS NULL; z_licznik NUMBER := 1; INTO z_liczbaosob

43 WHERE o.id = z.id_os AND w.id = z.id_wydz AND z.do IS NULL AND w.nazwa = p_nazwa; DBMS_OUTPUT.PUT_LINE('Osoby zatrudnione na wydziale ' p_nazwa); FOR z_tmp IN k_osoba LOOP IF z_tmp.nazwa = p_nazwa THEN SELECT * INTO p_osoby(z_licznik) FROM osoby WHERE id = z_tmp.id; DBMS_OUTPUT.PUT_LINE(p_Osoby(z_Licznik).id '. ' p_osoby(z_licznik).nazwisko ' ' p_osoby(z_licznik).imie1 ' ' p_osoby(z_licznik).d_ur ' ' p_osoby(z_licznik).plec); z_licznik := z_licznik + 1; END IF; END p_osoby; / -- testowanie dzialania ostatniej procedury z_zatrudnieni p_osoby.t_osobyzatrudnione; z_nazwa wydzialy.nazwa%type := 'matematyka'; p_osoby.wypiszzatrudnionych(z_nazwa,z_zatrudnieni);

44 Zajęcia 11 wyzwalacze 1. Zaprojektować wyzwalacz DML na poziomie wiersza ktory bedzie umozliwial wypelnienie pola id w tabeli osoby nastepna liczba z uprzednio utworzonej sekwencji. -- tworzenie sekwencji CREATE SEQUENCE licz_id_os START WITH 33 INCREMENT BY 1; -- wartość początkowa zależy od maksymalnego osoby.id obecnie -- wyzwalacz CREATE OR REPLACE TRIGGER w_osobyidsekwencyjne BEFORE INSERT ON osoby FOR EACH ROW -- kursor niejawny, a nie UPDATE, bo zaszłoby zjawisko mutacji SELECT licz_id_os.nextval INTO :new.id FROM DUAL; END w_osobyidsekwencyjne; / -- test INSERT INTO osoby VALUES(-3,'Pazdzioch','Marian',NULL,SYSDATE,'M'); -- okazuje się, że wstawiła się następna wartość sekwencji 2. Mamy zaprojektowac wyzwalacz DML, ktory w sposob ciagly bedzie aktualizowal tabele zatrudn_liczba (nazwa, liczba_os) ktora zawiera informacje o liczbie akutlanie zatrudnionych osob na poszukiwanych wydzialach. DROP TABLE zatrudn_liczba; CREATE TABLE zatrudn_liczba ( nazwa_wydzialu VARCHAR2(20), liczba_os NUMBER); CREATE OR REPLACE TRIGGER w_aktualizujzatr AFTER INSERT OR UPDATE OR DELETE ON zatrudnienia CURSOR c_zatr IS SELECT w.nazwa, COUNT (o.id) liczba_os FROM wydzialy w, osoby o, zatrudnienia z WHERE w.id = z.id_wydz AND o.id = z.id_os AND z.do IS NULL GROUP BY w.nazwa; DELETE zatrudn_liczba; FOR z_tmp IN c_zatr LOOP INSERT INTO zatrudn_liczba VALUES (z_tmp.nazwa,z_tmp.liczba_os);

45

46 3. Mamy wykorzystac wyzwalacz DML do zapisu wszystkich dzialan wykonywanych na tabeli zatrudnienia. W tym celu nalezy utworzyc tabele zapis, w ktorej beda gromadzone zapisy o podjetych dzialaniach na tabeli zatrudnienia wyzwalacz powienien posiadac takze obsluge bledu w tkorej powinien byc wyswietlany kod popelnionego bledu. zapis (id number <== sekwencja, akcja varchar2(12) <= nazwa operacji DML data date <= data operacji uzyt varchar2(25) <= nazwa uzytkownika CREATE SEQUENCE l_zapisid START WITH 0 INCREMENT BY 1; CREATE TABLE zapis ( id NUMBER PRIMARY KEY, akcja VARCHAR2(12) NOT NULL, data DATE NOT NULL, uzytkownik VARCHAR2(25) NOT NULL); CREATE OR REPLACE TRIGGER w_zapisdzialan AFTER INSERT OR UPDATE OR DELETE ON zatrudnienia FOR EACH ROW z_kodbledu NUMBER; z_rodzajoperacji VARCHAR2(20); IF INSERTING THEN z_rodzajoperacji := 'wstawianie'; ELSIF UPDATING THEN z_rodzajoperacji := 'aktualizowanie'; ELSE z_rodzajoperacji := 'usuwanie'; END IF; INSERT INTO zapis VALUES ( l_zapisid.nextval, z_rodzajoperacji, SYSDATE, USER); EXCEPTION WHEN OTHERS THEN z_kodbledu := SQLCODE; DBMS_OUTPUT.PUT_LINE('Kod bledu: ' z_kodbledu);

47 4. Mamy zaprojektowac wyzwalacz DML na poziomie wiersza, ktory bedzie uniemozliwial wprowadzenie daty zwolnienia osoby wczesniejszej niz niz data zwolnienia. Ma wyswietlac odpowiedni komunikat. CREATE OR REPLACE TRIGGER w_blokujzledatyzatrudnienia BEFORE INSERT ON zatrudnienia FOR EACH ROW IF :new.do IS NOT NULL AND :new.od > :new.do THEN RAISE_APPLICATION_ERROR(-20000,'Data zatrudnienia pozniejsza, niz data zwolnienia'); END IF;

48 Ćwiczenia 12 wyzwalacze, ciąg dalszy 1. Zaprojektowac trigger DML, ktory bedzie blokowal wprowadzenie operacja INSERT lub UPDATE nazwy wydzialu, ktora juz uprzednio zostala pisana do tabeli wydzialy. CREATE OR REPLACE PACKAGE p_blokowanywydz AS z_nazwa wydzialy.nazwa%type; END p_blokowanywydz; / CREATE OR REPLACE TRIGGER w_blokujwydz1 BEFORE INSERT OR UPDATE ON wydzialy FOR EACH ROW p_blokowanywydz.z_nazwa := :new.nazwa; / CREATE OR REPLACE TRIGGER w_blokujwydz2 AFTER INSERT OR UPDATE ON wydzialy z_nazwa wydzialy.nazwa%type; SELECT nazwa INTO z_nazwa FROM wydzialy WHERE nazwa = p_blokowanywydz.z_nazwa; EXCEPTION WHEN TOO_MANY_ROWS THEN RAISE_APPLICATION_ERROR(-20000,'Wprowadzana nazwa wydzialu juz istnieje!'); / -- sprawdzenie INSERT INTO wydzialy VALUES (4,'prawo',2);

PL/SQL. Ćwicznia 2. Ćwiczenia 3

PL/SQL. Ćwicznia 2. Ćwiczenia 3 PL/SQL Ćwicznia 2 4. Napisać kod bloku animowanego w PL/SQL, za pomocą którego z tabeli osoby będzie można wybrać osobę o określonym nazwisku i imieniu, przy czym nazwisko i imię tej osoby jest podane

Bardziej szczegółowo

PODSTAWY BAZ DANYCH 13. PL/SQL

PODSTAWY BAZ DANYCH 13. PL/SQL PODSTAWY BAZ DANYCH 13. PL/SQL 1 Wprowadzenie do języka PL/SQL Język PL/SQL - rozszerzenie SQL o elementy programowania proceduralnego. Możliwość wykorzystywania: zmiennych i stałych, instrukcji sterujących

Bardziej szczegółowo

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Cheatsheet PL/SQL Andrzej Klusiewicz  1/9 Declare y integer; z varchar2(50); d date; null; Declare x integer:=10; null; x integer; x:=10; dbms_output.put_line('hello world'); for x in 1..10 loop Deklaracja 4 zmiennych. Jednej typu rzeczywistego,

Bardziej szczegółowo

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu Procedury składowane Kolejnym typem programu języka PL/SQL są procedury składowane. Procedury mogą posiadać parametry typu IN, OUT lub IN OUT. Umożliwiają wykonanie operacji na danych w bazie, mogą też

Bardziej szczegółowo

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ]; Braki w SQL obsługi zdarzeń i sytuacji wyjątkowych funkcji i procedur użytkownika definiowania złożonych ograniczeń integralnościowych Proceduralny SQL Transact- SQL używany przez Microsoft SQL Server

Bardziej szczegółowo

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne Materiały dostępne są na stronie: Materiały Technologie baz danych aragorn.pb.bialystok.pl/~gkret Wykład 5: Kursory jawne. Podprogramy. Małgorzata Krętowska Wydział Informatyki Politechnika Białostocka

Bardziej szczegółowo

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa) Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski Uniwersytet Kardynała Stefana Wyszyńskiego, Warszawa dwunasty PL/SQL, c.d. 1 / 37 SQL to za mało SQL brakuje możliwości dostępnych w językach proceduralnych.

Bardziej szczegółowo

PL/SQL. Zaawansowane tematy PL/SQL

PL/SQL. Zaawansowane tematy PL/SQL PL/SQL Zaawansowane tematy PL/SQL Cele Poznanie złożonych i referencyjnych typów danych Poznanie konstrukcji kursora Poznanie kodu składowanego Poznanie procedur i funkcji 2 Złożone typy danych RECORD

Bardziej szczegółowo

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze Cechy bloków nazwanych: w postaci skompilowanej trwale przechowywane na serwerze wraz z danymi wykonywane na żądanie użytkownika lub w

Bardziej szczegółowo

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych Plan wykładu BAZY DANYCH II WYKŁAD 3 Zasięg zmiennych Zmienne powiązane Instrukcje warunkowe Pętle Pobieranie danych SQL w PL/SQL Rekordy dr inż. Agnieszka Bołtuć Zasięg zmiennych Zmienna jest dostępna

Bardziej szczegółowo

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń PL/SQL Zaawansowane tematy PL/SQL Piotr Medoń Cele Omówienie transakcji bazodanowych Omówienie obsługi wyjątków Zarządzanie perspektywami Tworzenie i usuwanie sekwencji Budowa wyzwalaczy 2 Transakcje bazodanowe

Bardziej szczegółowo

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1 Procedury wyzwalane procedury wyzwalane, cel stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przykłady zastosowania, zarządzanie wyzwalaczami 1 Procedury wyzwalane

Bardziej szczegółowo

Zaawansowane bazy danych i hurtownie danych semestr I

Zaawansowane bazy danych i hurtownie danych semestr I Podprogramy Wydział Informatyki Politechnika Białostocka Zaawansowane bazy danych i hurtownie danych semestr I Procedury do przeprowadzenia akcji Funkcje do obliczania wartości Pakiety do zbierania logicznie

Bardziej szczegółowo

Procedury i funkcje składowane

Procedury i funkcje składowane Procedury i funkcje składowane Zmienne podstawienia i zmienne wiązane, podprogramy, procedury składowane, typy argumentów, wywoływanie procedur, funkcje składowane, poziomy czystości funkcji, funkcje tablicowe

Bardziej szczegółowo

Język PL/SQL Procedury i funkcje składowane

Język PL/SQL Procedury i funkcje składowane Język PL/SQL Procedury i funkcje składowane Podprogramy, procedury i funkcje składowane, typy argumentów, wywoływanie procedur i funkcji, poziomy czystości funkcji 1 Podprogramy Procedury (wykonują określone

Bardziej szczegółowo

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL Plan wykładu Uzupełnienie projektu fizycznego Czym jest PL/SQL Bloki w PL/SQL Zmienne i stałe Instrukcje sterujące Wykorzystanie SQL w PL/SQL Kursory Wyjątki Projekt fizyczny bazy danych Braki projektu

Bardziej szczegółowo

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze 1 Funkcje i procedury pamiętane Następujące polecenie tworzy zestawienie zawierające informację o tym ilu jest na naszej hipotetycznej

Bardziej szczegółowo

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL; Kursory Każde zapytanie SQL umieszczone w programie PLSQL jest wykonywane w tzw. obszarze roboczym lub inaczej obszarze kontekstu. PLSQL wykorzystuje ten obszar do przechowywania danych otrzymanych w wyniku

Bardziej szczegółowo

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone Plan wykładu Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone BAZY DANYCH II WYKŁAD 5 dr inż. Agnieszka Bołtuć Kolekcje Tablice asocjacyjne Używane w celu gromadzenia danych tego samego typu, Rekordy

Bardziej szczegółowo

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki. Pakiety Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki. Pakiet składa się ze: specyfikacji (interfejsu) i ciała (implementacji). W specyfikacji mieszczą

Bardziej szczegółowo

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu. Plan wykładu Spis treści 1 Dynamiczny SQL 1 2 Wyzwalacze 2 3 Podsumowanie 9 4 Źródła 9 1 Dynamiczny SQL Dynamiczny SQL Dynamiczny SQL - technika programowania umożliwiająca generowanie instrukcji SQL dynamicznie

Bardziej szczegółowo

Deklarowanie kursora

Deklarowanie kursora Kursory i wyjątki Kursory i praca z kursorami, kursory jawne i niejawne, otwieranie kursora, pobieranie z kursora, zamykanie kursora, wyjątki systemowe i użytkownika, zgłaszanie i obsługa wyjątków 1 Kursor

Bardziej szczegółowo

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL, Mój projekt przedstawia bazę danych noclegów składającą się z 10 tabel. W projekcie wykorzystuje program LibreOffice Base do połączenia psql z graficznym interfejsem ( kilka formularzy przedstawiających

Bardziej szczegółowo

Październik 2015. Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Październik 2015. Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż. 1/40 Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Październik 2015 2/40 Plan wykładu Uzupełnienie projektu fizycznego Czym jest PL/SQL Bloki w PL/SQL Wykorzystanie 3/40 Projekt

Bardziej szczegółowo

Bloki anonimowe w PL/SQL

Bloki anonimowe w PL/SQL Język PL/SQL PL/SQL to specjalny język proceduralny stosowany w bazach danych Oracle. Język ten stanowi rozszerzenie SQL o szereg instrukcji, znanych w proceduralnych językach programowania. Umożliwia

Bardziej szczegółowo

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1 Kursory i wyjątki Kursory i praca z kursorami, kursory jawne i niejawne, otwieranie kursora, pobieranie z kursora, zamykanie kursora, wyjątki systemowe i użytkownika, zgłaszanie i obsługa wyjątków 1 Kursor

Bardziej szczegółowo

Indeksy. Indeks typu B drzewo

Indeksy. Indeks typu B drzewo Indeksy dodatkowe struktury służące przyśpieszeniu dostępu do danych o użyciu indeksu podczas realizacji poleceń decyduje SZBD niektóre systemy bazodanowe automatycznie tworzą indeksy dla kolumn o wartościach

Bardziej szczegółowo

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia Składowe wyzwalacza ( ECA ): określenie zdarzenia ( Event ) określenie

Bardziej szczegółowo

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów SQL3 wprowadza następujące kolekcje: zbiory ( SETS ) - zestaw elementów bez powtórzeń, kolejność nieistotna listy ( LISTS ) - zestaw

Bardziej szczegółowo

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków. Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków. 1 Komunikaty o błędach serwera Oracle Wykonanie niepoprawnej operacji w trakcie działania

Bardziej szczegółowo

Bazy danych, 4. wiczenia

Bazy danych, 4. wiczenia Bazy danych, 4. wiczenia 2007-10-23 1 Plan zaj PL/SQL, cz ± II: tabele kursory sªu» ce do zmiany danych, procedury, funkcje, pakiety, wyzwalacze. 2 Tabele Deklaracja TYPE t_tab IS TABLE OF VARCHAR(20)

Bardziej szczegółowo

BAZA DANYCH SIECI HOTELI

BAZA DANYCH SIECI HOTELI Paulina Gogół s241906 BAZA DANYCH SIECI HOTELI Baza jest częścią systemu zarządzającego pewną siecią hoteli. Składa się z tabeli powiązanych ze sobą różnymi relacjami. Służy ona lepszemu zorganizowaniu

Bardziej szczegółowo

BAZY DANYCH W APLIKACJACH SIECIOWYCH

BAZY DANYCH W APLIKACJACH SIECIOWYCH BAZY DANYCH W APLIKACJACH SIECIOWYCH Wykład 4 Wyjątki. Wyzwalacze bazodanowe. (Wybrane materiały) Dr inż. E. Busłowska Obsługa wyjątków w PLSQL Wyjątek (ang. Exception) - błąd lub ostrzeżenie w PLSQL Typy

Bardziej szczegółowo

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL Pakiety podprogramów, specyfikacja i ciało pakietu, zmienne i kursory pakietowe, pseudoinstrukcje (dyrektywy kompilatora), dynamiczny SQL.

Bardziej szczegółowo

DECLARE VARIABLE zmienna1 typ danych; BEGIN

DECLARE VARIABLE zmienna1 typ danych; BEGIN Procedury zapamiętane w Interbase - samodzielne programy napisane w specjalnym języku (właściwym dla serwera baz danych Interbase), który umożliwia tworzenie zapytań, pętli, instrukcji warunkowych itp.;

Bardziej szczegółowo

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków... Plan wykładu Spis treści 1 Kursory 1 2 Wyjątki 4 2.1 Wyjątki predefiniowane............................. 4 2.2 Wyjątki niezdefiniowane wcześniej....................... 5 2.3 Definiowanie własnych wyjątków........................

Bardziej szczegółowo

Bloki anonimowe w PL/SQL

Bloki anonimowe w PL/SQL Język PL/SQL PL/SQL to specjalny język proceduralny stosowany w bazach danych Oracle. Język ten stanowi rozszerzenie SQL o szereg instrukcji, znanych w proceduralnych językach programowania. Umożliwia

Bardziej szczegółowo

15. Funkcje i procedury składowane PL/SQL

15. Funkcje i procedury składowane PL/SQL 15. Funkcje i procedury składowane PLSQL 15.1. SQL i PLSQL (Structured Query Language - SQL) Język zapytań strukturalnych SQL jest zbiorem poleceń, za pomocą których programy i uŝytkownicy uzyskują dostęp

Bardziej szczegółowo

Pakiety podprogramów Dynamiczny SQL

Pakiety podprogramów Dynamiczny SQL Pakiety podprogramów Dynamiczny SQL Pakiety podprogramów, specyfikacja i ciało pakietu, zmienne i kursory pakietowe, pseudoinstrukcje (dyrektywy kompilatora), dynamiczny SQL 1 Pakiety Pakiet (ang. package)

Bardziej szczegółowo

SQL :: Data Definition Language

SQL :: Data Definition Language SQL :: Data Definition Language 1. Zaproponuj wydajną strukturę danych tabela) do przechowywania macierzy o dowolnych wymiarach w bazie danych. Propozycja struktury powinna zostać zapisana z wykorzystaniem

Bardziej szczegółowo

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok; Temat: Funkcje, procedury i wyzwalacze. Oprócz tabel i widoków w bazach danych możemy tworzyć własne funkcje, procedury i specjalny typ procedur, które będą automatycznie wywoływanie przez MySQL w memencie

Bardziej szczegółowo

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika Programowanie w SQL procedury i funkcje UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika 1. Funkcje o wartościach skalarnych ang. scalar valued

Bardziej szczegółowo

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Obiektowe bazy danych Ćwiczenia laboratoryjne (?) Obiektowe bazy danych Ćwiczenia laboratoryjne (?) Tworzenie typów obiektowych 1. Zdefiniuj typ obiektowy reprezentujący SAMOCHODY. Każdy samochód powinien mieć markę, model, liczbę kilometrów oraz datę

Bardziej szczegółowo

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle Rozszerzenie obiektowe w SZBD Oracle Cześć 2. Kolekcje Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Malinowski Nowak Kowalski tablica zagnieżdżona (ang.

Bardziej szczegółowo

1. ELEMENTY JĘZYKA PL/SQL

1. ELEMENTY JĘZYKA PL/SQL 1. ELEMENTY JĘZYKA PL/SQL Aplikacje korzystające z PL/SQL będącego proceduralnym rozszerzeniem SQL mogą wykonywać procedury i funkcje języka PL/SQL składowane w bazie danych oraz wysyłać własne programy

Bardziej szczegółowo

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Język PL/SQL. Rozdział 6. Procedury wyzwalane Język PL/SQL. Rozdział 6. Procedury wyzwalane Procedury wyzwalane, cele stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przykłady zastosowania, zarządzanie

Bardziej szczegółowo

Hurtownia Świętego Mikołaja projekt bazy danych

Hurtownia Świętego Mikołaja projekt bazy danych Aleksandra Kobusińska nr indeksu: 218366 Hurtownia Świętego Mikołaja projekt bazy danych Zaprezentowana poniżej baza jest częścią większego projektu bazy danych wykorzystywanej w krajowych oddziałach wiosek

Bardziej szczegółowo

Język SQL, zajęcia nr 1

Język SQL, zajęcia nr 1 Język SQL, zajęcia nr 1 SQL - Structured Query Language Strukturalny język zapytań Login: student Hasło: stmeil14 Baza danych: st https://194.29.155.15/phpmyadmin/index.php Andrzej Grzebielec Najpopularniejsze

Bardziej szczegółowo

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Laboratorium nr 4. Temat: SQL część II. Polecenia DML Laboratorium nr 4 Temat: SQL część II Polecenia DML DML DML (Data Manipulation Language) słuŝy do wykonywania operacji na danych do ich umieszczania w bazie, kasowania, przeglądania, zmiany. NajwaŜniejsze

Bardziej szczegółowo

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10 Plan wykładu Spis treści 1 Wprowadzenie do bloków nazwanych 1 2 Parametry 2 3 Procedury i funkcje 3 4 Pakiety 6 5 Podsumowanie 10 6 Źródła 10 1 Wprowadzenie do bloków nazwanych Rodzaje bloków w PL/SQL

Bardziej szczegółowo

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Wyzwalacze. Anna Fiedorowicz Bazy danych 2 Wyzwalacze Wyzwalacze są specjalnymi procedurami składowanymi, uruchamianymi automatycznie w następstwie zaistnienia określonego typu zdarzenia. Ich główne zadanie polega na wymuszaniu integralności danych

Bardziej szczegółowo

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście. Rodzaje triggerów Triggery DML na tabelach INSERT, UPDATE, DELETE Triggery na widokach INSTEAD OF Triggery DDL CREATE, ALTER, DROP Triggery na bazie danych SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN

Bardziej szczegółowo

SQL 4 Structured Query Lenguage

SQL 4 Structured Query Lenguage Wykład 5 SQL 4 Structured Query Lenguage Instrukcje sterowania danymi Bazy Danych - A. Dawid 2011 1 CREATE USER Tworzy nowego użytkownika Składnia CREATE USER specyfikacja użytkownika [, specyfikacja użytkownika]...

Bardziej szczegółowo

Projekt-bazy danych Poczta

Projekt-bazy danych Poczta Autorzy: Aleksandra Bąk numer indeksu: 233142 Maksym Leś numer indeksu: 233283 Projekt-bazy danych Poczta 1.Opis Nasz projekt dotyczy poczty. Nasza baza danych zawiera informacje odnośnie: listów przechodzących

Bardziej szczegółowo

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u będziemy używać w taki sam sposób, jak wbudowanych funkcji

Bardziej szczegółowo

Technologie baz danych WYKŁAD 7: Wyjątki

Technologie baz danych WYKŁAD 7: Wyjątki Wydział Informatyki Politechnika Białostocka Obsługa wyjątków Technologie baz danych WYKŁAD 7: Wyjątki [] [] Agnieszka Oniśko, Małgorzata Krętowska TBD-wyjątki 1 TBD-wyjątki 2 Sposoby powstania sytuacji

Bardziej szczegółowo

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba. Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 2 Kusory Wprowadzenie Kursory użytkownika Kursory domyślne Zmienne kursora Wyrażenia kursora - 2 - Wprowadzenie Co to jest kursor?

Bardziej szczegółowo

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: Grupa A (LATARNIE) Imię i nazwisko: Numer albumu: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: Nazwisko prowadzącego: 11: 12: Suma: Ocena: Zad. 1 (10 pkt) Dana jest relacja T. Podaj wynik poniższego zapytania (podaj

Bardziej szczegółowo

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image) Elementy języka T-SQL 40. Polecenie PRINT jest wykorzystywane do przekazania wiadomości tekstowej (maksymalna długość 8000 znaków) Przykład PRINT 'Aktualna data: '+convert(char(8),getdate()) PRINT 'Aktualny

Bardziej szczegółowo

Język PL/SQL. Rozdział 2. Kursory

Język PL/SQL. Rozdział 2. Kursory Język PL/SQL. Rozdział 2. Kursory Deklarowanie kursora, otwieranie kursora, pobieranie z kursora, zamykanie kursora, zmienne kursorowe, wyrażenie CURSOR, kursory niejawne. 1 Kursor jawny Każde zapytanie

Bardziej szczegółowo

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz Wyzwalacze Wyzwalacze są specjalnymi procedurami składowanymi, uruchamianymi automatycznie w następstwie zaistnienia określonego typu zdarzenia. Ich główne zadanie polega na wymuszaniu integralności danych

Bardziej szczegółowo

Tabele wykorzystywane w przykładach

Tabele wykorzystywane w przykładach Tabele wykorzystywane w przykładach create table departamenty( dep_id serial primary key, nazwa_departamentu text ); Tabele używane w wybranych przkładach create table pracownicy ( emp_id serial primary

Bardziej szczegółowo

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe -- Definicje relacji i utworzenie stanu początkowego dla ćwiczeń z synchronizacji transakcji DROP TABLE Konta cascade constraints; DROP TABLE

Bardziej szczegółowo

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko Typy rozproszonych baz Systemy typu klient-serwer (jeden serwer) Jednorodna rozproszona baza (kilka serwerow, jeden system zarzadzania baza ) Niejednorodna

Bardziej szczegółowo

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2) Kursor jawny Każde zapytanie SQL umieszczone w programie PL/SQL może zwrócić zero, jedną bądź wiele krotek. Aby efektywnie przetworzyć krotkizwrócone przez zapytanie korzystamy z kursorów. Kursor jest

Bardziej szczegółowo

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe. Wprowadzenie do języka PL/SQL Język PL/SQL Wprowadzenie Język PL/SQL to rozszerzenie SQL o elementy programowania proceduralnego i obiektowego. PL/SQL umożliwia wykorzystanie: zmiennych i stałych struktur

Bardziej szczegółowo

PL/SQL. Lidia Małkiewicz i Cezary Skubała

PL/SQL. Lidia Małkiewicz i Cezary Skubała PL/SQL Lidia Małkiewicz i Cezary Skubała Jest językiem trzeciej generacji (3GL), który udostępnia konstrukty programistyczne, włączając w to deklaracje zmiennych, pętlę, obsługę błędów itd. Obecnie PL/SQL

Bardziej szczegółowo

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML Procedury wyzwalane Rozdział 13 Procedury wyzwalane procedury wyzwalane, cel stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przykłady zastosowania, zarządzanie

Bardziej szczegółowo

Wyzwalacze (triggery) Przykład

Wyzwalacze (triggery) Przykład Wyzwalacze (triggery) Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie. W poniższym przykładzie definiujemy tablicę, a następnie trigger związany

Bardziej szczegółowo

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Podstawy języka SQL. SQL Structured Query Languagestrukturalny Podstawy języka SQL SQL Structured Query Languagestrukturalny język zapytań DDL Język definicji danych (np. tworzenie tabel) DML Język manipulacji danych (np. tworzenie zapytań) DCL Język kontroli danych

Bardziej szczegółowo

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba. Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 3 Rekordy Tabele indeksowe asocjacyjne - 2 - Rekordy Co to jest rekord? Rodzaje rekordów Rekordy użytkownika Rekordy tabelowe Rekordy

Bardziej szczegółowo

1. Wyzwalacze BD (ang. triggers)

1. Wyzwalacze BD (ang. triggers) 1. Wyzwalacze BD (ang. triggers) Wyzwalacz bazy danych jest procedurą składowaną w bazie powiązaną z jedną konkretną tablicą. Z pojedynczą tablicą może być związane wiele wyzwalaczy, natomiast pojedynczy

Bardziej szczegółowo

Oracle PL/SQL. Paweł Rajba. pawel@ii.uni.wroc.pl http://www.kursy24.eu/

Oracle PL/SQL. Paweł Rajba. pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 6 Wprowadzenie Definiowanie wyzwalaczy DML Metadane wyzwalaczy Inne zagadnienia, tabele mutujące Wyzwalacze INSTEAD OF Wyzwalacze

Bardziej szczegółowo

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3 cur.executescript(""" DROP TABLE IF EXISTS uczen; CREATE TABLE IF NOT EXISTS uczen ( Uniwersytet Technologiczno-Przyrodniczy im. J.J. Śniadeckich w Bydgoszczy Instrukcja do ćwiczeń laboratoryjnych Przedmiot

Bardziej szczegółowo

Struktura bazy danych

Struktura bazy danych Procedury składowane, funkcje i wyzwalacze Struktura bazy danych Tabela Oddziały ID Nazwa Adres 10 POZNAN Kwiatowa 3 20 WARSZAWA al. Jerozolimskie 22 30 KRAKOW Planty 14 40 WROCLAW Nad Odra 16 50 GDANSK

Bardziej szczegółowo

Wykład 05 Bazy danych

Wykład 05 Bazy danych Wykład 05 Bazy danych Tabela składa się z: Kolumn Wierszy Wartości Nazwa Wartości Opis INT [UNSIGNED] -2^31..2^31-1 lub 0..2^32-1 Zwykłe liczby całkowite VARCHAR(n) n = długość [1-255] Łańcuch znaków o

Bardziej szczegółowo

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego Oracle Developer Suite Budowa aplikacji użytkownika końcowego Składniki pakietu Oracle Developer Suite Oracle Forms Builder formularze (aplikacje dostępne z poziomu przeglądarki internetowej, model 3-warstwowy)

Bardziej szczegółowo

Plan wykładu BAZY DANYCH II WYKŁAD 9. Dynamiczny SQL. Dynamiczny SQL 2012-01-20

Plan wykładu BAZY DANYCH II WYKŁAD 9. Dynamiczny SQL. Dynamiczny SQL 2012-01-20 Plan wykładu BAZY DANYCH II WYKŁAD 9 Dynamiczny SQL, NDS, EXECUTE IMMEDIATE, Pakiet DBMS_SQL, Obiekty w PL/SQL, Tworzenie, wywoływanie, dziedziczenie, etc. dr inż. Agnieszka Bołtuć Dynamiczny SQL Pozwala

Bardziej szczegółowo

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba. Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 5 Wprowadzenie Tworzenie i wykonywanie procedur i funkcji Instrukcja RETURN Parametry procedur i funkcji oraz ich przesyłanie Metadane

Bardziej szczegółowo

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba. Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 8 Wprowadzenie Definiowanie typu obiektowego Porównywanie obiektów Tabele z obiektami Operacje DML na obiektach Dziedziczenie -

Bardziej szczegółowo

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH Plan wykładu 2 TWORZENIE APLIKACJI BAZODANOWYCH Wykład 2: Wprowadzenie do PL/SQL: bloki anonimowe, zmienne, kursory Wprowadzenie do PL/SQL Bloki Podstawowe składowe języka Zmienne i stałe Kursory Małgorzata

Bardziej szczegółowo

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze Funkcje użytkownika Tworzenie funkcji Usuwanie funkcji Procedury składowane Tworzenie procedur składowanych Usuwanie procedur składowanych Wyzwalacze Wyzwalacze a ograniczenia i procedury składowane Tworzenie

Bardziej szczegółowo

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze Ćwiczenie 13 PL/SQL Język PL/SQL procedury, funkcje, pakiety, wyzwalacze Ćwiczenie 13 PL/SQL Niniejsze ćwiczenie zaprezentuje składowane w bazie danych programy PL/SQL: procedury, funkcje, pakiety oraz

Bardziej szczegółowo

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych SQL SQL (ang. Structured Query Language): strukturalny język zapytań używany do tworzenia strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych

Bardziej szczegółowo

Relacyjne bazy danych. Podstawy SQL

Relacyjne bazy danych. Podstawy SQL Relacyjne bazy danych Podstawy SQL Język SQL SQL (Structured Query Language) język umożliwiający dostęp i przetwarzanie danych w bazie danych na poziomie obiektów modelu relacyjnego tj. tabel i perspektyw.

Bardziej szczegółowo

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL. Prezentacja Danych i Multimedia II r Socjologia Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL. Celem ćwiczeń jest poznanie zasad tworzenia baz danych i zastosowania komend SQL. Ćwiczenie I. Logowanie

Bardziej szczegółowo

Wyzwalacze TWORZENIE WYZWALACZY

Wyzwalacze TWORZENIE WYZWALACZY Wyzwalacze: podobnie jak procedury i funkcje, są nazwanymi blokami PL/SQL zawierającymi sekcje deklaracji, wykonania i obsługi wyjątków; nie akceptują argumentów; muszą być składowane jako samodzielne

Bardziej szczegółowo

Wykład 8. SQL praca z tabelami 5

Wykład 8. SQL praca z tabelami 5 Wykład 8 SQL praca z tabelami 5 Podzapytania to mechanizm pozwalający wykorzystywać wyniki jednego zapytania w innym zapytaniu. Nazywane często zapytaniami zagnieżdżonymi. Są stosowane z zapytaniami typu

Bardziej szczegółowo

PL/SQL. Zaawansowane tematy PL/SQL

PL/SQL. Zaawansowane tematy PL/SQL PL/SQL Zaawansowane tematy PL/SQL Cele Przypomnienie kursorów Przypomnienie procedur i funkcji składowanych Poznanie pakietów składowanych 2 Bazę danych Oracle możemy traktować jakby była złożona z dwóch

Bardziej szczegółowo

Język PL/SQL Wprowadzenie

Język PL/SQL Wprowadzenie Język PL/SQL Wprowadzenie Koncepcja języka, zmienne i stałe, typy zmiennych, nadawanie wartości zmiennym, instrukcje warunkowe, pętle, sterowanie przebiegiem programu 1 Wprowadzenie do języka PL/SQL Język

Bardziej szczegółowo

Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora

Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora Kursor Rozdział 10a Kursory Kursory i praca z kursorami, kursory jawne i niejawne, otwieranie kursora, pobieranie z kursora, zamykanie kursora, zmienne kursorowe, wyrażenie CURSOR Każde zapytanie SQL umieszczone

Bardziej szczegółowo

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8 Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8 Bazowy skrypt PHP do ćwiczeń z bazą MySQL: Utwórz skrypt o nazwie cw7.php zawierający następującą treść (uzupełniając go o właściwą nazwę uŝytkownika

Bardziej szczegółowo

SQL (ang. Structured Query Language)

SQL (ang. Structured Query Language) SQL (ang. Structured Query Language) SELECT pobranie danych z bazy, INSERT umieszczenie danych w bazie, UPDATE zmiana danych, DELETE usunięcie danych z bazy. Rozkaz INSERT Rozkaz insert dodaje nowe wiersze

Bardziej szczegółowo

Grupowanie i funkcje agregujące

Grupowanie i funkcje agregujące Grupowanie i funkcje agregujące Zadanie 1. Stwórz odpowiednią tabelę Test_agr i wprowadź odpowiednie rekordy tak, aby wynik zapytania SELECT AVG(kol) avg_all, AVG(DISTINCT kol) avg_dist, COUNT(*) count_gw,

Bardziej szczegółowo

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ semestr letni 2005/06 I. Procedury składowane (stored procedures) Procedury składowane stanowia

Bardziej szczegółowo

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678'); polecenie UPDATE służy do aktualizacji zawartości wierszy tabel lub perspektyw składnia: UPDATE { } SET { { = DEFAULT NULL}, {

Bardziej szczegółowo

Obiektowe bazy danych

Obiektowe bazy danych Obiektowe bazy danych 1 Plan rozdziału 2 Wprowadzenie obiektowy model danych Obiekty w bazie danych definiowanie i przechowywanie składowe i metody konstruktory referencje dziedziczenie i polimorfizm Kolekcje

Bardziej szczegółowo

Wykład 5. SQL praca z tabelami 2

Wykład 5. SQL praca z tabelami 2 Wykład 5 SQL praca z tabelami 2 Wypełnianie tabel danymi Tabele można wypełniać poprzez standardową instrukcję INSERT INTO: INSERT [INTO] nazwa_tabeli [(kolumna1, kolumna2,, kolumnan)] VALUES (wartosc1,

Bardziej szczegółowo

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z Tworzenie tabeli Np. create table nazwa_tab( \\stworzenie tabeli Id numer(4) constraint PRAC_PK primary key, \\ustawiamy klucz podst. Nazwisko varchar2(30), \\typ tekstowy 30 znaków Kwota number(10,2)

Bardziej szczegółowo

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE, Programowanie w SQL definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE, kontynuacja działania od instrukcji za podaną etykietą GOTO etykieta, wyjście bezwarunkowe

Bardziej szczegółowo