56
ZSBD PL/SQL Wykład 3 Prowadzący: dr Paweł Drozda

Zsbd PL/SQL

  • Upload
    valmai

  • View
    54

  • Download
    1

Embed Size (px)

DESCRIPTION

Zsbd PL/SQL. Wykład 3 Prowadzący: dr Paweł Drozda. Program wykładu. Wprowadzenie do PL\SQL Zmienne Typy danych Bloki, podbloki Funkcje SQL w PL/SQL Instrukcje warunkowe, pętle Złożone typy danych Rekordy Tabele Kursory. Co to jest PL/SQL i po co?. - PowerPoint PPT Presentation

Citation preview

Page 1: Zsbd PL/SQL

ZSBDPL/SQL

Wykład 3

Prowadzący: dr Paweł Drozda

Page 2: Zsbd PL/SQL

Program wykładu

dr P. Drozda

Wprowadzenie do PL\SQL Zmienne Typy danych Bloki, podbloki Funkcje SQL w PL/SQL Instrukcje warunkowe, pętle Złożone typy danych

Rekordy Tabele Kursory

Page 3: Zsbd PL/SQL

Co to jest PL/SQL i po co?

dr P. Drozda

Rozszerzenie SQL-a do języka proceduralnego

Standardowy język Oracle dostępu do danych w relacyjnych bazach

Ułatwia wykonywanie powtarzających się operacji jak również operacji opartych o określone warunkinp. jeśli chcemy dać podwyżkę zależną od działu w którym pracownik jest zatrudniony

Page 4: Zsbd PL/SQL

Podstawowe elementy PL/SQL

dr P. Drozda

Kod zorganizowany w wykonywalne bloki Zawiera elementy języka

proceduralnego: Zmienne, stałe typy danych Instrukcje warunkowe, pętle Bloki danych używanie wiele razy –

procedury, funkcje, pakiety Obsługa wyjątków

Page 5: Zsbd PL/SQL

Zalety PL/SQL

dr P. Drozda

Integracja elementów proceduralnych z SQL-em

Zwiększona wydajność Możliwość podziału kodu na moduły Integracja z narzędziami Oracle Obsługa wyjątków

Page 6: Zsbd PL/SQL

Struktura bloku

dr P. Drozda

DECLARE (opcja)– deklaracja zmiennych

BEGIN (konieczne) – zawiera instrukcje SQL i PL/SQL

EXCEPTION (opcja) – działania gdy pojawią się błędy

END; (konieczne) – kończy blok

DECLARE…

BEGIN…

EXCEPTION…

END;

Page 7: Zsbd PL/SQL

Typy bloków

dr P. Drozda

Anonimowy Procedura Funkcja

[DECLARE]

BEGINInstrukcje SQL i PL/SQL

[EXCEPTION]

END;

FUNCTION nameRETURN datatypeIS

BEGINInstrukcje SQL i PL/SQL

[EXCEPTION]

END;

PROCEDURE nameIS

BEGINInstrukcje SQL i PL/SQL

[EXCEPTION]

END;

Page 8: Zsbd PL/SQL

Przykład

dr P. Drozda

DECLARE name VARCHAR(30);

BEGINSELECT last_name INTO name FROM employeesWHERE employee_id = 111;DBMS_OUTPUT.PUT_LINE(‘Nazwisko

dla numeru 111 ’ || name);END;

Page 9: Zsbd PL/SQL

Zmienne w PL/SQL

dr P. Drozda

Zaczynają się od litery Mogą zawierać cyfry oraz $,_ i # Maksymalnie 30 znaków Niedozwolone słowa kluczowe Przykład deklaracji:

DECLAREdata DATE;numer NUMBER NOT NULL :=10;miasto VARCHAR2(20):=‘Olsztyn’;ilosc CONSTANT NUMBER:=100;

Page 10: Zsbd PL/SQL

Deklaracja zmiennych z %TYPE

dr P. Drozda

Jeśli zmienna odnosi się do zmiennej wcześniej zadeklarowanej lub do kolumny z tabeli

Zmienna z atrybutem %TYPE przyjmuje typ danych odnośnika

