background image

1

SYSTEMY BAZ DANYCH

cd języka zapytań SQL

Opracowanie : Dr hab. Bożena Śmiałkowska

background image

2

Logiczny (boolowski) 

BOOLEN

z wartościami TRUE, 

FALSE oraz UNKNOWN (TRUE>FALSE)

Znakowy 

CHARACTER [VARYING] [długość

– można 

skrócić do CHAR - Jeśli za łańcuch stałej długości
podstawimy mniejszą liczbę znaków, niż wskazuje jego
długość, to zostanie on uzupełniony na końcu spacjami
aż do osiągnięcia wymaganej długości.

VARCHAR

- w przypadku łańcucha zmiennej długości

zapamiętane zostaną jedynie wpisane znaki (dane będą
zajmować mniej pamięci).

Bitowy 

BIT, BIT VARYING

lub

BIT [VARYING] [DŁUGOŚĆ]

Typy danych ISO SQL

background image

3

Dokładny liczbowy 

NUMERIC [rozmiar[,dokładność]],
DECIMAL [rozmiar[,dokładność]], 
INTEGER, 
SMALLINT

gdzie INTEGER możemy skrócić do INT, a DECIMAL do 
DEC

Przybliżony liczbowy 

FLOAT[dokładność], 
REAL, 
DOUBLE PRECISION

gdzie zapis m10c , gdzie m-mantysa (l.rzeczywista), c-cecha
(l.całkowit.) - dokładność określa rozmiar mantysy

Typy danych ISO SQL

background image

4

Daty i czasu  

DATE, TIME, TIMESTAMP

DATE jest stosowany do dat i zawiera pola

YEAR, MONTH, DAY

TIME jest stosowany do czasu i zawiera pola 

HOUR, MINUTE, SECOUND

TIMESTAMP jest stosowany do czasu z 

uwzględnieniem daty i godziny

Typy danych ISO SQL

background image

5

Waga typu atrybutu w procesie 
wstawiania i aktualizowania bazy danych

Typ danych uniemożliwia wprowadzenie do 

atrybutu tabeli bazy danych takiej wartości, 
która jest niezgodna z typem atrybutu 
określonym w CREATE TABLE – zapewnia to 
automatyczną kontrolę wartości wstawianych  
do bazy danych (INSERT) i aktualizowanych 
(UPDATE)

Są również inne mechanizmy ochrony bazy 
danych przed niewłaściwym wprowadzaniem i 
aktualizowaniem danych – tymi mechanizmami są

więzy integralności 

background image

6

Wprowadzanie 

więzów 

integralności bazy 

danych w SQL

background image

7

Rodzaje więzów integralności

Dane wymagane

Więzy dziedzinowe

Więzy referencyjne

Więzy globalne (asercje)

Więzy specjalne (trigerry)

background image

8

Dane wymagane

Umieszczenie w poleceniu CREATE i ALTER 

TABLE przy kolumnie klauzuli 

NOT NULL

oznacza konieczność podania wartości dla 
atrybutów, dla których podano klauzulę NOT 
NULL

Np.. 

CREATE TABLE Pracownik
(…

ZAWOD char(30) NOT NULL

,…);

background image

9

Definiowanie więzów dziedzinowych

Są następujące sposoby:

Polecenie tworzenia dziedziny wartości 
atrybutu (-ów)

(CREATE DOMAIN)

Klauzula 

CHECK 

użyta w CREATE DOMAIN i 

CREATE TABLE

background image

10

Więzy integralności - dziedzinowe

Klauzula 

CHECK (warunek_selekcji)

używa się

do ograniczenia dopuszczalnych wartości atrybutu 
tabeli 

np.. 

SEX CHAR NOT NULL 

CHECK

(SEX IN (‘M’, ‘K’))

background image

11

Definiowanie dziedziny wartości

Postać klauzuli

CREATE DOMAIN

NazwaDziedziny [AS] 

typ_danych

[

DEFAULT

wartość_domyslna] 

CHECK 

(warunek_selekcji)

background image

12

PŁEĆ

CHAR NOT NULL

CHECK

(PŁEĆ IN (‘M’, 

‘K’))

CREATE DOMAIN

LICZBA_OCZEK

AS

SMALLINT DEFAULT 1 

CHECK

(VALUE IN 

(1,2,3,4,5,6));

CREATE DOMAIN

TYP_DEPT

AS

SMALLINT 

CHECK

(VALUE IN (SELECT DEPTNO FROM 

DEPT));

Przykłady dziedzinowych więzów 
integralności

background image

13

Przykłady definiowania dziedziny

CREATE DOMAIN 

KodPocztowy

AS 

VARCHAR(5);

CREATE DOMAIN 

Adres

VARCHAR(55);

CREATE DOMAIN 

TypNieruchomosci

AS 

CHAR(1) CHECK (VALUE 

IN(‘B’,’C’,’M’,’F’,’S’));

CREATE DOMAIN 

L_Pokoj

AS SMALLINT 

CHECK(VALUE BETWEEN 1 AND 15);

background image

14

Przykłady definiowania dziedziny –
cd..

CREATE DOMAIN 

NumeryWlascicieli

AS  

VARCHAR(5) CHECK (VALUE IN 

(SELECT wlasciciele FROM

WlascicielPrywatny));

CREATE DOMAIN 

NumeryPracownikow

AS 

VARCHAR(5) CHECK (VALUES IN 

(SELECT

pracownikNr FROM Persony));

background image

15

cd… przykładu

CREATE TABLE

NIERUCHOMOSCI

(

NrNieruchomosci VARCHAR(5) NOT NULL UNIQUE,

Wlasciciel

NumeryWlascicieli

NOT NULL,

Pracownik Nr 

NumeryPracownikow

NOT NULL,

Kodadres

KodPocztowy

,

Adres_miejsce

Adres 

NOT NULL,

Typ

TypNieruchomosci

NOT NULL DEFAULT ‘M’,                                          

Ilosc_pokoi

L_Pokoj

NOT NULL DEFAULT 4,

PRIMARY KEY Wlasciciel);

background image

16

Więzy integralności - dziedzinowe

Dziedzinę można usunąć za pomocą

DROP DOMAIN NazwaDziedziny

[RESTRICT|CASCADE]

background image

17

Integralność encji – więzy referencyjne

Klauzula 

PRIMARY KEY

(atryb_n {, atryb_n}) 

dla klucza głównego

Klauzula 

UNIQUE

(atryb_n {, atryb_n}) dla 

kluczy alternatywnych

background image

18

Integralność referencyjna

Klauzula FOREIGN KEY 

Cztery tryby postępowania w przypadku 
kasowania (modyfikowania) rekordów: 

RESTRICT i NO ACTION

CASCADE

SET NULL

SET DEFAULT

FOREIGN KEY

(DEPTNO) 

REFERENCES

DEPT 

ON DELETE SET NULL

Np.

background image

19

Opcje restrykcyjne więzów 
referencyjnych

restrykcyjne (

RESTRICT, NO ACTION

) –

usunięcie wiersza nadrzędnego nie jest 
możliwe, jeśli istnieją wiersze podrzędne 
(logicznie z nim powiązane),

background image

20

Opcje więzów referencyjnych – cd..

z wstawianiem wartości pustych (

SET NULL

– usunięcie wiersza nadrzędnego powoduje 
automatyczne wstawienie wartości pustych w 
miejsce kluczy obcych wierszy podrzędnych,

background image

21

Opcje więzów referencyjnych – cd..

kaskadowe (

CASCADE

) – usunięcie wiersza 

nadrzędnego powoduje automatyczne 
usunięcie wierszy podrzędnych (logicznie z 
nim powiązanych). 

background image

22

Przykład

CREATE TABLE 

DOSTAWY

(IdDost char(5),

IdTow char(10),

FOREIGN KEY IdDost REFERENCES 

DOSTAWCA

ON DELETE CASCADE);

Określono tu zależność referencyjną wg której każda niezerowa 
wartość

DOSTAWY.IdDost

musi wystąpić w 

DOSTAWCA.IdDost

Określa to również, że jeśli zostanie wprowadzony wiersz w tabeli 

DOSTAWY

to taka operacja zostanie odrzucona jeśli w tabeli 

DOSTAWCA

wartość IdDost nowo wprowadzana nie istnieje.

background image

23

Opcje więzów referencyjnych – cd..

z wstawianiem wartości pustych (

SET 

DEFAULT

) – usunięcie wiersza nadrzędnego 

powoduje automatyczne wstawienie wartości 
podanej po DEFAULT w miejsce kluczy 
obcych wierszy podrzędnych,

background image

24

Przykład

ZESPOLY (

nr_zespolu

, nazwa, nr_projektu)

PRACOWNICY(

Nr_prac

, nazwisko, nr_zespolu)

WYPLATY(

Nr_prac, nr_tematu

, kwota)

TEMATY(

nr_tematu

, nazwa, nr_projektu)

SET NULL

CASCADE

RESTRICT

background image

25

Ograniczenia na usuwanie i 
modyfikację wierszy

ON DELETE

{ NO ACTION | RESTRICT |

CASCADE |

SET NULL | SET DEFAULT }

ON UPDATE

{ NO ACTION | RESTRICT |

CASCADE |

SET NULL | SET DEFAULT }

background image

26

Inny przykład więzów

dziedzinowe

referencyjne

background image

27

Więzy globalne (ogólne) - Po co nam 
takie więzy? 

Wszystkie dotychczas omówione więzy dotyczyły 
pojedynczej krotki (więzy wartości atrybutów), 
ewentualnie prostych związków między krotkami z 
różnych relacji (więzy integralności)

czasami chcielibyśmy napisać warunek, który 
dotyczy całej relacji (tabeli) lub kilku relacji (tabel).

Przykładem takich więzów są asercje.

Asercje nie są związane z definicją tabeli (CREATE 
TABLE)

background image

28

Więzy integralności ogólnej – składnia 
asercji

CREATE  ASSERTION

NazwaAsercji

CHECK

(warunek_selekcji)

CREATE ASSERTION

PracownikNadzorującyNieZaDużo

CHECK

(NOT EXISTS (SELECT pracownikNr FROM 
Nieruchomości GROUP BY pracownikNr
HAVING COUNT(*)>100))

Np.

background image

29

Przykład więzów globalnych

W bazie są następujące relacje:

Dyrektor

(nazwisko:varchar(10),adres:varchar(10),

cert:varchar(10),cenaSieci:int)

Studio

(nazwa:varchar(10),adres:varchar(10),

prezes:varchar (10) references Dyrektor(cert))

Chcielibyśmy, aby szefem (prezesem) studia była 

osoba, której sieć ma wartość co najmniej 10 mln $

background image

30

Definicja asercji z przykładu

CREATE ASSERTION 

BogatyPrezes

CHECK

(NOT EXISTS

(SELECT *

FROM Studio,Dyrektor

WHERE prezes=cert AND 
cenaSieci<10000000

));

Asercja opisująca warunek bycia 
bogatym prezesem

background image

31

Gdybyśmy chcieli zdefiniować bogatych 
prezesów w tabeli Studio używając CHECK?

CREATE TABLE Studio (

nazwa CHAR(30) PRIMARY KEY,

adres VARCHAR(255),

prezC INT REFERENCES Dyrektor(cert),

CHECK (prezes NOT IN 

(SELECT cert FROM Dyrektor

WHERE cenaSieci<10000000)

));

?

background image

32

Gdyby zdefiniowano bogatych prezesów 
w tabeli Studio używając CHECK to:

nie uzyskamy tego samego efektu co przy 
pomocy asercji.

Dzieje się tak ponieważ warunek, który jest 
opisany w więzie CHECK, będzie 
sprawdzany przy wstawianiu i modyfikacji 
krotki tylko z relacji Studio. 

Przy zmianach w relacji Dyrektor więzy 
CHECK w relacji Studio nie będą
sprawdzane.

background image

33

Wnioski z przykładu „Bogaci prezesi”

Jeśli uczynimy kogoś prezesem studia a potem 
będziemy chcieli obniżyć wartość jego sieci to 

asercja na to nie pozwoli

natomiast 

więz krotkowy

tak

, ponieważ on jest sprawdzany przy modyfikacji 

krotki z relacji Studio a nie krotki z relacji Prezes.

DLACZEGO: ponieważ więzy krotkowe powinny 
dotyczyć krotek z danej relacji a w tej relacji nic się
nie zmieniło. Ten sposób traktowania więzów 
krotkowych wynika głównie z wymogów 
wydajnościowych! Wyobraźmy sobie, jaką pracę
musiałaby wykonać baza, gdyby musiała zapewnić
wiele więzów krotkowych podobnych temu. 

background image

34

Inny przykład

Film

(tytuł:varchar(10),rok:date,długość:int,

czyKolor:boolean,nazwaStudia:varchar(10),

producentC:varchar(10));

chcielibyśmy, aby długość wszystkich filmów w 
danym studiu miała co najmniej 10000 minut.

Mamy relację:

background image

35

CREATE ASSERTION SumDlugość

CHECK (10000 <= ALL

(SELECT SUM(długość) FROM Film

GROUP BY nazwaStudia));

W tym przypadku istnieje silna pokusa, aby zamiast 
tworzyć asercję dodać linijki 2-4 jako więz CHECK do 
relacji Film.
Wydaje się,że również zadziałałoby. 
Jednak również w tym wypadku zauważmy, co 
mogłoby się zdarzyć przy usuwaniu filmów!!

background image

36

Porównanie więzów (krotkowych) 
CHECK i asercji

Przy dowolnej modyfikacji relacji 
(wstawianie, modyfikacja lub 
usuwanie dowolnej krotki) której 
dotyczy ta asercja

Asercje

Przy wstawianiu lub zmianie 
wartości w krotce (NIE przy 
usuwaniu krotki z relacji) tylko z 
tej relacji

Krotkowe CHECK

Warunki uruchomienia 

więzów

Typ więzów

background image

37

Inne potrzeby integralności

Czasami chcielibyśmy reagować w bardziej aktywny 
sposób na sytuacje, gdy dochodzi do naruszenia 
jakiegoś warunku lub niezmiennika niż tylko nie 
dopuszczając do tych modyfikacji bazy danych, która 
ten warunek narusza (być może dla pewnych sytuacji 
umiemy temu zaradzić). 

Czasami chcielibyśmy decydować, kiedy warunek ma 
być sprawdzany (choćby ze względu na wydajność), 
a w przypadku np. asercji to system o tym decyduje.

Poza tym asercje są „drogie”. Dlatego chcielibyśmy 

mieć coś „tańszego” od asercji, co pozwala nam na 
nakładanie pewnych więzów na bazę.

WYZWALACZE

background image

38

Wyzwalacze

Wyzwalacze są testowane tylko przy zajściu 
określonego zdarzenia (dołączanie, 
usuwanie, modyfikacja krotki) określonego 
przez programistę (projektanta bazy) (w 
przypadku asercji i więzów krotkowych
CHECK decyduje o tym SZBD)

Testują warunek w chwili zajścia zdarzenia (a 
nie uprzedzają go)

Jeśli warunek zostanie spełniony to 
przetwarzana jest akcja związania z 
wyzwalaczem

background image

39

Składnia wyzwalaczy

CREATE TRIGGER <

nazwa_wyzwalacza

>

{BEFORE|INSTEAD OF |AFTER}

[OF <

nazwa_kolumny

>] ON <

nazwa_tabeli

>

REFERENCING

{

OLD|OLD_TABLE

AS

nazwa_zmiennej1

{

NEW|NEW_TABLE

AS

nazwa_zmiennej2

WHEN (<

warunek

>)

<

lista_poleceń_do_wykonania

>

[FOR EACH ROW]

background image

40

Cechy wyzwalaczy

Akcja może być wykonana przed (BEFORE), 
po (AFTER) lub zamiast (INSTEAD OF) 
zdarzenia

W akcji dostępne są wartości  sprzed (OLD, 
OLD_TABLE) zajścia zdarzenia jak i nowe 
(NEW,NEW_TABLE) wartości

Można określać czy akcja ma być
wykonywana dla każdej modyfikowanej krotki 
(FOR EACH ROW) czy tylko raz dla 
wszystkich krotek zmodyfikowanych w 
pojedynczej operacji

background image

41

Wyzwalacze (trigger) - przykład

INSERT w „Pracownicy” oznacza, że 
akcja reguły zostanie odpalona 
bezpośrednio po wykonaniu pojedynczej 
operacji wstawienia krotki (fraza 

AFTER)

. Fraza "

for each row

" określa, że 

akcja realizowana jest na pojedynczej 
krotce. Prefiks 

:

New

poprzedzający 

nazwę atrybutu „IdZesp” w ciele akcji 
reguły jest odwołaniem do wartości tego 
atrybutu we wstawianej krotce.

background image

42

Przykład wyzwalacza

CREATE TRIGGER CenaSieciWyzw

AFTER UPDATE OF cenaSieci ON Dyrektor

REFERENCING 

OLD AS Stara

NEW AS Nowa

WHEN (Stara.cenaSieci > Nowa.cenaSieci)

UPDATE Dyrektor SET cenaSieci= Stara.cenaSieci

WHERE cert = Nowa.cert

FOR EACH ROW

Uniemożliwienie obniżenie ceny sieci

background image

43

Inny przykład wyzwalacza

CREATE TRIGGER WyzwalaczSrCenySieci
INSTEAD OF UPDATE OF cena sieci ON Dyrektor
REFERENCING

OLD_TABLE AS Stara
NEW_TABLE AS Nowa

WHEN (500000 <= (SELECT AVG(cenaSieci) FROM 

((Dyrektor EXCEPT Stare) UNION Nowe))

DELETE  FROM Dyrektor WHERE 

(nazwisko,adres,cert,cenaSieci) IN Stare;

INSERT INTO Dyrektor (SELECT * FROM Nowe);

Zabronienie spadku średniej ceny sieci poniżej 500000

background image

44

BEZPIECZEŃSTWO 

DOSTĘPU DO 

BAZY DANYCH

background image

45

Składowe SQL

background image

46

Ochrona bezpieczeństwa bazy danych 
w SQL

Bezpieczeństwo bazy danych jest bardzo istotną
kwestią w każdej firmie czy korporacji.

Zapewnienie dostępu do systemu bazodanowego 

tylko dla osób korzystających z systemu 
bazodanowego nie gwarantuje jego bezpieczeństwa.

Takie sytuacje mają miejsce, kiedy dana grupa 
użytkowników, lub użytkownik posiadają nadmiarowy 
dostęp do bazy danych

Aby zapobiec tego typu sytuacjom, wykorzystuje się

warstwę DCL języka SQL (dodatkowa warstwa obok 
DDL, DML, DQL).

background image

47

Role w bazie danych

Istotną kwestią bezpieczeństwa w każdym SBD są role

Warstwa DDL obejmuje jedynie tworzenie, zmianę i 
usuwanie ról

Aby zarządzać rolami należy się odwołać do części 
DCL języka SQL, w której to określono jak przydzielać i 
poszerzać role. 

Są 3 typy ról w SBD:

Systemowe

Bazy danych

Aplikacji

background image

48

Tworzenie roli

CREATE ROLE

role_name

AUTHORIZATION

owner_name

]

W miejscu 

role_name

należy podać unikalną w 

przestrzeni BD nazwę roli. 

Administrator tworząc role  może ją „przekazać” dla 

innego użytkownika jako jego własną.

Do tego służy opcja AUTHORIZATION, gdzie jako 

owner_name

podaje się nazwę użytkownika, który ma 

być jego właścicielem. 

Pominięcie opcji AUTHORIZATION, powoduje 

automatycznie nadanie praw własności do roli osobie 
ją tworzącej. 

background image

49

Nadawanie praw innym użytkownikom

GRANT [

lista_praw

|ALL PEIVILIGES]

ON        

NazwaObiektu

TO        [

lista_identyfikatorów_użytkowników

|PUBLIC]

[WITH GRANT OPTION]

GRANT DELETE, UPDATE (

premia,pensja

ON 

pracownik

TO 

kierownik

;

Wszystkie prawa 

jednocześnie

Możliwość przekazywania 

praw innym użytkownikom

Wszystkim 

użytkownikom

background image

50

Odbieranie praw dostępu użytkownikom

REVOKE

[GRANT OPTION FOR] 

[

lista praw

|ALL PRIVILIGES]

ON 

NazwaObiektu

FROM [

lista_identyfikatorów

|

PUBLIC|RESTRICT|CASCADE]

W wyniku odbierania praw mogłyby powstać tzw. obiekty porzucone dla 
których właściciel przestał mieć prawa, które były konieczne do 
stworzenia obiektu. Polecenie REVOKE nie jest wykonywane w takim
przypadku, chyba że zawiera opcję CASCADE powodującą wydanie 
polecenia DROP dla wszystkich porzuconych perspektyw, dziedzin, 
więzów i asercji.
Polecenie REVOKE wydane przez użytkownika służy do odebrania praw 
nadanych tylko przez niego.

background image

51

Indeksy (poza  ISO SQL)

Indeks jest pomocniczą (redundantną) strukturą danych

przechowywaną w bazie danych dla potrzeb optymalizacji
dostępu do danych.

Administrator bazy danych zarządza pulą indeksów,

generując nowe indeksy, o ile rozpozna ich potrzebę, lub
je usuwając, jeżeli pewne indeksy są nieprzydatne.

Tak jak indeksy na końcu książki, służące do szybkiego

wyszukiwania stron, indeksy w bazach danych służą do
szybkiego wyszukiwania obiektów. 

Zaletą indeksu jest jego stosunkowo mały rozmiar (w

porównaniu do całości bazy danych) oraz
jednoaspektowość wyszukiwania, co umożliwia ich bardzo
efektywną organizację. 

background image

52

Indeksy (poza  ISO SQL) cd..

Indeks należy rozumieć jako dwu-kolumnową tablicę, 

gdzie pierwsza kolumna zawiera wartości kluczowe, zaś
druga – wartości nie-kluczowe, najczęściej referencje do
obiektów. 

Wartości kluczowe są unikalne i służą jako wejście dla

procedury wyszukiwania w indeksie. 

Wynikiem wyszukiwania wg danej wartości kluczowej są

wartości niekluczowe w tym samym wierszu tablicy. 

Wartości kluczowe są zapamiętane w określonych

atrybutach obiektów bazy danych (dla indeksów gęstych)
lub są reprezentantami przedziałów wartości (dla
indeksów zakresowych). 

Istnieją bardziej złożone indeksy odbiegające od tego

schematu.

background image

53

Baza danych ...             ...i indeksy

i

1

Prac 

i

Nazwisko ”Nowak”

i

Zar  2500

i

PracujeW  

i

22

Dział

i

23 

Nazwa ”Sprzedaż”

i

24 

Lokacja ”Radom”

i

25 

Zatrudnia  

i

26 

Zatrudnia  

i

17

Dział

i

18 

Nazwa ”Produkcja”

i

19 

Lokacja ”Kielce”

i

21 

Zatrudnia  

i

20 

Lokacja ”Kraków”

i

9

Prac 

i

10 

Nazwisko ”Barski”

i

11 

Zar  900

i

16 

PracujeW  

i

13 

Miasto ”Radom”

i

14

Ulica ”Wolska”

i

15 

NrDomu 12

i

12

Adres

i

5

Prac 

i

Nazwisko ”Kowalski”

i

Zar  2000

i

PracujeW  

Indeks dla obiektów Prac 
wg atrybutu Nazwisko

Wartość
kluczowa
Barski
Kowalski
Nowak

Wartość
nie-kluczowa
i

9

i

5

i

1

Indeks dla obiektów Dział
wg atrybutu Lokacja

Wartość
kluczowa
Kielce
Kraków
Radom

Wartość
nie-kluczowa
i

17

i

17

i

22

background image

54

Inne przykłady indeksów

Indeks tzw. gęsty dla 
obiektów Prac wg atrybutu 
Stan

Wartość
kluczowa
analityk
kierownik
operator
programista
radca

Wartość
nie-kluczowa
i

15

i

17

i

43

i

72

i

43

i

18

i

22

i

25

i

57

i

22

i

43

i

59

i

48

i

7

Indeks zakresowy dla 
obiektów Prac wg 
atrybutu Zar

Wartość
kluczowa
500
1000
1500
2500
4500
5000
7500

Wartość
nie-kluczowa
i

15

i

72

i

43

i

18

i

22

i

25

i

25

i

45

i

59

i

48

i

26

i

55

i

29

i

66

i

7

background image

55

Zakładanie indeksu

CREATE [UNIUE] INDEX

NazwaIndeksu

ON

NazwaTabeli

(nazwaKolumny[

Asc|Desc

][,…])

CREATE UNIQUE INDEX 

IndNPr

ON 

Per

(

PracNr

);

CREATE INDEX 

IndeksWynajmow

ON 

Nieruchomości

(

Miasto

,

Czynsz

);

SZBD będzie kontrolował unikalność wartości 

kolumn

background image

56

System zarządzania bazą danych    

(DBMS)

Baza danych

DBMS

serwer

Formularze 

internetowe

Aplikacje

Interfejs

SQL

Funkcje DBMS:

• Tworzenie nowej bazy 

• Przechowywanie danych

• Obsługa zapytań (ang. query) 

• Zapewnienie wielodostępności 

• Zapewnienie integralności danych

• Ochrona danych (np. archiwizacja)

Komendy SQL

background image

57

Dostęp do bazy 

danych z 

poziomu języka 

programowania

background image

58

Język PL/SQL

to rozszerzenie SQL o elementy 
programowania

proceduralnego i obiektowego 
umożliwiające wykorzystanie:

zmiennych, stałych

Struktur kontrolnych (instrukcji warunkowych), 
etykiet i skoków, pętli, kursorów

Wyjątków i mechanizmu obsługi błędów

background image

59

Struktura blokowa programu w 
PL/SQL

Program składa się z jednostek zwanych blokami.

Każdy blok odpowiada problemowi 
(podproblemowi)

Bloki mogą być dowolnie zagnieżdżone

Każdy blok składa się z trzech części:

deklaracji (o)

rozkazów (w)

obsługi błędów (o)

bloki mogą być zagnieżdżane w części rozkazów 
lub/i cz
ęści obsługi błędów

background image

60

Struktura blokowa programu w 
PL/SQL

deklaracje

rozkazy

obsługa błędów

background image

61

Zmienne w PL/SQL

Zmienne proste (np. typu numerycznego, 
znakowego, daty)

Zmienne podtypu (np. zdefiniowanego przez 
użytkownika)

Zmienne złożone (np. rekordy, tablice, kolekcje, 
obiekty)

DECLARE nazwa_zmiennej typ(długość)

[DEFAULT wartość domyślna]

[NOT NULL];

background image

62

Zmienne rekordowe

Przed zadeklarowaniem zmiennej rekordowej 
trzeba zdefiniować typ rekordowy

TYPE  Osoba IS RECORD (

nazwisko VARCHAR(60),

imie VARCHAR(30),

pesel…

);

background image

63

Zmienne tablicowe

Istnieją trzy rodzaj tablic:

Tablice indeksowane (index-by tables): 
nieograniczony rozmiar, automatycznie rozszerzane, 
nie mogą być typem atrybutu w bazie danych, indeks 
tablicy może być ujemny

Tablice zagnieżdżone (nested tables): 
nieograniczony rozmiar, rozszerzane za pomocą
procedury EXTEND, mogą być typem atrybutu w 
relacji, mogą być użyte w poleceniach DML, nie 
zainicjalizowana tablica jest pusta, przechowywane 
fizycznie w osobnej relacji (store table), indeks tablicy 
musi być dodatni

background image

64

Zmienne tablicowe

Kolekcje o zmiennym rozmiarze (varrays): 
ograniczony i rozszerzalny rozmiar, przechowywane 
w zwartej postaci in-line, indeks kolekcji musi być
dodatni

TYPE PracTab is TABLE OF VARCHAR(100) 
INDEX BY BINARY_INTEGER

TYPE TabRecOs is TABLE OF Osoba

TYPE Niedziele is TABLE OF DATE

background image

65

Atrybuty %TYPE, %ROWTYPE

% TYPE pozwala nam zadeklarować
zmienną która jest takiego typu jak inna 
zmienna lub atrybut w bazie danych

Atrybut %ROWTYPE zawiera typ rekordowy 
reprezentujący strukturę pojedynczej krotki z 
danej relacji. Atrybuty w krotce i 
odpowiadające im pola w rekordzie maja te 
same nazwy i typy.

DECLARE

nazwisko OSOBA.NAZWISKO%TYPE

osobaRec OSOBA%ROWTYPE

background image

66

Nadawanie wartości zmiennym

Nadanie wartości poprzez przypisanie

Nadanie wartości przez wczytanie danych z bazy 
danych do zmiennej poleceniem SELECT ... INTO ...

Nadanie wartości przez przekazanie zmiennej jako 
parametru typu IN OUT lub OUT do procedury lub 
funkcji

Nadanie wartości przez wczytanie danych z bazy 
danych do zmiennej za pomocą klauzuli 
RETURNING poleceń INSERT/UPDATE/DELETE

background image

67

STAŁE

Stałe deklarujemy z uyciem słowa 
kluczowego CONSTANT. Stała musi zostac
zainicjalizowana podczas deklaracji. Po 
utworzeniu stałej jakiekolwiek modyfikacje jej 
wartości są niedozwolone.

DECLARE

conGodz CONSTANT NUMBER:=42;

conNazwa CONSTANT VARCHAR(20):=‘’baza_danych”

background image

68

Typy Danych

background image

69

Typy Danych

Typy danych dostępne w PL/SQL nie odpowiadają
dokładnie analogicznym typom dostępnym w SQL.

Typy BINARY_INTEGER i PLS_INTEGER: -2

31

, 2

31

Ich podtypami są typy: POSITIVE, POSITIVEN, 
NATURAL, NATURALN i SIGNTYPE (-1, 0, 1).

Typ NUMBER: 10

-130

¸ 10

125

. Jego podtypami są typy: 

DECIMAL, INTEGER, FLOAT, REAL, NUMERIC.

Typy CHAR, VARCHAR2, RAW, LONG: 32767 
bajtów

Typ BOOLEAN: TRUE, FALSE, NULL

background image

70

Podtypy

Każdy typ danych definiuje zbiór poprawnych wartości i 

zbiór operatorów, które mogą być zastosowane do 
zmiennej danego typu. Podtyp definiuje ten sam zbiór 
operatorów co jego typ nadrzędny, lecz zawęża zbiór 
poprawnych wartości.

SUBTYPE nazwa IS typ bazowy [ (ograniczenie) ] [ NOT NULL ];

background image

71

Instrukcja Warunkowa

IF warunek THEN

sekwencja poleceń;

END IF;

IF warunek THEN

sekwencja 

poleceń;
ELSE

sekwencja 

poleceń;
END IF;

IF warunek1 THEN

sekwencja poleceń;

ELSEIF warunek2 
THEN

sekwencja poleceń;

ELSE

sekwencja poleceń;

END IF;

background image

72

Instrukcja CASE

Instrukcja CASE może występować z selektorem 

(selektorem może być dowolnie złożone wyrażenie, 
ale najczęściej jest to jedna zmienna) lub z lista 
wyrażeń (searched CASE)

CASE selektor

WHEN wartość1 THEN polecenie1;

ELSE polecenieN;

END CASE;

CASE selektor

WHEN wyrażenie1 THEN polecenie1;

ELSE polecenieN;

END CASE;

background image

73

Pętla LOOP

Prosta pętla wykonuje się w nieskończoność. Wyjście z 

pętli jest możliwe tylko jako efekt wykonania 
polecenia EXIT lub EXIT WHEN. W każdym 
przebiegu pętli wykonuje się sekwencja poleceń. Po 
ich wykonaniu kontrola powraca do początku pętli.

LOOP 

sekwencja poleceń;
IF warunek THEN

EXIT;

END IF;

END LOOP;

LOOP 

sekwencja poleceń;
EXIT WHEN warunek;

END LOOP;

background image

74

Pętla While

WHILE warunek LOOP

sekwencja poleceń;

END LOOP;

background image

75

Pętla FOR

Pętla FOR wykonuje się określona liczbę razy. Liczba iteracji 
jest określona przez zakres podany miedzy słowami kluczowymi 
FOR i LOOP. Zakres musi być typu numerycznego, w 
przedziale –2

31

¸ 2

31

Słowo kluczowe REVERSE odwraca kierunek iteracji

Wewnątrz pętli nie wolno nadawać wartości zmiennej iterującej

Jeśli dolna granica jest wyższa ni górna granica to pętla nie 
wykona się ani razu

Obie granice zakresu iteracji nie muszą być statyczne

Zmienna iterująca nie musi być wcześniej deklarowana ani 
inicjalizowana

Do wcześniejszego wyjścia z pętli można użyć polecenia EXIT

background image

76

Pętla FOR

FOR licznik IN 

[REVERSE] dl_gr.. gór_gr LOOP

sekwencja poleceń;

END LOOP;

background image

77

Polecenia sterujące GOTO i NULL

Polecenie GOTO bezwarunkowo przekazuje kontrolę
wykonywania programu do miejsca wskazywanego przez 
etykietę związaną z poleceniem. Polecenie NULL nie wykonuje 
żadnej akcji.

Etykieta musi poprzedzać polecenie wykonywalne

GOTO nie może przeskakiwać do warunkowych części poleceń
IF-THEN-ELSE, CASE, do polecenia LOOP i do bloku 
podrzędnego

GOTO nie może wyskakiwać z podprogramu oraz procedury 
obsługi błędu

GOTO etykieta;

<<etykieta>>

NULL

;

;

background image

78

Kursory

Każde zapytanie SQL umieszczone w programie PL/SQL może zwrócić

zero, jedna bądź wiele krotek. Aby efektywnie przetworzyć krotki 
zwrócone przez zapytanie korzystamy z kursorów. Kursor jest obiektem 
związanym z zapytaniem. Programista może:

Otworzyć kursor (zidentyfikować zbiór wynikowy)

Pobrać dana do kursora (odczytać kolejną krotkę z wyniku zapytania i 
wpisać ja do kursora)

Zamknąć kursor (zwolnić obszar pamięci przydzielony kursorowi)

Kursor to nazwa obszaru roboczego, w którym mieści się wynik zapytania 

(result set). Wewnątrz kursora wyróżniamy bieżacy wiersz (current
row). Kursor może być jawny (explicit) lub niejawny (implicit).

background image

79

Deklarowanie kursora

DECLARE CURSOR nazwa [(lista 

parametrów)] 

[RETURN typ zwracany] IS zapytanieSQL;

Parametr [IN] typ [{:=|DEFAULT} wartość]

Nazwa kursora nie jest zmienn

Nazwa kursora nie jest zmienn

ą

ą

, lecz identyfikatorem. Do 

, lecz identyfikatorem. Do 

kursora nie mo

kursora nie mo

ż

ż

na przypisa

na przypisa

ć

ć

warto

warto

ś

ś

ci. Parametry s

ci. Parametry s

ą

ą

widoczne 

widoczne 

tylko wewn

tylko wewn

ą

ą

trz kursora, nie mo

trz kursora, nie mo

ż

ż

na zwi

na zwi

ą

ą

za

za

ć

ć

z nimi 

z nimi 

ż

ż

adnych 

adnych 

ogranicze

ogranicze

ń

ń

background image

80

Otwieranie kursora

Otwarcie kursora powoduje wykonanie związanego z 

nim zapytania i zidentyfikowanie zbioru wynikowego, 
zawierającego krotki spełniające kryteria 
wyszukiwania.

OPEN nazwa_kursora [(lista parametrów 

aktualnych)]

background image

81

Pobieranie z kursora

Każde wykonanie polecenia FETCH powoduje 
odczytanie bieżącego wiersza kursora i przesuniecie 
znacznika kursora na kolejny wiersz.

Na liście zmiennych musi się znajdować taka sama 
liczba zmiennych jak liczba atrybutów w kursorze. 

Odpowiednie zmienne i atrybuty musza się zgadzać
co do typu.

FETCH nazwa_kursora INTO 

lista_zmiennych | rekord

background image

82

Zamykanie kursora

Zamkniecie kursora powoduje, e kursor staje się

nieaktywny a zbiór wynikowy związany z kursorem 
staje się niezdefiniowany. Zamknięty kursor można 
powtórnie otworzyć, np. z innymi parametrami. Każde 
odwołanie się do zamkniętego (lub jeszcze nie 
otwartego) kursora powoduje błąd 
INVALID_CURSOR.

CLOSE nazwa_kursora;

background image

83

Atrybuty kursora

%FOUND – wartością atrybutu jest TRUE jeśli ostatnia operacja 
FETCH odczytała krotkę z kursora. W przeciwnym wypadku 
(tzn. kiedy odczyt się nie udał) atrybut przyjmuje wartość
FALSE. Przed pierwszym odczytem atrybut ma wartość NULL

%NOTFOUND – wartością atrybutu jest FALSE jeśli ostatnia 
operacja FETCH odczytała krotkę z kursora. W przeciwnym 
wypadku (tzn. kiedy odczyt się nie udał) atrybut przyjmuje 
wartość TRUE. Przed pierwszym odczytem atrybut ma wartość
NULL

%ROWCOUNT – wartością atrybutu jest liczba odczytanych z 
kursora krotek. Przed pierwszym odczytem atrybut ma wartość
0

%ISOPEN – wartością atrybutu jest TRUE jeśli kursor jest 
otwarty i FALSE jeśli kursor jest zamknięty.

background image

84

Obsługa wyjątków w PL/SQL

Błąd lub ostrzeżenie nazywamy w PL/SQL wyjątkiem 
(ang. exception). Wyjątki mogą być systemowe 
(dzielenie przez zero, brak wolnej pamięci, brak praw do 
obiektu) lub definiowane przez użytkownika (za niski 
budżet, za wysoka płaca, zbyt mała ilość towaru w 
magazynie).

Wystąpienie błędu jest sygnalizowane przez wywołanie 
wyjątku. Błędy systemowe sygnalizowane są
automatycznie, błędy definiowane przez użytkownika są
wywoływane ręcznie za pomocą polecenia RAISE.

Po wystąpieniu wyjątku kontrola przechodzi do 
procedury obsługi wyjątku (ang. exception handler). Po 
jej wykonaniu kontrola przechodzi do kolejnego bloku 
nadrzędnego. Jeśli procedura obsługi danego błędu nie 
zostanie znaleziona, to wykonywanie programu 
zostanie przerwane.

background image

85

Kontrola błędów

BŁĄD

background image

86

Predefiniowane wyjątki systemowe

background image

87

Zmienne podstawienia

Zmienne definiowane przez użytkownika mogą być użyte w 

miejsce nazw relacji, atrybutów lub jako wartości atrybutów. 
Zmienna podstawienia nie może być pierwszym słowem 
polecenia. Zmienne podstawienia są zawsze typu CHAR. 
Polecenie DEFINE bez parametrów wyświetla listę wszystkich 
zmiennych podstawienia.

DEFINE myTable = ‘’PRACOWNICY”

DEFINE myValue =‘’PROFESOR”

SELECT * FROM &myTable WHERE etat=&myValue

UNDEFINE myTabel

UNDEFINE myValue

background image

88

Zmienne wiązane

Zmienne wiązane to zmienne deklarowane w SQL*Plus lub innym 

środowisku zewnętrznym, które są dostępne w programach 
PL/SQL. Mogą służyć do przekazywania wartości z PL/SQL do 
SQL i do optymalizacji zapytań. W PL/SQL zachowują się jak 
zwykłe zmienne.

VARIABLE x NUMBER

BEGIN

SELECT COUNT (*) INTO:x FROM PRACOWNICY;

END;

PRINT x;

background image

89

Zmienne wiązane kursorowe

Zmienne wiązane kursorowe pozwalają na odczytanie w SQL*Plus

wyniku zapytania umieszczonego w bloku PL/SQL. Mogą być
stosowane zarówno w anonimowych blokach PL/SQL, jak i jako 
parametr lub typ wynikowy procedury lub funkcji.

VARIABLE x REFCURSOR

BEGIN

OPEN:x FOR SELECT * FROM PRACOWNICY;

END;

PRINT x;

background image

90

Procedury

Procedury (wykonują określone akcje), funkcje (wykonują obliczenia i 

zwracają wartości) i pakiety (zbierają w całość logicznie powiązane 
procedury, funkcje, zmienne i kursory): 

przechowywane w bazie danych w postaci skompilowanej i źródłowej 
(źródło dostępne poprzez USER_SOURCE)

postać skompilowana zwiększenie szybkości działania

współdzielone przez wielu użytkowników

Zalety:

rozszerzalność

Modularność

łatwość pielęgnowania kodu

możliwość wielokrotnego użycia kodu

ukrycie szczegółów implementacji

background image

91

Definiowanie procedury

CREATE [OR REPLACE] PROCEDURE nazwa_procedury

[(argument,…)] IS
……………….

BEGIN

……………….

END [nazwa_procedury];

nazwa procedury musi by

nazwa procedury musi by

ć

ć

unikalna w ramach schematu (lub

unikalna w ramach schematu (lub

pakietu)

pakietu)

mi

mi

ę

ę

dzy s

dzy s

ł

ł

owami kluczowymi IS i BEGIN umieszczamy 

owami kluczowymi IS i BEGIN umieszczamy 

deklaracje

deklaracje

wszystkich zmiennych i kursor

wszystkich zmiennych i kursor

ó

ó

w lokalnych

w lokalnych

mi

mi

ę

ę

dzy s

dzy s

ł

ł

owami kluczowymi BEGIN i END umieszczamy kod

owami kluczowymi BEGIN i END umieszczamy kod

PL/SQL, kt

PL/SQL, kt

ó

ó

ry wykonuje dana procedura

ry wykonuje dana procedura

background image

92

Argumenty procedur i funkcji

nazwa [IN|OUT| IN OUT] typ [DEFAULT wartość]

w li

w li

ś

ś

cie argument

cie argument

ó

ó

w nie podajemy rozmiaru argumentu (tylko typ)

w nie podajemy rozmiaru argumentu (tylko typ)

argument formalny: u

argument formalny: u

ż

ż

ywany w deklaracji procedury i w cz

ywany w deklaracji procedury i w cz

ęś

ęś

ci

ci

wykonywalnej PL/SQL

wykonywalnej PL/SQL

argument aktualny: u

argument aktualny: u

ż

ż

ywany przy wywo

ywany przy wywo

ł

ł

ywaniu procedury

ywaniu procedury

background image

93

Definiowanie funkcji

CREATE [OR REPLACE] FUNCTION nazwa_funkcji [(argument,…)] 

RETURN typ  IS
……………….

BEGIN

……………….

END [nazwa_funkcji];

nazwa funkcji musi by

nazwa funkcji musi by

ć

ć

unikalna w ramach schematu (lub pakietu)

unikalna w ramach schematu (lub pakietu)

po s

po s

ł

ł

owie kluczowym RETURN umieszczamy typ zwracany przez funkcj

owie kluczowym RETURN umieszczamy typ zwracany przez funkcj

ę

ę

mi

mi

ę

ę

dzy s

dzy s

ł

ł

owami kluczowymi IS i BEGIN umieszczamy deklaracje

owami kluczowymi IS i BEGIN umieszczamy deklaracje

wszystkich zmiennych i kursor

wszystkich zmiennych i kursor

ó

ó

w lokalnych

w lokalnych

mi

mi

ę

ę

dzy s

dzy s

ł

ł

owami kluczowymi BEGIN i END umieszczamy kod PL/SQL, 

owami kluczowymi BEGIN i END umieszczamy kod PL/SQL, 

kt

kt

ó

ó

ry

ry

wykonuje dana funkcja

wykonuje dana funkcja

w kodzie PL/SQL musi si

w kodzie PL/SQL musi si

ę

ę

znale

znale

źć

źć

instrukcja RETURN

instrukcja RETURN

background image

94

Wywołanie procedur i funkcji

VARIABLE nr_zesp NUMBER
VARIABLE l_asyst NUMBER
BEGIN

:nr_zesp:=20
spr_asyst(:nr_zesp,:l_asyst);

END;
PRINT l_asyst;

PL/SQL

SQL

SELECT moja_fun(argument) FROM tabela;

UWAGA: wo

UWAGA: wo

ł

ł

anie funkcji z poziomu SQL jest mo

anie funkcji z poziomu SQL jest mo

ż

ż

liwe tylko wtedy

liwe tylko wtedy

gdy funkcja posiada odpowiedni poziom 

gdy funkcja posiada odpowiedni poziom 

czysto

czysto

ś

ś

ci

ci

background image

95

Czystość funkcji

Aby funkcja mogła być wywoływana z poziomu SQL, musi 

ona posiadać odpowiedni poziom czystości

• funkcja wywoływana z instrukcji SELECT nie może 

modyfikować żadnych wartości w bazie danych

• funkcja wywoływana z instrukcji INSERT, UPDATE, 

DELETE nie może odczytywać i modyfikować żadnej 
tabeli, której dotyczy instrukcja

• funkcja wywoływana z instrukcji SELECT, INSERT, 

UPDATE, DELETE nie może zawierać instrukcji 
sterujących sesją i transakcjami oraz instrukcji DDL

background image

96

Kompilowanie i usuwanie procedur 
lub funkcji

ALTER PROCEDURE | FUNCTION nazwa 

COMPILE;

DROP PROCEDURE | FUNCTION nazwa;

background image

97

Słownik bazy danych

USER_OBJECTS - informacja o obiektach w 

schemacie użytkownika

SELECT object_name, object_type, status

FROM user_objects

WHERE object_type IN (‘PROCEDURE’,’FUNCTION’);

USER_SOURCE - kod źródłowy procedur i 

funkcji użytkownika

SELECT text

FROM user_source

WHERE name=‘NAZWA PROCEDURY’

ORDER BY line;

background image

98

Funkcje tablicowe

Funkcje tablicowe dają w wyniku kolekcję krotek. Nazwy tych 

funkcji mogą być wykorzystywane zamiast nazw tabel. Funkcje 
tablicowe mogą również przyjmować kolekcję krotek jako 
parametr. Funkcje mogą być zrównoleglone oraz potokowane, 
co zwiększa efektywność przetwarzania poprzez:

wielowątkowe wykonanie funkcji

eliminację przechowywania wyników pośrednich

zmniejszenie czasu odpowiedzi na pierwsze wyniki

iteracyjne dostarczanie kolejnych krotek wyniku

W przypadku funkcji potokowanych do dostarczenia krotki do 

wyniku służy komenda PIPE ROW (...)

background image

99

Przykład funkcji tablicowej

CREATE TYPE CharTyp AS TABLE OF VARCHAR2(20);

CREATE OR REPLACE FUNCTION FPracownicy(p_etat CHAR)
RETURN CharTyp PIPELINED AS
BEGIN

FOR x IN ( SELECT * FROM pracownicy WHERE etat=p_etat) 
LOOP

PIPE ROW (x.nazwisko);

END LOOP;
RETURN;

END FPracownicy;

SELECT * FROM TABLE( FPracownicy('ASYSTENT') );
SELECT * FROM TABLE( FPracownicy('PROFESOR') );

background image

100

Procedury wyzwalane

Procedura wyzwalana (ang. trigger) to program w języku PL/SQL 

(równie Java lub C) który reaguje na zdarzenia zachodzące w 
bazie danych i wykonuje się po zajściu określonych warunków.

Typy procedur wyzwalanych:

BEFORE - uruchamiane przed wykonaniem polecenia INSERT, 
UPDATE, DELETE

AFTER - uruchamiane po wykonaniu polecenia INSERT, 
UPDATE, DELETE

INSTEAD OF – uruchamiane zamiast polecenia INSERT, 
UPDATE, DELETE

systemowe – uruchamiane po zajściu określonego zdarzenia w 
schemacie lub bazie danych

background image

101

Cele stosowania procedur 
wyzwalanych

Zaawansowane śledzenie użytkowników

Ochrona przed nieprawidłowymi transakcjami

Wymuszanie więzów referencyjnych (albo więzów nie 
wspieranych przez deklaratywne więzy integralnościowe albo 
więzów między węzłami rozproszonej bazy danych)

Wymuszanie złożonych reguł biznesowych

Wymuszanie złożonych polityk bezpieczeństwa

Zapewnianie przezroczystego zapisu wydarzeń

Wypełnianie atrybutów wartościami domyślnymi

Modyfikacja złożonych perspektyw

Śledzenie wydarzeń systemowych

background image

102

Definiowanie procedury wyzwalanej

CREATE [OR REPLACE] TRIGGER nazwa
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE | DELETE } ON { tabela |perspektywa }
[ WHEN warunek ]
[ FOR EACH ROW]
[ DECLARE /* deklaracje zmiennych i kursorów */ ]
BEGIN
/* ciało procedury wyzwalanej */
END;

INSTEAD OF: wyzwalacz mo

INSTEAD OF: wyzwalacz mo

ż

ż

e by

e by

ć

ć

zdefiniowany tylko na

zdefiniowany tylko na

perspektywie

perspektywie

WHEN: wyzwalacz wykonuje si

WHEN: wyzwalacz wykonuje si

ę

ę

tylko dla tych krotek, dla kt

tylko dla tych krotek, dla kt

ó

ó

rych

rych

jest spe

jest spe

ł

ł

niony warunek

niony warunek

FOR EACH ROW: wyzwalacz wykonuje si

FOR EACH ROW: wyzwalacz wykonuje si

ę

ę

dla ka

dla ka

ż

ż

dej

dej

modyfikowanej krotki

modyfikowanej krotki

background image

103

Definiowanie procedury wyzwalanej

Dla procedur wyzwalanych uruchamianych na skutek uaktualnienia 

krotek, możemy określić listę atrybutów relacji, których 
uaktualnienie uruchomi procedurę.

CREATE OR REPLACE TRIGGER test

AFTER UPDATE OF placa_pod, id_zesp ON 

pracownicy ...

background image

104

Definiowanie procedury wyzwalanej

Ta sama procedura może być wrażliwa na kombinacje instrukcji 

DML (tj. INSERT, UPDATE, DELETE). (niezgodne ze 
standardem)

CREATE OR REPLACE TRIGGER test

AFTER INSERT OR UPDATE OR DELETE ON 

pracownicy

BEGIN

IF INSERTING THEN ...

ELSIF UPDATING THEN ...

END IF;

END;

background image

105

Klauzula FOR EACH ROW i WHEN

CREATE OR REPLACE TRIGGER test
BEFORE UPDATE ON pracownicy
FOR EACH ROW WHEN (OLD.placa_dod < 100)
BEGIN

IF (:NEW.placa_pod <= 100) THEN ... END IF;
IF (:NEW.etat != :OLD.etat) THEN ... END IF;

END;

w klauzuli WHEN i ciele wyzwalacza FOR EACH ROW mo

w klauzuli WHEN i ciele wyzwalacza FOR EACH ROW mo

ż

ż

na 

na 

uzyska

uzyska

ć

ć

dost

dost

ę

ę

p do starej i nowej warto

p do starej i nowej warto

ś

ś

ci atrybutu

ci atrybutu

domy

domy

ś

ś

lnie stara i nowa wersja rekordu s

lnie stara i nowa wersja rekordu s

ą

ą

dost

dost

ę

ę

pne przez nazwy 

pne przez nazwy 

OLD i NEW (w ciele wyzwalacza poprzedzane dwukropkiem), 

OLD i NEW (w ciele wyzwalacza poprzedzane dwukropkiem), 

mo

mo

ż

ż

na to zmieni

na to zmieni

ć

ć

za pomoc

za pomoc

ą

ą

klauzuli REFERENCING NEW AS 

klauzuli REFERENCING NEW AS 

n

n

dla instrukcji INSERT stara warto

dla instrukcji INSERT stara warto

ść

ść

jest pusta, dla instrukcji

jest pusta, dla instrukcji

DELETE nowa warto

DELETE nowa warto

ść

ść

jest pusta

jest pusta

background image

106

Procedura wyzwalana INSTEAD OF

Pozwala na zapewnianie modyfikowalności złożonych perspektyw.

CREATE OR REPLACE VIEW zesp_count AS

SELECT z.nazwa, count(*) AS pracownicy

FROM pracownicy p, zespoly z WHERE z.id_zesp = p.id_zesp

GROUP BY z.nazwa;

CREATE OR REPLACE TRIGGER trig_instead

INSTEAD OF INSERT ON zesp_count

FOR EACH ROW

BEGIN

INSERT INTO zespoly(id_zesp,nazwa,adres)

VALUES(80,:NEW.nazwa,NULL);

END;

background image

107

Zarządzanie procedurami 
wyzwalanymi

Wszystkie procedury wyzwalane związane z dana relacja można 

zablokować (odblokować) pojedynczym poleceniem:

ALTER TABLE nazwa_relacji DISABLE [ENABLE] ALL TRIGGERS;

Ka

Ka

ż

ż

da procedura wyzwalana mo

da procedura wyzwalana mo

ż

ż

e by

e by

ć

ć

w jednym z dw

w jednym z dw

ó

ó

ch

ch

stan

stan

ó

ó

w: odblokowania lub zablokowania. Do zablokowania

w: odblokowania lub zablokowania. Do zablokowania

(odblokowania) pojedynczej procedury wyzwalanej s

(odblokowania) pojedynczej procedury wyzwalanej s

ł

ł

u

u

ż

ż

y

y

polecenie:

polecenie:

ALTER TRIGGER nazwa DISABLE [ENABLE];

Do usuni

Do usuni

ę

ę

cia wyzwalacza s

cia wyzwalacza s

ł

ł

u

u

ż

ż

y polecenie

y polecenie

DROP TRIGGER nazwa;

background image

108

Słownik bazy danych

Informacje o procedurach wyzwalanych użytkownika mieszczą się w 

perspektywie systemowej USER_TRIGGERS

Informacje o zależnościach można podejrzeć w perspektywie słownika 

bazy danych USER_DEPENDENCIES

SELECT TRIGGER_NAME, TRIGGER_TYPE,

TRIGGERING_EVENT, TABLE_NAME, TRIGGER_BODY

FROM USER_TRIGGERS;

SELECT NAME, TYPE, REFERENCED_TYPE

FROM USER_DEPENDENCIES

WHERE REFERENCED_NAME = 'PRACOWNICY';

background image

109

Fazy cyklu 
życia 
aplikacji z 
bazą danych 

Konceptualne 

projektowanie bazy danych

Planowanie 

bazy danych

Definicja systemu

Gromadzenie 

i analiza wymagań

Projektowanie 

bazy danych

Selekcja SZBD

Projektowanie aplikacji

Logiczne projektowanie

bazy danych

Fizyczne projektowanie 

bazy danych

Tworzenie prototypów

Implementacja

Konwersja

i przenoszenie danych

Testowanie

Bieżąca konserwacja

background image

Procedury, operatory, podtablice, 
programy…

background image

Typy definiowane przez użytkownika

background image

Abstrakcyjne typy danych (ADT-
abstract data type)

background image

Abstrakcyjne typy danych-cd…

background image

Typy referencyjne

background image

Przykład użycia referencji

background image

Kolekcje – nowy typ danych

background image

Wyszukiwanie z kolekcji

background image

Duże obiekty BLOB (

b

inary

l

arge

ob

ject) CLOB 

(

c

haracter

l

arge

ob

ject)

background image

ADT - dziedziczenie

background image

Tablice z ADT, operacje  na ADT

background image

Podtablice i nadtablice

background image

Procedury w SQL3

background image

Rozszerzenia proceduralne w SQL3

background image

Rozszerzenia SQL3 w zakresie 
wyzwalaczy

background image

Podsumowanie 

background image

Podsumowanie…cd…