1
SBD, L.Banachowski
Oprogramowanie strony
serwera na przykładzie
Oracle
Część 1
Wykład 4
2
SBD, L.Banachowski
Aplikacja bazodanowa
• Tworząc aplikację, należy podjąć decyzję, jaka jej
część ma się znajdować, na:
• serwerze bazy danych,
• jaka na komputerze użytkownika (czyli po
stronie klienta).
• Dane oraz mechanizm wykonywania instrukcji SQL
- po stronie serwera.
• “Przyjazny” interfejs użytkownika – po stronie
klienta.
• Przetwarzanie danych:
• na serwerze - centralna kontrola nad spójnością
danych,
• na stacji klienckiej - precyzyjniejsza diagnostyka i
obsługa błędów.
3
SBD, L.Banachowski
Aplikacja bazodanowa
Elementy aplikacji umieszczane po stronie serwera:
1. deklaratywne więzy spójności,
2. procedury, funkcje i pakiety,
3. wyzwalacze bazy danych,
4. procedury/klasy
(serwlety)
hipertekstowe
tworzące dynamiczne strony WWW,
5. rozproszone komponenty jak klasy Javy - EJB.
4
SBD, L.Banachowski
Rozszerzenie języka SQL o elementy
języka programowania
• SQL/PSM - Standard SQL:1999
• Oracle PL/SQL
5
SBD, L.Banachowski
Więzy spójności
•
Zadaniem
więzów
spójności
jest
zagwarantowanie tego, aby dane w bazie danych
wiernie odzwierciedlały świat rzeczywisty, dla
którego baza danych została zaprojektowana.
• System bazy danych ma zapewnić, aby więzy
spójności pozostawały prawdziwe przy wszystkich
operacjach wykonywanych na bazie danych w
postaci transakcji, wyzwalaczy, ładowania danych
do bazy danych czy ich importu.
6
SBD, L.Banachowski
Deklaratywne więzy
spójności
• Więzy spójności mogą być sprawdzane zarówno po
stronie serwera jak i po stronie klienta:
• Bardziej naturalnym miejscem sprawdzania
jest serwer, który obsługuje wszystkie możliwe
aplikacje utworzone dla bazy danych. Lepiej jest
mieć jeden mechanizm gwarantujący spełnienie
więzów spójności niż wiele, potencjalnie nie
spójnych.
• Podstawowe metody określania więzów
spójności na serwerze:
• deklaratywne więzy spójności – w definicjach
tabel (instrukcje
CREATE TABLE
i
ALTER TABLE
),
• wyzwalacz bazy danych,
• osobny interfejs programistyczny API.
7
SBD, L.Banachowski
Więzy spójności
encji
Ograniczają możliwe wartości w wierszu tabeli:
• Więzy klucza głównego
PRIMARY KEY
– wartości w
określonych kolumnach jednoznacznie identyfikują
wiersz. Nie jest dopuszczalna wartość NULL w
kolumnach klucza głównego. Automatycznie jest
zakładany indeks na kolumnach tworzących klucz
główny. Tylko jeden klucz główny dla jednej tabeli.
• Więzy klucza jednoznacznego
UNIQUE
– wartości w
określonych kolumnach jednoznacznie identyfikują
wiersz. Jest dopuszczalna wartość NULL w kolumnach
klucza jednoznacznego. Automatycznie jest zakładany
indeks na kolumnach tworzących klucz jednoznaczny.
Może być więcej niż jeden klucz jednoznaczny dla
jednej tabeli.
8
SBD, L.Banachowski
Więzy spójności encji
• Więzy
NOT NULL
– w kolumnie nie jest
dozwolona wartość NULL.
• Więzy
CHECK
– warunek, który ma być
prawdziwy dla wszystkich wierszy w tabeli. Nie
może zawierać podzapytania ani funkcji zmiennych
w czasie jak Sysdate lub User. Może zawierać
nazwy jednej lub więcej kolumn.
9
SBD, L.Banachowski
Więzy spójności
referencyjnej
• Zbiór wartości w kolumnach klucza obcego jest
zawsze podzbiorem zbioru wartości odpowiadającego
mu klucza głównego lub jednoznacznego.
• Wartością klucza obcego może być NULL – wówczas
klucz obcy nie wskazuje na żaden obiekt.
• System zapewnia, aby obiekt wskazywany przez
wartość klucza obcego zawsze istniał, przy wszystkich
możliwych operacjach na tabelach, w których biorą
udział klucze główne, jednoznaczne i obce.
10
SBD, L.Banachowski
Klucze obce
• Przy definiowaniu klucza obcego nie można się
odwoływać ani do synonimu tabeli ani do tabeli
znajdującej się w innej (odległej) bazie danych.
• Nie tworzy się automatycznie indeks.
• Aby przyśpieszyć wyszukiwanie i złączanie,
projektant bazy danych może sam zaplanować
założenie indeksu na kluczu obcym przy użyciu
instrukcji
CREATE INDEX
.
11
SBD, L.Banachowski
Składnia więzów w-linii
• [NOT] NULL
• {UNIQUE|PRIMARY KEY}
• CHECK (warunek)
• REFERENCES tabela[(kolumna)][ON DELETE
CASCADE]
• REFERENCES tabela[(kolumna)][ON DELETE SET
NULL]
12
SBD, L.Banachowski
Składnia więzów-poza-linią
• {UNIQUE|PRIMARY KEY} (kolumna,…)
• CHECK (warunek)
• FOREIGN KEY (kolumna,…) REFERENCES
tabela(kolumna,…)[ON DELETE [CASCADE|SET NULL]]
CONSTRAINT nazwa_więzów
• Nadanie nazwy, przy pomocy której można się do
nich odwoływać, np. włączając je, wyłączając lub
usuwając.
13
SBD, L.Banachowski
Przykład
CREATE TABLE Pożyczki(
Num_konta NUMBER(6,0),
Num_pożyczki NUMBER(6,0),
Typ_pożyczki VARCHAR2(8)
CONSTRAINT ck_Typ_poż
CHECK (Typ_pożyczki IN
('AUTO', 'DOM', 'OSOBISTE')),
Wielkość NUMBER(8,0)
CONSTRAINT nn_Wielk
NOT NULL,
Data_pożyczki DATE DEFAULT Sysdate,
Zaakceptowana VARCHAR2(25)
CONSTRAINT
ko_Zaakcept
REFERENCES
Kierownicy (Nazwisko_kier),
CONSTRAINT kg_Poż
PRIMARY KEY(Num_konta,
Num_pożyczki),
CONSTRAINT ko_Num_konta
FOREIGN KEY (Num_konta) REFERENCES
Klienci (Num_konta)
);
14
SBD, L.Banachowski
DEFAULT
DEFAULT Sysdate
• Ustala datę pożyczki na dzień dzisiejszy, to
jest dzień wprowadzania informacji o pożyczce
do bazy danych.
• W specyfikacji wartości domyślnej mogą
występować stałe i funkcje SQL także User,
Sysdate.
• Nie mogą występować ani nazwy kolumn ani
funkcje PL/SQL ani sekwencje.
15
SBD, L.Banachowski
CHECK
• W przypadku warunku występującego w CHECK
akceptowane są wiersze, których wartością jest
TRUE
lub
NULL
System nie pozwala, aby w tabeli pojawił się
wiersz dający wartość FALSE (sygnalizowany jest
błąd).
16
SBD, L.Banachowski
Akcje referencyjne przy DELETE
•
Jeśli ma być usunięty wiersz tabeli nadrzędnej do którego
są odwołania przez klucz obcy z tabeli podrzędnej, jest błąd i
DELETE nie zostaje wykonane.
•
ON DELETE CASCADE
- razem z wierszem tabeli nadrzędnej
zostają usunięte wszystkie wiersze tabeli podrzędnej, w
których wartości klucza obcego wskazują na usuwany wiersz,
• pod warunkiem, że usunięcie tych wierszy jest
możliwe bez naruszenia innych więzów referencyjnych.
•
ON DELETE SET NULL
- przy usuwaniu wiersza, do którego
są odwołania przez wartości kluczy obcych, następuje
wstawienie pseudo-wartości NULL jako wartości klucza
obcego.
17
SBD, L.Banachowski
Inne akcje referencyjne
Standardu (nie realizowane
przez Oracle)
•
ON DELETE SET DEFAULT
– oznaczająca
wstawienie wartości domyślnej jako wartości klucza
obcego;
•
ON UPDATE [CASCADE|SET NULL|SET DEFAULT]
W Oracle można je zaprogramować za pomocą
wyzwalaczy bazy danych, pod warunkiem, że nie
zdefiniujemy deklaratywnych więzów klucza obcego.
18
SBD, L.Banachowski
CHECK
• Gdy klucz obcy składa się z kilku kolumn i w jednej z
nich jest wartość NULL, wtedy system akceptuje taką
wartość wiersza bez żadnych dodatkowych sprawdzeń.
• Gdybyśmy chcieli realizować semantykę polegającą
na tym, że albo wszystkie wartości klucza obcego są
NULL albo żadna z nich nie jest, wówczas należałoby
zagwarantować to za pomocą odpowiedniego warunku
CHECK np. :
CONSTRAINT A_B_ck CHECK (((A IS NOT NULL) AND
(B IS NOT NULL)) OR((A IS NULL) AND (B IS NULL)))
19
SBD, L.Banachowski
Operacje na więzach
ALTER TABLE Emp
ADD (CONSTRAINT Sal_ck CHECK (sal
>5000));
ALTER TABLE Emp
ENABLE CONSTRAINT Sal_ck;
ALTER TABLE Emp
DISABLE CONSTRAINT Sal_ck;
ALTER TABLE emp
DROP CONSTRAINT Sal_ck;
Więzy klucza głównego i
jednoznacznego
można
włączać,
wyłączać
i
usuwać
używając
ich
naturalnych nazw PRIMARY
KEY i UNIQUE.
20
SBD, L.Banachowski
SQL*Plus – prosty interfejs do
bazy danych
•
SET AUTOCOMMIT ON
– wykonywanie operacji
zatwierdzania COMMIT po każdej zmianie danych (a nie
tylko na koniec pomyślnej transakcji);
•
HOST polecenie
– wykonanie polecenia systemu
operacyjnego;
•
EXIT
– zakończenie sesji SQL*Plus –
wylogowanie się z Oracle;
•
DESCRIBE nazwa
– wyświetlenie schematu
obiektu (tabeli, perspektywy, procedury, funkcji) o
podanej nazwie;
•
EXECUTE nazwa_procedury (...)
– wykonanie
procedury.
21
SBD, L.Banachowski
Pliki w SQL*Plus
•
START nazwa_pliku
– wykonaj skrypt poleceń SQL
i SQL*Plus zapisany w pliku o podanej nazwie (zamiast
START można użyć@);
•
ED nazwa_pliku
– wywołaj standardowy edytor
(np. notepad albo vi);
•
SPOOL nazwa_pliku
– zapisuj kolejne polecenia i
ich wyniki w pliku o podanej nazwie;
•
SPOOL OFF
– zamknij poprzednio otwarty przez
SPOOL plik.
22
SBD, L.Banachowski
Formatowanie w SQL*Plus
•
COLUMN nazwa FORMAT An
– szerokość
wyświetlania kolumny napisowej o podanej nazwie;
•
COLUMN nazwa FORMAT 99999
– szerokość
wyświetlania kolumny liczbowej o podanej nazwie (9
reprezentuje jedną cyfrę);
•
SET PAGESIZE n
– ustalenie długości jednej strony
na n linii;
•
SET PAUSE ON
– zatrzymywanie przewijania
wyświetlania wyników po wyświetleniu zawartości
ekranu;
23
SBD, L.Banachowski
Zmienne w SQL*Plus
•
VARIABLE X NUMBER
(lub
CHAR(n)
lub
VARCHAR(n)
, n>0) – deklaracja zmiennej wiązania;
•
EXECUTE :X:= wyrażenie;
– przypisz zmiennej
wiązania
:X
wartość wyrażenia. Po ustaleniu wartości
można zmienne wiązania poprzedzone dwukropkiem
używać w instrukcjach SQL i PL/SQL.
•
PRINT X
– wypisz wartość zmiennej wiązania X;
•
ACCEPTZmienna PROMPT 'Podaj wartość
zmiennej: '
- utworzenie zmiennej podstawienia i
wczytanie na nią wartości. Następnie można zmienne
podstawienia poprzedzone znakiem & używać w
instrukcjach SQL i PL/SQL.
24
SBD, L.Banachowski
Język PL/SQL
Język
PL/SQL
jest proceduralnym rozszerzeniem
języka SQL i stanowi podstawę do pisania aplikacji
Oracle – jest mianowicie dostępny w różnych
programach narzędziowych ORACLE np.
1. SQL*Plus,
2. Developer 2000 (Oracle*Forms i Oracle*Reports),
3. prekompilatory,
4. procedury,
5. wyzwalacze,
6. aplikacje na stronach WWW.
25
SBD, L.Banachowski
Blok anonimowy
DECLARE
deklaracje obiektów PL/SQL jak zmienne, stałe,
wyjątki, procedury, funkcje
BEGIN
ciąg instrukcji do wykonania
EXCEPTION
obsługa wyjątków (błędów)
END;
• Deklaracje i obsługa wyjątków są opcjonalne. Bloki
mogą być zagnieżdżone.
• Instrukcje SQL w bloku PL/SQL: SELECT, INSERT,
UPDATE, DELETE, COMMIT i ROLLBACK.
26
SBD, L.Banachowski
Przykład
DECLARE
v_stan NUMBER(5);
BEGIN
SELECT Stan INTO v_stan FROM
Magazyn
WHERE Produkt =
'Fiat';
IF v_stan > 0 THEN
UPDATE Magazyn SET Stan =
Stan - 1
WHERE Produkt = 'Fiat';
INSERT INTO Zakupy
VALUES ('Kupiono Fiata',
Sysdate);
ELSE
INSERT INTO Zakupy
VALUES ('Brak Fiatów',
Sysdate);
END IF;
COMMIT;
EXCEPTION
WHEN no_data_found THEN
INSERT INTO dziennik
VALUES('Nie znaleziono
FIATa');
END;
27
SBD, L.Banachowski
Komentarze
• między nawiasami /* i */ , albo
• od dwóch kresek -- do końca bieżącej linii.
28
SBD, L.Banachowski
Deklaracje zmiennych i
stałych
v_zarobki NUMBER(7,2);
pi CONSTANT NUMBER(7,5) := 3.14159;
v_nazwisko VARCHAR2(25) := 'Kowalski';
v_data DATE := Sysdate;
żonaty BOOLEAN := False;
liczba_dzieci BINARY_INTEGER :=0;
29
SBD, L.Banachowski
Deklaracje zmiennych i
stałych
• Deklaracji zmiennych tych samych typów nie można
łączyć razem jak w innych językach!
• W PL/SQL są dostępne typy danych z języka SQL a
ponadto m.in.
•
BOOLEAN
- wartości logiczne,
•
BINARY_INTEGER
- typ liczb całkowitych –
niezależny od podtypów typu NUMBER i przez to
wymagający przy zapisie mniej miejsca w pamięci
RAM.
• Nie należy zmiennej nadawać tej samej nazwy co
kolumnie w tabeli.
• Wewnątrz bloku PL/SQL instrukcja SELECT nie
wypisuje wyników na ekran (ani do pliku).
• Zmienne i stałe PL/SQL mogą występować w
instrukcjach SQL.
30
SBD, L.Banachowski
Wprowadzanie danych z
klawiatury i wypisywanie na
ekran
SET ServerOutput ON
ACCEPT rocz_zarob PROMPT 'Podaj roczne zarobki: '
DECLARE
mies NUMBER(9,2) := &rocz_zarob;
BEGIN
mies := mies/12;
DBMS_OUTPUT.PUT_LINE ('Miesięczne zarobki = '
||mies);
END;
/
31
SBD, L.Banachowski
Wprowadzanie danych z
klawiatury i wypisywanie na
ekran
ACCEPT rocz_zarob PROMPT 'Podaj roczne
zarobki: '
VARIABLE mies NUMBER
BEGIN
:mies := &rocz_zarob/12;
END;
/
PRINT Mies
32
SBD, L.Banachowski
Zmienne systemowe
•
SQL%ROWCOUNT
-- liczba wierszy przetworzonych
przez ostatnią instrukcję SQL;
•
SQL%FOUND
= TRUE jeśli został znaleziony
(przetworzony) przynajmniej jeden wiersz;
•
SQL%NOTFOUND
= TRUE jeśli żaden wiersz nie
został znaleziony (przetworzony);
•
SQLERRM
- tekstowa informacja o błędzie;
•
SQLCODE
- kod błędu.
Obu zmiennych SQLERRM i SQLCODE można używać
tylko w sekcji EXCEPTION!
33
SBD, L.Banachowski
Przykład
•
Przykład użycia zmiennej SQL%ROWCOUNT do
obliczenia liczby usuwanych działów o numerze 50:
DECLARE usunięte NUMBER;
BEGIN
DELETE FROM Dept WHERE Deptno = 50;
usunięte := SQL%ROWCOUNT;
INSERT INTO Dziennik
VALUES ('Dział', usunięte,
Sysdate);
END;
34
SBD, L.Banachowski
Instrukcja SELECT w PL/SQL
Aby instrukcja była poprawna, instrukcja SELECT …
INTO musi zwracać dokładnie jeden wiersz
wyników!
SELECT Ename
INTO v_ename
FROM Emp
WHERE Empno = 1030;
Wartości w bloku PL/SQL, pochodzą na ogół z bazy
danych, gdzie został określony ich typ danych. W
związku z tym, wygodnie jest określać typ danych
jako ''typ danych wymienionej kolumny'' np.
Emp.Ename%TYPE
35
SBD, L.Banachowski
Standardowe, nazwane
wyjątki
•
dup_val_on_index
(ta sama wartość w indeksie
jednoznacznym),
•
no_data_found
(instrukcja SELECT nie zwróciła
wartości dla zmiennych w klauzuli INTO),
•
too_many_rows
(instrukcja SELECT zwróciła
więcej niż jeden wiersz wartości dla zmiennych w
klauzuli INTO),
•
zero_divide
(dzielenie przez zero),
•
timeout_on_resource
(zbyt długie oczekiwanie
na zasoby),
•
invalid_cursor
(niepoprawna operacja na
kursorze),
•
invalid_number
(niepoprawna konwersja na
liczbę).
36
SBD, L.Banachowski
Wyjątki
…..
SELECT Ename, Job INTO v_ename, v_job
…..
EXCEPTION
WHEN
no_data_found
THEN
INSERT INTO Dziennik VALUES ('Nikt nie zatrudniony
w 1993');
DBMS_OUTPUT.Put_line('Nikt nie zatrudniony w 93');
WHEN
too_many_rows
THEN
INSERT INTO Dziennik VALUES ('Więcej niż 1
zatrudniony w 1993');
DBMS_OUTPUT.Put_line('Więcej niż 1 w 93');
WHEN
OTHERS
THEN -- Obsługa pozostałych błędów
komunikat := 'Błąd nr.= ' ||
SQLCODE|| ',
komunikat= ' || Substr(SQLERRM,1,100);
-- SQLCODE i SQLERRM nie mogą wystąpić
w instrukcji SQL!
INSERT INTO Dziennik VALUES (komunikat);
DBMS_OUTPUT.Put_line(‘Wystąpił inny błąd ');
END;
37
SBD, L.Banachowski
Obsługa wyjątków
• Jeśli blok, w którym wystąpił błąd, zawiera
obsługę tego błędu, to po dokonaniu obsługi,
sterowanie jest w zwykły sposób przekazywane do
bloku go zawierającego (nadrzędnego).
• Jeśli nie zawiera, następuje przekazanie błędu do
bloku zawierającego dany blok i albo tam nastąpi
jego obsługa albo błąd przechodzi do środowiska
zewnętrznego.
38
SBD, L.Banachowski
Obsługa wyjątków
• Błąd, który wystąpił w sekcji wykonawczej bloku
(między BEGIN i END) jest obsługiwany w sekcji
EXCEPTION tego samego bloku. Błędy, które wystąpią w
sekcji deklaracji lub w sekcji wyjątków są przekazywane
do bloku zawierającego dany blok.
• Dobra praktyka programistyczna wymaga aby każdy
błąd został obsłużony – ewentualnie w klauzuli WHEN
OTHERS THEN najbardziej zewnętrznego bloku.
• Aby móc stwierdzić, która instrukcja SQL
spowodowała błąd:
• można używać podbloków z własną obsługą
błędów, albo
• można używać licznika, zwiększającego się o
jeden po wykonaniu każdej instrukcji SQL.
39
SBD, L.Banachowski
Instrukcje warunkowe
IF warunek THEN ciąg_instrukcji
END IF;
IF warunek THEN
ciąg_instrukcji
ELSE
ciąg_instrukcji
END IF;
IF warunek THEN
ciąg_instrukcji
ELSIF warunek THEN
ciąg_instrukcji
END IF;
• Instrukcje po THEN są
wykonywane
wtedy,
gdy
wartością warunku jest TRUE.
• Instrukcje po ELSE są
wykonywane
wtedy,
gdy
wartością warunku jest FALSE
lub NULL.
40
SBD, L.Banachowski
Instrukcje iteracji
LOOP
ciąg instrukcji (w tym EXIT lub EXIT WHEN
warunek)
END LOOP;
FOR zmienna IN wartość1 .. wartość2
LOOP … END LOOP;
WHILE warunek
LOOP … END LOOP;
41
SBD, L.Banachowski
Instrukcja pusta
Null
– na przykład, gdy obsługa wyjątku jest
pusta.
42
SBD, L.Banachowski
Zmienne wierszowe
DECLARE
rek_osoby Emp%ROWTYPE; /* Typ wierszowy
*/
BEGIN
SELECT * INTO rek_osoby
FROM Emp WHERE Ename = 'KOWALSKI';
rek_osoby.Sal := 1.1*rek_osoby.Sal;
INSERT INTO Dziennik
VALUES (rek_osoby.Ename, rek_osoby.Job,
rek_osoby.Sal, SYSDATE);
END;
Zmiennej wierszowej nie można użyć bezpośrednio
po słowie kluczowym VALUES w instrukcji INSERT
INTO!
43
SBD, L.Banachowski
Rekordy PL/SQL, zmienne
rekordowe
TYPE Typ_rek_prac IS RECORD
( numer_prac NUMBER(4) NOT NULL,
nazwisko VARCHAR2(40) NOT
NULL,
zarobki NUMBER(8,2),
num_działu NUMBER(4));
rekord_prac Typ_rek_prac;
Typy rekordowe mogą być zagnieżdżone. Dostęp do
pól rekordu jest przy pomocy notacji kropkowej. Na
zmienną rekordową można przypisać wartość innej
zmiennej rekordowej, ale tylko tego samego typu
rekordowego. Można ich używać w klauzuli INTO
(tak jak zmiennych wierszowych):
SELECT * INTO rekord_prac
FROM Pracownicy
WHERE Id_prac =
12;
44
SBD, L.Banachowski
Wyjątki definiowane przez
programistę
Wyjątki można deklarować samemu (w sekcji
DECLARE) używając słowa kluczowego EXCEPTION
nazwa_wyjątku EXCEPTION;
powodować ich podniesienie (w sekcji instrukcji)
RAISE nazwa_wyjątku;
a następnie je obsługiwać (w sekcji EXCEPTION)
WHEN nazwa_wyjątku THEN ...
45
SBD, L.Banachowski
Przykład
DECLARE
brak_w_magazynie
EXCEPTION
;
v_liczba NUMBER(5);
BEGIN
SELECT Liczba
INTO v_liczba
FROM Magazyn WHERE Marka =
'Fiat';
IF v_liczba < 1 THEN
RAISE
brak_w_magazynie
;
END IF;
EXCEPTION
WHEN
brak_w_magazynie
THEN
INSERT INTO Zamówienia
VALUES ('Fiaty');
RAISE
wyjście;
END;
46
SBD, L.Banachowski
Podnoszenie wyjątku za pomocą
Raise_Application_Error
• Przypisanie mu numeru między –20000 a –20999 i
tekstu.
• Wyjątek taki może zostać obsłużony albo w tym
samym bloku albo w aplikacji zewnętrznej, w której to
wywołanie zostanie wykonane.
DECLARE
numer INTEGER;
BEGIN .....
Raise_Application_Error(-20100,'Błąd');
EXCEPTION
WHEN OTHERS THEN
numer:=SQLCODE;
IF numer= -20100 THEN
Dbms_output.Put_line('Błąd
przechwycony!');
END IF;
END;
47
SBD, L.Banachowski
Obsługa błędów
przechwytywanych przez serwer
bazy danych
Nadanie nazwy wyjątkowi systemowemu - w sekcji
deklaracji
nazwa_wyjątku EXCEPTION;
PRAGMA
EXCEPTION_INIT
(
nazwa_wyjątku
,
numer_błędu);
a następnie obsługa (w sekcji EXCEPTION)
WHEN nazwa_wyjątku THEN ...
48
SBD, L.Banachowski
Przykład
Przykład obsługi błędu naruszenia więzów klucza
obcego nr -2292:
DECLARE
bl_klucz_o
EXCEPTION;
PRAGMA EXCEPTION_INIT (
bl_klucz_o
, -2292);
v_deptno Dept.Deptno%TYPE := :b_deptno;
BEGIN
DELETE FROM Dept
WHERE Deptno = v_deptno;
COMMIT;
EXCEPTION
WHEN
bl_klucz_o
THEN
Dbms_output.Put_line ('Nie można usunąć działu
' ||
To_Char(v_deptno) || ', w którym są pracownicy. ');
END;
49
SBD, L.Banachowski
Etapy budowy systemu
informatycznego dla
przedsiębiorstwa
1
.
To, co klient
zamówił
50
SBD, L.Banachowski
Etapy budowy systemu
informatycznego dla
przedsiębiorstwa
2
. To, co
analityk
zrozumiał
51
SBD, L.Banachowski
Etapy budowy systemu
informatycznego dla
przedsiębiorstwa
3
. To, co
opisywał
projekt
52
SBD, L.Banachowski
Etapy budowy systemu
informatycznego dla
przedsiębiorstwa
4
. To, co
wykonali
programiści
53
SBD, L.Banachowski
Etapy budowy systemu
informatycznego dla
przedsiębiorstwa
5
. Projekt po
uruchomieniu
i wdrożeniu
54
SBD, L.Banachowski
Etapy budowy systemu
informatycznego dla
przedsiębiorstwa
6
. To, za co
klient zapłacił
55
SBD, L.Banachowski
Etapy budowy systemu
informatycznego dla
przedsiębiorstwa
7
. A to, czego
klient
potrzebował
56
SBD, L.Banachowski