Ułatwienie uniknięcia błędnego typu danych Gdy zmienia się typ kolumny – zmiana typu

zmiennej Przykład

DECLAREname employees.last_name%TYPE;sal NUMBER(5,2);addition sal%TYPE :=100;

Page 11: Zsbd PL/SQL

Typy danych – obiekty

dr P. Drozda

CLOB – duże ilości tekstu BLOB – duże obiekty binarne. Dane nie

są interpretowane w bazie danych BFILE – pliki zawierające dane binarne.

Nie są składowane w bazie – w bazie tylko wskazane miejsce, gdzie dany plik się znajduje

NCLOB – zawiera obiekty opisujące znaki w różnych językach

Page 12: Zsbd PL/SQL

Konwersja typów danych (1)

dr P. Drozda

Ukryta – gdy operacja łączy ze sobą różne typy danychPrzykładDECLARENumer number(5) :=200;Inny VARCHAR2(10) :=‘200’;Razem Numer%TYPE;BEGINRazem := Numer + Inny;End;

Powyższa konwersja stosowana pomiędzy: Znakami i datami Numerami i znakami

Page 13: Zsbd PL/SQL

Konwersja typów danych (2)

dr P. Drozda

Jawna – stosowane wbudowane funkcje TO_CHAR – przekształca do znaków TO_DATE – przekształca do daty TO_NUMBER – przekształca do liczby TO_TIMESTAMP – zmienia ciąg znaków do

typu timestamp

Page 14: Zsbd PL/SQL

Podbloki – widoczność zmiennych

dr P. Drozda

Gdy zmienne mają tę samą nazwę – widoczna zmienna z bloku wewnętrznego

Dostęp do zmiennej zewnętrznej – nadanie etykiety blokowi zewnętrznemu

Przykład:begin <<zew>>

DECLARE name varchar(20):=‘Tomasz'; BEGIN

DECLARE name varchar(20):=‘Michal';BEGINdbms_output.PUT_LINE(zew.name);END;

END;end zew;

Page 15: Zsbd PL/SQL

Przykładbegin <<zew>>

DECLARE

zarobki NUMBER(7,2):=4000;

dodatek NUMBER(7,2) := zarobki*0.2;

info VARCHAR2(40):=‘dostaje’;

BEGIN

DECLARE

zarobki NUMBER(7,2):=40000;

dodatek NUMBER(7,2) := 0;

wszystko NUMBER(7,2):=zarobki+dodatek;

BEGIN

(*)info := ‘Dyrektor nie’|| info;

zew.dodatek:=zarobki*0.3;

END;

(**) info:= ‘Administrator ’|| info;

END;

end zew;

Pytania: Wartość info z (*) Wartość wszystko z (**) Dodatek z (*) Zew.dodatek z (*) Dodatek z (**) Info z (**)

dr P. Drozda

Page 16: Zsbd PL/SQL

Operatory

Logiczne AND, OR, NOT

Arytmetyczne +,-,*,/

Łączenia ||

Problem NULL Porównanie

zawierające NULL zwraca zawsze NULL

Użycie NOT do NULL zwraca NULL

Gdy w warunku występuje NULL – przypisane operacje nie są wykonywane

dr P. Drozda

Page 17: Zsbd PL/SQL

Funkcje w PL/SQL

Brak możliwości użycia w poleceniach PL/SQL (DECODE, AVG, SUM, MIN, MAX, etc) salary = AVG(employees.salary); - niedozwolone

Mogą być użyte tylko w instrukcjach SQL osadzonych w PL/SQLSELECT AVG(salary) INTO sredniaFROM employeesWHERE department_id = 50;

Funkcje odnoszące się do jednego wiersza mogą być używane w PL\SQL (LENGTH, CURRENT_DATE, MONTHS_BETWEEN)

dr P. Drozda

Page 18: Zsbd PL/SQL

Konwencja kodowania

dr P. Drozda

SQL, PL/SQL, Typy zmiennych – wielkie litery Zmienne, stałe, nazwy kolumn, nazwy tabel – małe litery Stosowanie wcięć dla czytelności kodu Przykład:

DECLAREdept_no NUMBER(4);location_id NUMBER(4);

BEGINSELECT department_id,

location_idINTO dept_no , location_id FROM departmentsWHERE department_name = ‘Sales’;

END;

Page 19: Zsbd PL/SQL

Nazewnictwo zmiennych

dr P. Drozda

Co się stanie?DECLARE

department_nameVARCHAR2(20):=‘SALES’;BEGIN

DELETE FROM departmentsWHERE department_name = department_name;

END; Należy unikać nazywania zmiennych tak

samo jak nazwy kolumn – problemy w klauzuli WHERE

Po SELECT oraz INTO – nie ma problemu

Page 20: Zsbd PL/SQL

Polecenie SELECT w PL/SQL

dr P. Drozda

SkładniaSELECT kolumny INTO zmienne FROM tabela

[WHERE warunki]; Cechy:

Słowo INTO jest obowiązkowe Liczba i typy kolumn zgadzają się z liczbą i

typami zmiennych Otrzymane wyniki zapytania zapisywane są w

zmiennych Zapytanie musi zwrócić dokładnie jeden wiersz

Page 21: Zsbd PL/SQL

Przykład – polecenie SELECT

dr P. Drozda

DECLAREimie employees.first_name%TYPE;nazwisko employees.last_name%TYPE;

BEGINSELECT first_name, last_nameINTO imie, nazwiskoFROM employeesWHERE employee_id = 111;

END;

Page 22: Zsbd PL/SQL

DML w PL/SQL

dr P. Drozda

Polecenia DML odpowiadają dokładnie poleceniom SQL (INSERT, UPDATE, DELETE, MERGE)

PrzykładMERGE INTO zatrudnienie zUSING archiwum aON (z.id_prac = a.ident)WHEN MATCHED THEN SET

z.imie = a.imie;z.nazwisko = a.nazwisko;

WHEN NOT MATCHED THENINSERT VALUES (a.ident,a.imie, a.nazwisko);

Page 23: Zsbd PL/SQL

Instrukcje warunkowe – IF

dr P. Drozda

Składnia IF (podobnie jak wszędzie)IF warunek THEN instrukcja;[ELSEIF warunek THEN instrukcja;][ELSE instrukcja;]END IF;Przykład:

DECLAREsal NUMBER(4);premia NUMBER(4);

BEGIN IF sal > 5000 THEN premia = sal*0.1; ELSEIF sal > 3000 THEN premia= sal*0.2;

ELSE premia = sal*0.3;END IF;

END;

Page 24: Zsbd PL/SQL

Instrukcje warunkowe CASE

dr P. Drozda

SkładniaCASE pole

WHEN warunek1 THEN instrukcje1 [WHEN warunek2 THEN instrukcje2]

…[ELSE instrukcje]

END;Przykład

ocena_slownie = CASE ocenaWHEN 5 THEN ‘bardzo dobry’WHEN 4 THEN ‘dobry’WHEN 3 THEN ‘dostateczny’WHEN 2 THEN ‘niedostateczny’WHEN 1,0 THEN ‘osioł’ELSE ‘nie ma takiej oceny’

END;

Page 25: Zsbd PL/SQL

Inny przykład CASE

dr P. Drozda

CASE WHEN ocena = 5 THEN ‘ bardzo dobry’

…WHEN ocena IN (1,0) THEN ‘osioł’ELSE ‘nie ma takiej oceny’

END;

Page 26: Zsbd PL/SQL

Pętla LOOP

dr P. Drozda

Wykonuje się do póki warunek nie jest spełniony Składnia pętli

LOOPinstrukcje;…EXIT WHEN warunek;instrukcje;

END LOOP; Przykład

DECLARE suma NUMBER(4):=0;i NUMBER(3):=1;

LOOPsuma:=suma+i;EXIT WHEN suma >100;i:=i+1;

END LOOP;

Page 27: Zsbd PL/SQL

Pętla WHILE

dr P. Drozda

Składnia WHILEWHILE warunek LOOP

instrukcje;END LOOP;

Przykład:DECLARE

x NUMBER(4):=20;BEGINWHILE x>0 LOOP

x:=x-1;DBMS_OUTPUT.PUT_LINE(x);

END LOOP;END;

Page 28: Zsbd PL/SQL

Pętla FOR

dr P. Drozda

Składnia FORFOR licznik IN dolnagr..gornagr [REVERSE]LOOPInstrukcje;END LOOP;

Licznik nie musi być deklarowany Jeśli REVERSE licznik przechodzi od

górnej granicy do dolnej Granice FOR nie powinny być NULL

Page 29: Zsbd PL/SQL

FOR przykład

dr P. Drozda

DECLAREzarobki NUMBER(7):=2000;BEGIN

FOR i IN 1..10 LOOPzarobki :=zarobki + i*1000;INSERT INTO EMP VALUES (ident.nextval, ‘kozak’,zarobki);END LOOP;

END;

Page 30: Zsbd PL/SQL

Kontrola wykonywania pętli

dr P. Drozda

CONTINUE wymusza porzucenie obecnej iteracji w pętli

i rozpoczęcie nowej Może zwiększyć wydajność bloku

EXIT wymusza opuszczenie obecnej pętli i

przejście do kolejnej instrukcji Konieczne w podstawowej pętli LOOP

Page 31: Zsbd PL/SQL

CONTINUE, EXIT - przykład

dr P. Drozda

DECLAREi NUMBER(4):=0;suma NUMBER(10):=0;

BEGINWHILE TRUE LOOP

i:=i+1;IF MOD(i,2)=0 THEN CONTINUE;END IF;suma:=suma + i;IF i=10 THEN EXIT;END IF;

END LOOP;END;

Page 32: Zsbd PL/SQL

Złożone typy danych

dr P. Drozda

Rekordy %ROWTYPE Tabele INDEX BY Tabele nested tables Tabele VARRAY

Page 33: Zsbd PL/SQL

Rekordy

dr P. Drozda

Zawierają dane logicznie ze sobą powiązane np. wiersz bądź część wiersza tabeli

Mogą zawierać pola o różnych typach danych

Zapisują tylko jeden wiersz (np. z tabeli) Muszą mieć co najmniej jedno pole Składnia rekordu:

TYPE nazwa IS RECORD(definicjapole1, definicjapole2,…);

Page 34: Zsbd PL/SQL

Przykład definicji rekordu

dr P. Drozda

TYPE pracownik IS RECORD(imie VARCHAR(20),id NUMBER(5),nazwisko VARCHAR(20),zarobki employees.salary%TYPE,miejsce departments%ROWTYPE);

wystapienie pracownik;odwołanie do pola np.wystapienie.id – odwołanie do identyfikatora

Page 35: Zsbd PL/SQL

%ROWTYPE

dr P. Drozda

Odwołuje się do wszystkich kolumn jednej tabeli Przed %ROWTYPE należy dodać nazwę tabeli do

której ma odwoływać się zmienna Nazwy kolumn oraz typy danych w

poszczególnych kolumnach przekazane do zmiennej

Przy zmianie typów danych i nazw w tabeli – zmiana też w zmiennej z %ROWTYPE – nie trzeba pilnować typów

Deklaracja:nazwapola nazwatabeli%ROWTYPE;osoba employees%ROWTYPE;odwołanie do pola (np. zarobki)osoba.salary

Page 36: Zsbd PL/SQL

Przykład wykorzystania %ROWTYPE

dr P. Drozda

Tabela emp(id,name, salary,fire_date)DECLARE

zmiana emp%ROWTYPE;BEGIN

SELECT * INTO zmiana FROM empWHERE id=111;zmiana.fire_date = CURRENT_DATE;UPDATE emp SET ROW zmiana WHERE id=111;

END;

Page 37: Zsbd PL/SQL

Tabele INDEX BY

dr P. Drozda

Składają się z dwóch pól – identyfikatora (liczba lub ciąg znaków) oraz wartości

Gromadzą dane o tym samym typie – np. imiona z tabeli employees

Mają nieograniczoną wielkość tzn. ogranicza je zakres wartości identyfikatora

Odpowiadają tabelom z „normalnych” języków programowania

Page 38: Zsbd PL/SQL

Tworzenie tabel – INDEX BY

dr P. Drozda

TYPE nazwa IS TABLE OFtypkolumny INDEX BY PLS_INTEGER,|BINARY_INTEGER|VARCHAR2;

PrzykładDECLARETYPE tabelaimiona IS TABLE OF

employees.first_name%TYPEINDEX BY PLS_INTEGER;imiona tabelaimiona;BEGINimiona(1):=‘Zenek’;END;

Page 39: Zsbd PL/SQL

Funkcje odwołujące się do tabel INDEX BY

dr P. Drozda

EXISTS – sprawdza czy istnieje dana komórka w tabelinp. IF imiona(1).EXISTS THEN INSERT INTO …;

COUNT – zwraca liczbę elementów z tabelidbms_output.put_line(imiona.COUNT);

FIRST, LAST – zwracają pierwszą/ostatnią wartość z tabeli; gdy tabela pusta – zwranany jest NULL

PRIOR(n), NEXT(n) – zwracają poprzedni/kolejny indeks z tabeli – porównując do n

DELETE – usuwa elementy z tabeli bez argumentu – usuwa wszystko z argumentem n – usuwa n-ty element z argumentami m,n – usuwa wszystkie elementy od m do n

Page 40: Zsbd PL/SQL

Przykład INDEX BY

dr P. Drozda

DECLARETYPE typpracownik IS TABLE OFemployees%ROWTYPE INDEX BY PLS_INTEGER;pracownik typpracownik;

BEGINFOR i IN 100..105LOOP

SELECT * INTO pracownik(i) FROM employees WHERE employee_id=i;END LOOP;FOR i IN pracownik.FIRST..pracownik.LASTLOOP

DBMS_OUTPUT.PUT_LINE(pracownik(i).last_name, pracownik(i).first_name);END LOOP;

END;

Page 41: Zsbd PL/SQL

Tabele nested tables

dr P. Drozda

SkładniaTYPE nazwa IS TABLE OF typ_danych;

Nie mają z góry określonej wielkości Maksymalny rozmiar 2GB Odwołania do poszczególnych wartości –

tak jak w tabelach INDEX BY (w kluczach nie może być ujemnych wartości)

Wiersze nie są poustawiane w jakimś porządku – przeszukiwanie rekord po rekordzie (INDEX BY – mają klucz indeksowany)

Page 42: Zsbd PL/SQL

Przykład – nested tables

dr P. Drozda

DECLARETYPE typ_lokacji IS TABLE OF locations.city%TYPE;miasta typ_lokacji;

BEGINmiasta:=typ_lokacji(‘Gniewkowo’, ’Solec’, ’Pszczólki’, ’Książki’);FOR i IN 1..miasta.count() LOOP

dbms_output(miasta(i));END LOOP;

END;

Page 43: Zsbd PL/SQL

Tabele VARRAY

dr P. Drozda

Ustalona w deklaracji wielkość tabeli Składnia tworzenia tabeli VARRAY

TYPE nazwa IS VARRAY(n) OF typDanych; Maksymalny rozmiar 2GB

Page 44: Zsbd PL/SQL

Kursory

dr P. Drozda

Definiowane do poleceń SELECT, które zwracają wiele wierszy do przechowywania danych

Można przetwarzać wiersz po wierszu Zasada działania:

DECLARE

OPEN FETCH CLOSEEMPT

Y?

NO

YES

Page 45: Zsbd PL/SQL

Składnia deklaracji kursora

dr P. Drozda

CURSOR nazwa ISzapytanie SQL (SELECT);

Przykład:DECLARE

CURSOR dept_30 ISSELECT last_name, first_name, salaryFROM employeesWHERE department_id = 30;

Page 46: Zsbd PL/SQL

Otwieranie kursora – OPEN

dr P. Drozda

Aby była możliwość dostępu do danych w kursorze należy użyć polecenia – OPEN nazwa;

Polecenie alokuje dynamicznie pamięć dla danych z otwieranego kursora

Odczytywanie są odpowiednie typy i nazwy kolumn dla kursora

Wiersze nie są przekazywane do zmiennych kursora – dopiero w momencie uruchomienia polecenia FETCH dane są czytane

Page 47: Zsbd PL/SQL

Przykład

dr P. Drozda

DECLARECURSOR dane ISSELECT first_name, last_name FROM employees WHERE department = 50;imie employees.first_name%TYPE;nazwisko employees.last_name%TYPE;

BEGINOPEN dane;FETCH dane INTO imie, nazwisko;DBMS_OUTPUT.PUT_LINE(imie || ‘ ’|| nazwisko);

END;

Page 48: Zsbd PL/SQL

FETCH, CLOSE

dr P. Drozda

FETCH pobiera z kursora jeden wiersz danych i przesuwa

się do następnego wiersza Po INTO liczba zmiennych i typy muszą odpowiadać

liczbie i typom kolumn pobieranych z kursora Kolejność występowania zmiennych musi

odpowiadać kolejności kolumnom zdefiniowanych w kursorze

FETCH nazwa INTO zmienne; CLOSE

Zamyka dostęp do kursora Zwalnia pamięć zajmowaną przez kursor Dobra praktyka zawsze zamykać, gdy niepotrzebny CLOSE nazwa;

Page 49: Zsbd PL/SQL

Użycie rekordów w kursorach

dr P. Drozda

Przy deklaracji zmiennej – typ ustawiany jako nazwakursora%ROWTYPE;

Przy poleceniu FETCH wiersz wpisywany do zadeklarowanego rekordu

Przykład:DECLARE

CURSOR dane …;wiersz dane%ROWTYPE;

BEGINOPEN dane;FETCH dane INTO wiersz;…

END;

Page 50: Zsbd PL/SQL

Przykład – pełna wersja

dr P. Drozda

DECLARECURSOR dane IS

SELECT first_name, last_name FROM employeesWHERE department_id = 50;

wiersz dane%ROWTYPE;BEGIN

OPEN dane;LOOP

FETCH dane INTO wiersz;EXIT WHEN dane%NOTFOUND;DBMS_OUTPUT.PUT_LINE(wiersz.first_name, ‘ ‘ ,

wiersz.last_name);END LOOP;dane%ROWCOUNT;CLOSE dane;

END;

Page 51: Zsbd PL/SQL

FOR dla kursora

dr P. Drozda

SkładniaFOR zmienna IN nazwakursoraLOOPinstrukcje;END LOOP;

Otwarcie, FETCH i zamknięcie kursora przez pętle

Zmienna – rekord sczytujący kolejne wiersze kursora

Page 52: Zsbd PL/SQL

Przykład

dr P. Drozda

DECLARE CURSOR dane IS SELECT first_name, last_name FROM employeesWHERE department_id = 50;

BEGINFOR wiersz IN daneLOOP

DBMS_OUTPUT.PUT_LINE(wiersz.first_name|| ‘ ‘ || wiersz.last_name);END LOOP;DBMS_OUTPUT.PUT_LINE(dane%ROWCOUNT);

END;

Page 53: Zsbd PL/SQL

Atrybuty kursora

dr P. Drozda

%ISOPEN – zwraca prawdę gdy kursor otwarty

%NOTFOUND – zwraca prawdę gdy zmienna nie zawiera danych

%FOUND – zwraca prawdę gdy zmienna zawiera dane

%ROWCOUNT – zwraca liczbę wierszy wyciągniętych poprzez kursor do momentu wywołania atrybutu

Page 54: Zsbd PL/SQL

Przykład bez deklaracji kursora

dr P. Drozda

BEGIN FOR dane IN (SELECT last_name,

first_name FROM employees)LOOP…END LOOP;END;

Page 55: Zsbd PL/SQL

Kursor – parametry

dr P. Drozda

Do kursora mogą zostać dodane parametry

Skłania:CURSOR nazwa(parametr typ, …) ISSELECT …;BEGIN OPEN nazwa(wartosc parametru);

Page 56: Zsbd PL/SQL

Przykład

dr P. Drozda

DECLARECURSOR ponumerze (depid NUMBER) ISSELECT last_name, first_name, salary FROM employeesWHERE department_id=depid;

BEGINOPEN ponumerze(10);CLOSE ponumerze;OPEN ponumerze(50);

…END;