IBM DB2 – Procedury składowane

Transkrypt

IBM DB2 – Procedury składowane
IBM DB2 –
Procedury składowane
Opracowanie:
Aleksandra Werner
Laboratorium Baz Danych. IBM DB2 – procedury
Spis tre ci
1
2
WPROWADZENIE ........................................................................................... 1
PODSTAWOWA STRUKTURA PROCEDURY ................................................ 3
2.1
Parametry ............................................................................................................................................. 4
2.1.1
Typy danych ................................................................................................................................. 4
2.2
Własno ci procedury ........................................................................................................................... 5
2.2.1
Otrzymywanie zbioru wynikowego .............................................................................................. 6
2.3
Parametry kontrolne procedury, kontroluj ce sposób tworzenia procedury ................................ 7
2.4
Ciało procedury ................................................................................................................................... 7
2.4.1
Rejestry ......................................................................................................................................... 8
3
3.1
4
WYKONYWANIE PROCEDUR ........................................................................ 8
Dynamiczny SQL ................................................................................................................................. 9
ELEMENTY J ZYKA SQL PL ......................................................................... 9
4.1
Sekwencje ........................................................................................................................................... 10
4.2
Instrukcje steruj ce ........................................................................................................................... 10
4.3
Kursory ............................................................................................................................................... 11
4.3.1
Kursory FOR UPDATE .............................................................................................................. 12
4.3.2
Kursory WITH HOLD ................................................................................................................ 12
4.3.3
Kursory READ ONLY ............................................................................................................... 12
4.3.4
Kursory WITH RETURN ........................................................................................................... 13
4.4
Podstawowa obsługa bł dów ............................................................................................................. 13
4.4.1
SQLCODE/SQLSTATE ............................................................................................................. 13
4.4.2
Deklaracja warunku i zgłoszenia CONDITION FOR................................................................. 13
4.4.3
SIGNAL/RESIGNAL ................................................................................................................. 14
4.4.4
GET DIAGNOSTICS ................................................................................................................. 15
4.5
Zło ony SQL ...................................................................................................................................... 15
5
5.1
5.2
PROCEDURY ................................................................................................. 16
External Stored Procedures .............................................................................................................. 16
Procedury rejestrowe (registering stored procedures) ................................................................... 16
6 SQL – PSM (ROZSZERZENIA PERSISTENT STORED MODULE) - J ZYK
SKRYPTOWY DO DEKLARACJI I ZARZ DZANIA PROCEDURAMI.................... 17
6.1
6.2
6.3
7
8
Kompilacja procedury ...................................................................................................................... 17
Etapy wdra ania procedur ............................................................................................................... 17
Opcje kompilacji i reoptymalizacji .................................................................................................. 17
KONCEPCJA NAZYWANIA PROCEDUR ..................................................... 18
UDF ................................................................................................................ 18
-2-
IBM DB2 – Procedury składowane
1
1
Wprowadzenie
Procedury składowane s obiektami aplikacji bazodanowej.
Procedury s nazwanymi blokami PL/SQL'a, które mog pobiera parametry i by wykonywane. Rozró nia
si dwa typy podprogramów: procedury i funkcje.
−
−
−
−
−
procedury pozwalaj na enkapsulacj kodu, co poprawia m.in. debugowanie
zmiany w schemacie bazy wpływaj na zmian kodu ródłowego tylko w jednym miejscu, co jest raczej
zadaniem DBA a nie rewizji całego kodu
poniewa procedury składowane rezyduj na serwerze, mo na za ich pomoc
ci lej kontrolowa
bezpiecze stwo przestrzeni klienta
poniewa procedury składowane s kompilowane i przechowywane poza aplikacj , mog u ywa takich
zmiennych w SQL-u jak: hasła i dane osobowe, których zwykle unika si w skryptach czy zdalnych
wywołaniach
redukuj ruch w sieci.
DB2 pozwala na kodowanie procedur w dowolnym, potrzebnym j zyku. Istniej dwa rodzaje procedur
składowanych:
1. procedury SQL
2. procedury zewn trzne - zwykle pisane w C, a obecnie w Javie, COBOL-u, C++, Visual Basic-u,
REXX-ie. - jednym z typów s Java stored procedures.
Wywołanie procedury składowanej jest traktowane jako zwykłe wywołanie zewn trzne. Procedura mo e
by wywoływana lokalnie (na tym samym systemie, co działaj ca aplikacja) lub na innym systemie. Procedury
składowane s u yteczne w rodowisku rozproszonym, gdy poprawiaj wydajno rozproszonych aplikacji
przez redukcj ruchu informacji w sieci komunikacyjnej.
Np. je eli aplikacja kliencka potrzebuje wykona kilka operacji bazodanowych na serwerze zdalnym, mo na
wyda wiele ró nych da bazodanowych ze strony klienta lub wywoła procedur składowan .
W pierwszym przypadku startuje si dialog z systemem zdalnym za ka dym razem, gdy wydaje si jakie
danie. W przypadku drugim – tylko z danie wywołania (call) i parametry przekazywane s po linii.
Tak wi c procedury składowane mog by u ywane dla ró nych celów aplikacyjnych:
• wykonania sekwencji operacji na zdalnej maszynie
• kontroli dost pu do obiektów bazodanowych
• wykonania niebazodanowych funkcji
Wyobra my sobie nast puj c sytuacj :
Pewne przedsi biorstwo ma kilka central, w których znajduj si serwery i oddziałów, w których znajduj
si systemy klienckie. U ytkownicy oddziałów pracuj na aplikacji FAKTURA, która aktualizuje 3 tabele na
serwerze:
1. tabel FAKTURA
2. tabel KLIENT
3. tabel SALDO
Rekord faktury jest zaznaczany (flagowany) markerem „czyszcz cym”, a nast pnie odpowiedni rekord tabeli
KLIENT jest aktualizowany przez odliczenie kwoty faktury od bie cej (całkowitej) kwoty znajduj cej si na
koncie. Na koniec, aktualizowane jest saldo.
Poni szy diagram ilustruje aplikacj rozproszon , która była zaimplementowana bez ??? procedur
składowanych.
2
IBM DB2 – Procedury składowane
system klienta
Aplikacja rozproszona bez procedur
UPDATE
faktury
Server
faktura
UPDATE
klienta
klient
UPDATE
salda
saldo
oddział
Aplikacja rozproszona z procedur
Centrala
mojaproc
UPDATE
faktury
faktura
EXEC SQL
UPDATE
klienta
CALL mojaproc
ENDEXEC
klient
UPDATE
salda
saldo
Porównanie procedut składowanych, triggerów i UDF-ów.
Procedury składowane
wywołanie
rodowisko
j zyk
metoda
konwersacji
wykonanie polecenia
CALL
rozproszone/nierozproszone
aplikacje
jakikolwiek program
zawieraj cy JAVA
jawne, dwustronne
przekazywanie parametrów
Triggery
UDF
bazodanowe WE/WY
jako funkcja w zdaniu SQL
rozproszone/nierozproszone
aplikacje
jakikolwiek program
zawieraj cy JAVA
niejawne przesyłanie
parametrów systemu
rozproszone/nierozproszone
aplikacje
jakikolwiek program
zawieraj cy JAVA
jawne, dwustronne
przekazywanie parametrów
DB2 ma swój j zyk „DB2 SQL Procedural Language - SQL PL”. Ten j zyk jest u ywany nie tylko w
procedurach składowanych, ale równie w funkcjach u ytkownika UDFs, triggerach i dynamicznym SQL-u.
Oto przykład procedury SQL, która mo e by u yta do kontroli operacji bazodanowej.
-2-
3
IBM DB2 – Procedury składowane
CREATE PROCEDURE administrator.update_sal
( IN empNum CHAR(6), IN rating SMALLINT)
LANGUAGE SQL
BEGIN
IF rating = 1 THEN
UPDATE employee
SET salary = salary * 1.10, bonus = 1500
WHERE empno = empNum;
ELSE
UPDATE employee
SET salary = salary * 1.05, bonus = 1000
WHERE empno = empNum;
END IF;
END
2
Podstawowa struktura procedury
Procedur tworzy si przy u yciu polecenia CREATE PROCEDURE
Najprostsza procedura:
CREATE PROCEDURE proc01 ()
BEGIN
END @
CREATE PROCEDURE nazwa
( <lista parametrów>)
<wła ciwo ci procedury>
<parametry kontrolne procedury>
BEGIN
ciało_procedury
END
CREATE PROCEDURE nazwa
( | IN | OUT | INOUT parametr typ)
LANGUAGE SQL
dla LUW nie trzeba
[EXTERNAL ACTION | NO EXTERNAL ACTION] tylko dla LUW - wtedy, gdy akcja zmienia stan
obiektu nie zarz dzanego przez DB2
[SPECIFIC nazwa_specyfikacji czyli inaczej unikalna nazwa procedury]
[DYNAMIC RESULT SETS liczba]
[NOT DETERMINISTIC | DETERMINISTIC]
[CALLED ON NULL INPUT]
BEGIN
ciało_procedury
END
Kiedy nazwa procedury nie jest kwalifikowana, schemat procedury jest wyznaczany na podstawie schematu
bie cego - czyli autoryzowanego identyfikatora bie cego u ytkownika.
-3-
4
IBM DB2 – Procedury składowane
Kwalifikowane nazwy - np.
db2admin.reademp.
Uwaga! Nie mo e to by schemat SYS!
2.1
Parametry
Definicja parametrów składa si z 3 cz ci:
1. trybu definiuj cego czy parametr jest WE (IN), WY (OUT), czy WE/WY (INOUT). Parametr w
trybie INOUT pozwala przekaza warto do wywoływanego podprogramu i zwróci warto na
zewn trz wywoływanego podprogramu. Wewn trz programu taki parametr zachowuje si
zainicjowana zmienna
2. nazwy parametru
3. SQL-owego typu i rozmiaru danych tego parametru
CREATE PROCEDURE update_pensja
(IN nr_prac INTEGER,
IN procent_wzrostu DECIMAL(4,2),
INOUT ilosc_prac INTEGER,
OUT zaktualizowana_pensja DECIMAL(5,2))
Procedura mo e te nie mie
adnych parametrów, a nawiasy mog by wtedy pomini te.
...
CREATE PROCEDURE update_pensja LANGUAGE SQL BEGIN ...
lub:
CREATE PROCEDURE update_pensja() LANGUAGE SQL BEGIN ..
2.1.1
Typy danych
Mog by typy 2 kategorii:
−
−
wbudowane - Integer (Smallint, Bigint), Decimal (Numeric), Real (Double), Char, Varchar, CLOB (1bajtowe Character Large Object), GRAPHIC, DBCLOB (2-bajtowe Character Large Object), BLOB (Binary
Large Objects), Date, Time, Timestamp, ROWID (iSeries)
u ytkownika - UDT (User-defined Data Types).
Dla typów wbudowanych String mo na specyfikowa podtypy - np. kolumny CHAR i VARCHAr mog
by definiowane jako FOR BIT DATA eby przechowywa dane binarne.
Do tworzenia typów UDT u ywa si :
CREATE DISTINCT TYPE nazwa AS ródłowy_typ_danych WITH COMPARISIONS
Klauzula WITH COMPARISIONS pozwala na u ycie operatorów dostarczonych przez system dla
ródłowych typów danych. Ta klauzula nie jest dozwolona dla typów ródłowych: BLOB, CLOB, DBCLOB,..
Niech przykładowo zdefiniowano 2 zmienne:
DECLARE v_w_milach DOUBLE;
DECLARE v_w_kilometrach DOUBLE;
Chc zapobiec wykoniu nieprawidłowej operacji typu:
* IF (v_w_milach > v_w_kilometrach) - (nie mog
porówna bez konwersji)
Mog wobec tego stworzy 2 typy:
-4-
5
IBM DB2 – Procedury składowane
CREATE DISTINCT TYPE mile AS DOUBLE WITH COMPARISIONS
CREATE DISTINCT TYPE kilometry AS DOUBLE WITH COMPARISIONS
Teraz mog zadeklarowa zmienne:
DECLARE v_w_milach MILE;
DECLARE v_w_kilometrach KILOMETRY;
... i teraz dostan bł d SQL-owy je eli wykonam *.
W momencie stworzenia UDT, DB2 generuje 2 funkcje rzutowania ???????:
−
−
jedna rzutuje z UDt na typ ródłowy - MILE (DOUBLE)
druga rzutuje na odwrót - DOUBLE (MILE).
Podobnie si dzieje dla KILOMETRY.
Tak wi c, eby zadziałało polecenie:
IF (v_w_milach > 30.0)
trzeba napisa :
IF (v_w_milach > MILE (DOUBLE(v_w_kilometrach)/1,6))
IF (v_w_milach >MILE(30.0))
2.2
Własno ci procedury
Własno ci procedury to: j zyk, liczba oczekiwanych zbiorów wynikowych, itd.
Klauzula SPECIFIC jest wa na, kiedy wymagana jest definicja procedury o tej samej nazwie, ale z inn
liczb parametrów - tzw. przeładowanie - ale dotyczy to tylko iSeries i LUW (Linux, Unix i Windows).
CREATE PROCEDURE suma (IN p_a INTEGER, IN p_b INTEGER, OUT p_s INTEGER)
LANGUAGE SQL
SPECIFIC suma_ab
BEGIN
SET p_s = p_a + p_b;
END
CREATE PROCEDURE suma (IN p_a INTEGER, IN p_b INTEGER, IN p_c INTEGER, OUT p_s INTEGER)
LANGUAGE SQL
SPECIFIC suma_abc
BEGIN
SET p_s = p_a + p_b + p_c;
END
Podczas wywołania procedury suma DB2 wyznacza wersj procedury na podstawie liczby parametrów.
CALL suma(100, 200, ?)
-5-
6
IBM DB2 – Procedury składowane
Natomiast niedozwolone jest definiowanie procedur p tej samej nazwie z t sam liczb parametrów
ró nego typu.
Co trzeba zrobi , eby usun
−
−
tak „ przeładowan ” procedur ?
wyspecyfikowa parametry procedury w poleceniu DROP PROCEDURE np. DROP PROCEDURE suma(INTEGER, INTEGER, INTEGER)
u y DROP SPECIFIC PROCEDURE - np. DROP SPECIFIC PROCEDURE suma_ab
Taka nazwa specyfikacji mo e te by u yta w zdaniu COMMENT ON np. COMMENT ON SPECIFIC PROCEDURE suma_abc IS ‘To jest 3-parametrowa wersja procedury’
W LUW je eli nazwa specyfikacji nie jest podana jawnie podczas tworzenia procedury, DB2 generuje
unikaln nazw składaj c si z SQL i znacznika czasowego:SQLyymmddhhmmsshhn
Klauzula DETERMINISTIC pozwala na okre lenie procedury, która zwraca te same wyniki dla ka dego
wywołania z identycznymi parametrami wej ciowymi i ma słu y dalszej poprawie wydajno ci.
Klauzula CALLED ON NULL INPUT oznacza, e procedura b dzie zawsze wywoływana nawet, je eli jej
parametry wej ciowe b d NULL-ami.
W opcji RESULT SETS podaje si maksymaln liczb zbiorów wynikowych.
2.2.1
Otrzymywanie zbioru wynikowego
eby zwróci zbiór wynikowy do aplikacji wywołuj cej, procedura potrzebuje deklaracji kursora dla wybranych
wierszy. Wiele zbiorów wynikowych mo e by zwróconych, ale ka dy z nich wymaga niezale nego zdania DECLARE
CURSOR.
Przykład:
CREATE PROCEDURE GetCusName()
RESULT SETS 1 tu podaj max. liczb zbiorów wyn.
LANGUAGE SQL
BEGIN
DECLARE c1 CURSOR WITH RETURN FOR kursor u yto po to, aby zwróci zbiór
SELECT nazwisko FROM klient ORDER BY nazwisko
OPEN c1;
END
DECLARE rs1 RESULT_SET_LOCATOR VARYING;
CALL procedure1();
ASSOCIATE RESULT SET LOCATOR (rs1, rs2)
WITH PROCEDURE procedure1;
ALLOCATE cursor1 CURSOR FOR RESULT SET rs1;
ALLOCATE cursor2 CURSOR FOR RESULT SET rs2;
FETCH FROM cursor1 INTO var1, var2 ;
FETCH FROM cursor2 INTO var3 ;
Kursor jest zamykany przez program wywołuj cy po zwróceniu zbioru wynikowego.
-6-
7
IBM DB2 – Procedury składowane
2.3
Parametry kontrolne procedury, kontroluj ce sposób tworzenia procedury
Ustawia si je poleceniem SET OPTION. Do tych parametrów zalicza si :
− DBGVIEW - generuje informacje do debugowania,
− OUTPUT - wylistowuje wyj cie,
− TGTRLS - generuje kod dla OS/400.
2.4
Ciało procedury
BEGIN
DECLARE <deklaracja_zmiennych>
DECLARE CURSOR <deklaracja_kursorów>
<deklaracja_wyj tków>
<zdania_SQL>
END
Dobrym zwyczajem jest wstawianie komentarzy:
--
−
poprzedzanych symbolami
−
otoczonych - jak w C - symbolami /* .... */
Zmienne musz by deklarowane na pocz tku bloku BEGIN/END przed jakimikolwiek zdaniami SQL. W
przeciwnym wypadku wyst pi bł d. Zmienne musz mie nazw ró n od nazw kolumn tych tabel, do których
odwołuje si procedura (ale bł d nie wyst pi). Najlepiej poprzedza nazwy zmiennych v_ a nazwy parametrów
p_. Po zadeklarowaniu zmiennych, s one inicjalizowane NULL-ami, chyba, e u yta zostanie klauzula
DEFAULT inicjalizuj ca zmienn pewn warto ci .
DECLARE v_nr_prac VARCHAr(6);
DECLARE v_total, v_liczba INTEGER DEFAULT 0;
Mo na ustawi warto pojedynczej zmiennej u ywaj c SET, lub polece SELECT i FETCH w kombinacji
z INTO. Polecenie VALUES u ywane jest do wyliczenia warto ci rejestru i zwi zania z ni pewnej zmiennej.
SET v_total = v_total + 1
SELCT max(pensja) INTO v_max FROM prac;
VALUES CURRENT DATE INTO v_date;
Przykład prostej procedury, aktualizuj cej zbiór nowym nazwiskiem klienta na podstawie numeru i nowego
nazwiska klienta:
CREATE PROCEDURE update_klient
(IN nr CHARACTER(5),
IN nazwisko CHARACTER(20))
LANGUAGE SQL
UPDATE klient SET nazw_klienta = nazwisko WHERE nr_klienta = nr;
-7-
8
IBM DB2 – Procedury składowane
2.4.1
Rejestry
W DB2 istniej specjalne rejestry, b d ce rejestrami pami ciowymi pozwalaj cymi DB2 dostarcza
aplikacji informacji o jej rodowisku. Do tych rejestrów mo na si odwoływa w zdaniach SQL.
modyfikowalneM
niemodyfikowalne
Najcz ciej u ywa si nast puj cych rejestrów:
−
−
−
−
−
−
−
−
−
−
−
CURRENT DATE - data na serwerze
CURRENT TIME CURRENT TIMESTAMP CURRENT ISOLATION - poziom izolacji dla dynamicznego zdania SQL w ramach bie cej sesji
CURRENT LOCK TIMEOUT - liczba sekund, które aplikacja musi odczeka eby uzyska blokad - mo na
modyfikowa M
CURRENT PATH - mo na modyfikowa M. cie ka jest list schematów, które DB2 (kolejno!) przeszukuje
eby zlokalizowa procedur . Domy ln cie k w LUW jest: ‘SYSIBM’, ‘SYSFUN’, ‘SYSPROC’,
‘DB2ADMIN’
CURRENT PACKAGE PATH - M
CURRENT SCHEMA - M nazwa schematu u ywana do kwalifikowania niekwalifikowanych obiektów
bazodanowych. Mo na modyfikowa przez SET CURRENT SCHEMA
USER - ID autoryzacji u ywany do poł czenia z baz
SESSION USER - ID autoryzacji u ywany dla bie cego schematu - jest synonimem do rejestru USER
SYSTEM USER - ID autoryzacji u ytkownika poł czonego z baz .
eby uzyska warto
rejestru, nale y u y
modyfikowalny rejestr, nale y u y komendy SET.
komendy SELECT, natomiast
eby zaktualizowa
SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1;
SET CURRENT SCHEMA = db2admin
Oto przykład procedury tworz cej tabel datetab w celu demonstracji u ycia specjalnych rejestrów w
SQL-u.
CREATE PROCEDURE registersample
(OUT p_start TIMESTAMP, OUT p_end TIMESTAMP,
OUT p_c1 TIMESTAMP, OUT p_c2 TIME, OUT p_user CHAR(20))
LANGUAGE SQL
SPECIFIC rejestrsample
BEGIN
CREATE TABLE datetab (c1 TIMESTAMP, c2 TIME, c3 DATE);
VALUES CURRENT TIMESTAMP INTO p_start;
INSERT INTO datetab VALUES (CURRENT TIMESTAMP, CURRENT TIME, CURRENT DATE + 3 DAYS);
SELECT c1, c2 INTO p_c1, p_c2 FROM datetab;
VALUES CURRENT TIMESTAMP INTO p_end;
SET p_user = USER;
DROP TABLE datetab;
END
3
Wykonywanie procedur
Uprawnienia, które musi mie user:
GRANT EXECUTE ON SPECIFIC PROCEDURE <nazwa procedury> TO USER <user>
-8-
9
IBM DB2 – Procedury składowane
Uprawnienia, które musi mie developer:
GRANT <operacje> ON <obiekty> TO USER <user>
GRANT BINDADD ON <baza danych> TO USER <user>
Polecenie CREATE PROCEDURE nie ma opcji “replace” , wi c je eli chc zast pi istniej c definicj procedury
nale y u y DROP PROCEDURE.
Procedur wywołuje si poleceniem CALL, natomiast to polecenie wywołuje zewn trzn procedur :
EXEC SQL
CALL hsale (:param1, :param2, :param3, :param4)
END-EXEC
Utworzenie z okna komend:
db2 –td@ -f simple.sql
db2 call proc01()
3.1
Dynamiczny SQL
W dynamicznym SQL-u polecenia s znane jedynie podczas wykonywania. eby pracowa z dynamicznym SQL-em
wykorzystuje si polecenia:
− PREPARE – bierze zmienn VARCHAR zawieraj c polecenie SQL i konwertuje je na polecenie
wykonywalne
− EXECUTE – pozwala wykona poprzednio przygotowane polecenie PREPARE zdanie
− EXECUTE IMMEDIATE – przygotowuje i wykonuje polecenie zawarte w stringu. Np.
EXECUTR IMMEDIATE ‘UPDATE tabela SET ...’
DECLARE statement1 STATEMENT;
SET string1 = ’UPDATE tab1 SET col1 = ? ’ || ’WHERE col2 = ?’ ;
PREPARE statement1 FROM string1 ;
EXECUTE statement1 USING var1,var2
3.1.1
Dynamiczny SQL - kursory
DECLARE statement1 STATEMENT;
DECLARE cursor1 CURSOR FOR statement1;
SET string1 = ’SELECT column1 FROM tab1 ’ || ’WHERE column2 = ’ || CHAR( variable1) ;
PREPARE statement1 FROM string1 ;
OPEN cursor1;
3.2
Dynamiczny SQL - parametryzowanie
-- Złó my, e sygnatura procedury wygl da: schema1.procedure1(IN,INOUT,OUT)
-9-
10
IBM DB2 – Procedury składowane
DECLARE statement1 STATEMENT;
SET string1 = ’ CALL schema1.procedure1’ || ’ (?,?,?)’ ;
PREPARE statement1 FROM string1 ;
EXECUTE statement1 INTO var1,var2 USING var3,var4;
USING
VAR3
VAR4
CALL PROCEDURE1
?
?
?
definicja
IN
INOUT
OUT
VAR1
VAR2
INTO
4
Elementy j zyka SQL PL
4.1
Sekwencje
Sekwencje s obiektami, które pozwalaj automatycznie generowa warto ci.
CREATE SEQUENCE nazwa_sekwencji AS INTEGER | typ_danych
START WITH wart_numeryczna
INCREMENT BY wart_numeryczna
MINVALUE wart_numeryczna
MAXVALUE wart_numeryczna [NO CYCLE | CYCLE]
Do generacji i uzyskania warto ci sekwencji u ywane s wyra enia: NEXT VALUE i PREVIOUS VALUE.
VALUES PREVIOUS VALUE FOR sek1 INTO ...
4.2
1.
Instrukcje steruj ce
p tle FOR, WHILE, LOOP, REPEAT
•
•
•
p tla FOR
nazwa p tli loop_name mo e by u yta do kwalifikowania zmiennych odnosz cych si do warto ci kolumn w
zwi zanym z FOR kursorze. P tla ta jest u ywana tylko do przetwarzania wierszy tabel - tzn. przetwarzania
ka dego wiersza zwróconego przez podan instrukcj SELECT.
FOR loop_name AS SELECT kol1, kol2, …
DO
SET var1 = loop_name.col1;
…
END FOR;
p tla WHILE
WHILE (var1 = 1) DO
…
END WHILE;
p tla LOOP
- 10 -
11
IBM DB2 – Procedury składowane
•
•
2.
instrukcje warunkowe
• Dopuszcza si stosowanie trzech form instrukcji IF: IF-THEN, IF-THEN-ELSE, i IF-THEN-ELSEIF
•
4.3
mo e by zdefiniowana etykieta bloku LOOP. Wewn trz p tli musi by wyspecyfikowana opcja
LEAVE, eby mo na było wyj z p tli (ale mog te wyj deklaruj c handler - zgłoszenie). Z
kolei opcja ITERATE wymusza nast pn iteracj w p tli.
etykieta: LOOP
…
LEAVE etykieta;
…
ITERATE etykieta;
END LOOP;
p tla REPEAT
REPEAT
…
UNTIL (var1 < 100)
END REPEAT;
“p tla” GOTO - GOTO zast puje ITERATE.
GOTO etykieta;
RETURN int_value
IF v_var = 1 THEN
UPDATE …
ELSE
INSERT …
END IF;
instrukcja CASE
mo na j u y na 2 sposoby:
CASE
WHEN v_var = 0 THEN …
WHEN v_var = 10 THEN …
ELSE …
END CASE;
CASE v_var
WHEN 0 THEN ...
WHEN 10 THEN ...
ELSE ...
END CASE
Kursory
SQL PL niejawnie deklaruje kursor dla wszystkich instrukcji manipulowania danymi, wł czaj c zapytania zwracaj ce
tylko jeden wiersz. Dla zapyta zwracaj cych wi cej ni jeden wiersz mo na jawnie zadeklarowa kursor przetwarzaj cy
indywidualnie wiersze.
- 11 -
12
IBM DB2 – Procedury składowane
DECLARE SQLSTATE CHAR(5);
DECLARE cursor1 CURSOR FOR select … ;
-- Po deklaracji zmiennych
OPEN cursor1;
FETCH FROM cursor1 INTO var1, var2, … ;
WHILE (SQLSTATE = ’ 00000’ )
DO
…
END WHILE;
CLOSE cursor1;
DB2 niejawnie otwiera kursor do przetwarzania ka dej instrukcji SQL'
a nie poł czonej z jawnie zadeklarowanym
kursorem. SQL PL pozwala odwoływa si do ostatniego niejawnego kursora jak do kursora SQL. Tym samym mo na
u ywa atrybutów kursora w celu pozyskania informacji o ostatnio wykonanej instrukcji SQL.
4.3.1
Kursory FOR UPDATE
Instrukcja OPEN wykonuje zapytanie skojarzone z jawnie zadeklarowanym kursorem. Otwarcie kursora wykonuje
zapytanie i identyfikuje aktywny zbiór, który zawiera wiersze spełniaj ce kryterium wyszukiwania.
Dla kursorów zadeklarowanych z u yciem klauzuli FOR UPDATE, instrukcja OPEN blokuje te wiersze.
DECLARE SQLSTATE CHAR(5);
DECLARE cursor1 CURSOR FOR
select … FOR UPDATE;
-- domniemana warto : FOR READ ONLY
OPEN cursor1;
FETCH FROM cursor1 INTO var1, var2, … ;
WHILE (SQLSTATE = ’ 00000’ )
DO
DELETE FROM tab1 WHERE CURRENT OF cursor1;
…
UPDATE tab1 SET … WHERE CURRENT OF cursor1;
END WHILE;
4.3.2
Kursory WITH HOLD
Te kursory s zachowywane po COMMIT.
DECLARE cursor1 CURSOR WITH HOLD FOR select … FOR UPDATE;
COMMIT;
-- teraz kursory nie b d zamkni te
ROLLBACK;
-- wszystkie kursory s zamykane
-- wszystkie blokady s zwalniane
-- lokatory BLOB-ów s zwalniane
4.3.3
Kursory READ ONLY
Nie b dzie zakł dana blokada EXCLUSIVE LOCK
- 12 -
13
IBM DB2 – Procedury składowane
4.3.4
Kursory WITH RETURN
Tylko dla aplikacji bazy z OS/390.
4.4
Podstawowa obsługa bł dów
W DB2 s nast puj ce typy polece , zgłaszaj cych bł d:
1. zmienne SQLCODE i SQLSTATE
2. deklaracje warunku i zgłoszenia (handlera)
3. polecenia SIGNAL i RESIGNAL
4. GET DIAGNOSTICS EXCEPTION
4.4.1
SQLCODE/SQLSTATE
W DB2 s 2 zmienne, których DBMS u ywa do identyfikacji bł du:
1.
2.
SQLSTATE - kod standaryzowany - niezale ny od platformy. Ma 5 znaków, z czego 2 pierwsze
reprezentuj klas bł du, a pozostałe 3 - szczegółowe warunki bł du (podklas bł du).
SQLCODE - tak DB2 raportuje bł d i ostrze enia - sposób oryginalny DB2.
Je eli jest bł d, to SQLCODE jest < 0, SQLSTATE 00 | 01 | 02
Je eli jest ostrze enie, to SQLCODE jest > 0 i pierwsze 2 cyfry SQLSTATE = 01 | 02
Je eli jest wszystko w porz dku, to SQLCODE = 0 i SQLSTATE = 00000
DECLARE SQLSTATE CHAR(5) DETAULT ’ 00000’ ;-- ISO/ANSI SQL92
-- ’ 00xxx’ – sukces
-- ’ 01xxx’ – ostrze enie
-- ’ 02xxx’ – not found
-- other – bł d
DECLARE SQLCODE INT DETAULT 0; -- DB2 specific
-- 0 – sukces
-- >0 – ostrze enie
-- 100 – not found
-- <0 – bł d
S te oczywi cie bł dy definiowane przez u ytkownika. Np. pracownik nie mo e zarabia wi cej od swojego
kierownika. Bł dy te s kodowane w SQLSTATE przez pierwsze znaki ‘38’ .
4.4.2
Deklaracja warunku i zgłoszenia CONDITION FOR
Jakie s typowe sytuacje wymagaj ce jawnego zgłoszenia bł du?
− w SELECT-cie nie ma adnych wierszy
− nast piło naruszenie wi zów integralno ci w poleceniu UPDATE lub DELETE
− itd.
Wi c pisz :
DECLARE record_not_found CONDITION FOR ;02000’ – record_not_found to nazwa warunku
DECLARE check_constraint_error CONDITION FOR ‘23513’
Po słowie CONDITION FOR wyst puje wzi ty numer z SQLSTATE. Wtedy deklarowany warunek wyst pi, gdy np.
SQLSTATE = ‘23513’ .
- 13 -
14
IBM DB2 – Procedury składowane
eby u y nazwy warunku trzeba zadeklarowa zgłoszenie, a potem – kiedy handler jest zdefiniowany/zadeklarowany –
mo na podj jedn z 3 akcji:
1.
CONTINUE - sterowanie przechodzi do polecenia znajduj cego si za tym poleceniem, które wywołało
bł d.
2. EXIT - sterowanie jest przekazywane na koniec SQL zło onego
3. UNDO - wykonywana jest operacja rollback na zło onym SQL zaczynaj cym si od BEGIN ATOMIC.
Przykład:
DECLARE not_found CONDITION FOR ‘02000’
DECLARE CONTINUE HANDLER FOR not_found
SET at_end = 1
Poza predefiniowanymi w SQLSTATE handlerami mo na te definiowa wyj tki w nast puj cych sytuacjach:
− SQLEXCEPTION
− SQLWARNINGS
− NOT FOUND
Oto przykład typowego bloku polece na pocz tku procedury:
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET v_sqlcode = SQLCODE;
DECLARE UNDO HANDLER FOR SQLWARNING
SET v_sqlcode = SQLCODE;
DECLARE EXIT HANDLER FOR NOT FOUND
SET v_sqlcode = SQLCODE;
Ogólna posta :
DECLARE condition-name CONDITION FOR SQLSTATE ’ xxxxx’ ;
Przykład:
DECLARE not_found CONDITION FOR SQLSTATE ’ 02000’ ;
4.4.3
SIGNAL/RESIGNAL
SIGNAL jawnie sygnalizuje warunek bł du/ostrze enia. Je eli jest definiowane zgłoszenie eby zgłosi wyj tek, jest to
wywoływane natychmiast przez polecenie SIGNAL. Sterowanie przechodzi wtedy do zdefiniowanego zgłoszenia bł du.
Przykład:
SIGNAL SQLSTATE ‘38001’ – zgłoszenie b dzie uruchomione
Polecenie RESIGNAL zwraca SQLSTATE i SQL MESSAGE TEXT do wywołuj cej zgłoszenie aplikacji. To polecenie
ustawia wiadomo diagnozuj c .
Przykład:
RESIGNAL SQLSTATE ‘38TNF’ SET MESSAGE TEXT = ‘nie znaleziono pracownika’
Przykład zaawansowanej obsługi:
DECLARE EXIT HANDLER FOR SQLSTATE = ‘xxxxx’
RESIGNAL SQLSTATE ‘xxxxx’ SET MESSAGE TEXT = ‘.....’
Ostatni przykład:
SIGNAL SQLSTATE ’ xxxxx’ ;
--------------------------------------------DECLARE condition1 CONDITION FOR SQLSTATE ’ 99001’ ;
- 14 -
15
IBM DB2 – Procedury składowane
IF (pojawił si bł d) THEN
SIGNAL condition1
SET MESSAGE_TEXT = Twój komunikat bł du’ ;
4.4.4
GET DIAGNOSTICS
GET DIAGNOSTICS EXCEPTION jest u ywany w celu umo liwienia dost pu do informacji zwi zanej z
bł dem/ostzre eniem.
Samo GET DIAGNOSTICS mo e te by u yte do pozyskania informacji o liczbie wierszy przetworzonych przez
instrukcje: INSERT, UPDATE, DELETE.
Przykład:
GET DIAGNOSTICS num_record = ROW_COUNT
4.5
Zło ony SQL
Zło ony SQL pozwala grupowa wiele polece (zwykle INSERT, UPDATE i DELETE) w jeden
wykonywalny blok. Taki blok polece mo e by wykonany jako pojedynczy strumie , co redukuje czas
wykonania i ruch w sieci. Zło ony SQL nie gwarantuje porz dku wykonania polece składowych, tak wi c
nale y unika wzajemnych zale no ci mi dzy poleceniami.
Ogólna struktura zdania zło onego:
etykieta: BEGIN
<lista lokalnych deklaracji zmiennych>
< lista lokalnych deklaracji kursora>
<lista lokalnych deklaracji zgłosze - handlerów>
<polecenia SQL>
END;
jak wida mo na etykietowa :
lab1: BEGIN
DECLARE v_id INT;
lab2: BEGIN
DECLARE v_id INT;
SET lab1.v_id = 1;
SET lab2.v_id = 10;
SET v_id = 100;
END lab2;
END lab1
BEGIN ATOMIC
DECLARE v_var2 INTEGER;
CREATE TABLE mytab(id INT);
CREATE INDEX mytab_idx ON mytab(id);
BEGIN
DECLARE v_var4 INTEGER DEFAULT 100;
INSERT INTO mytab(id) VALUES (99),(v_var4);
GET DIAGNOSTICS v_var2 = ROW_COUNT;
SET p_result = '
Number of rows: '||
char(v_var2);
END; -- rednik jest wymagany
END
- 15 -
16
IBM DB2 – Procedury składowane
BEGIN ATOMIC
…
-- SQL’e traktowane s jak jedno polecenie. Nie mog tu u y COMMIT i ROLLBACK
END;
-- nieobsłu ony bł d -> zatrzymanie procedury. ->-- wszystkie zmiany s anulowane
--------------------------------------------BEGIN NOT ATOMIC -- to jest domniemana wart.
…
COMMIT;
ROLLBACK;
ROLLBACK TO SAVEPOINT sp1;
…
END;
-- nieobsłu ony bł d -> zatrzymanie procedury ->-- Zmiany pozostaj . R czne wycofanie lub zatwierdzenie
5
5.1
Procedury
External Stored Procedures
Zewn trzna procedura składowana jest pisana przez u ytkownika w jednym z j zyków programowania C, COBOL,
RPG, FORTRAN, JAVA, C++, REXX, ... na serwerze iSeries. eby stworzy zewn trzn procedur , kod ródłowy dla
j zyka hosta musi by skompilowany, tak wi c tworzony jest obiekt program. Wtedy u ywane jest polecenie CREATE
PROCEDURE, które podpowiada systemowi gdzie znajduje si obiekt program, który implementuje t procedur .
Czyli najpierw - przed u yciem zewn trznej procedury - musi by ona zarejestrowana w bazie, np. przez CREATE
PROCEDURE.
Np. procedura zwracaj ca nazwisko dostawcy, który miesi cznie i rocznie sprzedaje najwi cej produktów.
EXEC SQL
CREATE PROCEDURE hsale
(IN rok INTEGER,
IN miesi c INTEGER,
OUT nazwisko_dostawcy CHAR(20),
OUT hsale DECIMAL(11,2))
EXTERNAL NAME sproclib.hsales
LANGUAGE RPGLE
PARAMETER STYLE GENERAL
END_EXEC
5.2
Procedury rejestrowe (registering stored procedures)
Czym si ró ni polecenie CREATE PROCEDURE od DECLARE PROCEDURE? W CREATE procedura i definicje
parametrów dodawane s do systemowych tabel katalogu - SYSROUTINES, i SYSPARMS (1 wiersz na 1 parametr). Jest
te tabela SYSPROC. Tak wi c procedura zaczyna by dost pna dla jakiegokolwiek programu klienckiego chodz cego na
lokalnym lub zdalnym systemie. Czyli CREATE PROCEDURE potrzebuje by wykonane tylko raz w swoim yciu.
Natomiast DECLARE jest głównie u ywane do tymczasowej rejestracji procedury w programie.
SELECT * FROM QSYS2.SYSROUTINES;
- 16 -
17
IBM DB2 – Procedury składowane
6
SQL – PSM (rozszerzenia persistent stored module) - J zyk skryptowy do deklaracji i
zarz dzania procedurami
SQL PSM mo e by u yty w:
6.1
•
Procedurach składowanych, które s wywoływane poleceniem CALL.
•
Triggerach – automatycznie wywoływanych kiedy zajdzie zdarzenie aktywuj ce.
•
Funkcjach definiowanych przez u ytkownika.
Kompilacja procedury
Skompilowany kod oraz opcjonalnie kod ródłowy procedury przechowany jest w katalogach systemowych.
Jednocze nie tworzony jest pakiet, w którym przechowywane s plany wykonania statycznych polece SQL.
CREATE PROCEDURE OUT_MEDIAN (
OUT medianSalary DOUBLE,
OUT maxSalary DOUBLE)
DYNAMIC RESULT SETS 0
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
Parsing and
compilation
SQL PL
pseudo code
DECLARE v_numRecords INT DEFAULT 1 ;
DECLARE v_salary1 DOUBLE DEFAULT 0 ;
Package
DECLARE c1 CURSOR FOR
SELECT CAST(salary AS DOUBLE) FROM staff
Procedure text
6.2
DB2
System Catalogs
Etapy wdra ania procedur
-- REBIND – powtórne przygotowanie planów
-- zapyta statycznych SQL-i
CALL SYSPROC.REBIND_ROUTINE_PACKAGE ('
P'
,'
MYSCHEMA.MYPROC'
,'
CONSERVATIVE'
)
-- Przeniesienie skompilowanego kodu
-- procedury do pliku
GET ROUTINE INTO file1 FROM SPECIFIC PROCEDURE proc1 HIDE BODY ;
-- Wgranie skompilowanej procedury do bazy:
PUT ROUTINE FROM file1 ;
6.3
Opcje kompilacji i reoptymalizacji
db2set DB2_SQLROUTINE_PREPOPTS=
BLOCKING {UNAMBIG | ALL | NO}
DATETIME {DEF | USA | EUR | ISO | JIS | LOC}
DEGREE {1 | degree-of-parallelism | ANY}
- 17 -
18
IBM DB2 – Procedury składowane
DYNAMICRULES {BIND | RUN}
EXPLAIN {NO | YES | ALL}
EXPLSNAP {NO | YES | ALL}
FEDERATED {NO | YES}
INSERT {DEF | BUF}
ISOLATION {CS |RR |UR |RS |NC}
QUERYOPT optimization-level
VALIDATE {RUN | BIND}
-- na poziomie instancji;
-- wymagany db2stop,db2start
VALUES GET_ROUTINE_OPTS() ;
-- bie ce parametry kompilacji
CALL SET_ROUTINE_OPTS
('
VALIDATE RUN ISOLATION UR'
);
-- ustawienie dla bie cej sesji
CALL SET_ROUTINE_OPTS(NULL)
-- przywrócenie domniemanych ustawie
7
Koncepcja nazywania procedur
xxxxLEP
L- j zyk
E - rodowisko: N - Windows
4 - AS/400
M - OS/390
P - cel:
C - klient
S - procedura SQL
8
UDF
Wyró niamy 2 rodzaje:
4.
5.
funkcje skalarne - zwracaj pojedyncz , skalarn warto ; mog by typu:
ródłowe - zarejestrowane w bazie, odwołuj ce si do innej funkcji
−
−
SQL - napisane w SQL
−
zewn trzne - napisane w pewnym j zyku wysokiego poziomu
funkcje tabel
CREATE FUNCTION nazwa
<deklaracja parametrów>
RETURNS
SPECIFIC
LANGUAGE
BEGIN
<ciało funkcji>
RETURN
END
- 18 -
19
IBM DB2 – Procedury składowane
Zadania do wykonania na laboratorium
9
Dodatkowe informacje
9.1
Ka de zdanie SQL musi by zako czone rednikiem (;).
9.2
Zdanie CREATE PROCEDURE musi by zako czone symbolem “małpa” (@ po słowie END).
9.3
Dana procedura nie mo e by modyfikowana np. przez zdanie ALTER PROCEDURE, a jedynie przez
zmian jej definicji (najpierw DROP PROCEDURE nazwa a potem ponownie CREATE
PROCEDURE).
10 Struktura u ywanej bazy danych
Department
Employee
Org
Project
Sales
Staff
Pracownik
Zespol
Temat
Dochod
(deptno, deptname, mgrno, location)
(midinit, lastname, workdept, hiredate, job, birthdate, salary, bonus, comm, ...)
(deptnumb, deptname, manager, division)
(projno, projname, deptno, respemp)
(sales_date, sales_person, region, sales)
(id, name, dept, job, years, salary, comm)
(nr_prac, nazwisko, nr_zesp)
(nr_zesp, nazwa_zesp, lokalizacja, nr_prac_kz)
()
(nr_prac, kwota, premia, nr_tem, data)
11 Czynno ci wst pne
11.1 Zalogowa si do systemu Windows (np. w sali 830 jako u ytkownik lab1 z hasłem Kowalski1 do
domeny d830).
11.2 Uruchomi wskazan przez prowadz cego maszyn wirtualn .
11.3 Uruchomi okno komend:
START → PROGRAMY → IBM DB2 → Narz dzia uruchamiane z wiersza komend → okno komend
11.4 Sprawdzi istniej ce instancje na serwerze (komenda db2ilist). Je eli zachodzi potrzeba
wystartowa instancj poleceniem db2start.
11.5 Sprawdzi istniej ce bazy danych (komenda db2 list database directory).
11.6 Je eli baza sample nie istnieje, utworzy j poleceniem db2sampl.
11.7 Poł czy si z baz poleceniem db2 connect to sample.
11.8 Sprawdzi istniej ce w bazie tabele (komenda db2 list tables).
11.9 Sprawdzi istniej ce w bazie tabele – równie systemowe(komenda db2 list tables for all).
- 19 -
20
IBM DB2 – Procedury składowane
11.10 Wy wietli struktur wybranej tabeli – polecenie db2 describe table nazwawybranejtabeli.
11.11 Wy wietli konfiguracj bazy, sprawdzaj c j zyk bazy (TERRITORY) i stron kodow (CODE SET):
db2 get database configuration
11.12 Sprawdzi licencj bazy
db2licm -l
11.13 Ustawi protokół komunikacji ze zdalnymi klientami na TCP/IP:
db2set DB2COMM=tcpip
11.14
Ustawi parametr SVCENAME na bazy:
db2 update dbm cfg using svcename bazy
11.15 Stworzy tabel WORKERS o atrybutach: id integer, name varchar(20), parent int, payment decimal(6,2),
bonus decimal(6,2), salary decimal(6,2). Kluczem podstawowym jest id. Kolumna salary powinna by
generowana automatycznie jako suma kolumn payment oraz bonus:
db2 create table workers (id integer primary key NOT NULL,
..., salary decimal(6,2) GENERATED ALWAYS AS (bonus+payment));
11.16 Stworzy tabel w1 o identycznej strukturze co workers, korzystaj c z predykatu LIKE:
db2 create table w1 LIKE workers;
11.17 Wypełni tabel workers przykładowymi danymi:
1
2
Jurek
Piotr
NULL
1
5000
4000
2000
1500
3
4
Adam 2
Jan
NULL
3000
2500
1000
1500
11.18 Uruchomi i przeanalizowa
przodków Adama:
działanie polecenia, wy wietlaj cego rekurencyjnie wszystkich
WITH temp1 (id, name, parent) AS
(
SELECT w.id, w.name, w.parent
FROM workers w
WHERE w.name=’ADAM’
UNION ALL
SELECT w1.id, w1.name, w1.parent
FROM workers w1, temp1 t1
WHERE w1.id = t1.parent) SELECT * FROM temp1;
11.19 Wykona archiwizacj bazy do katalogu c:\db2\archiwum:
db2 backup database sample to c:\db2\archiwum
11.20 Odtworzy baz z wykonanego archiwum, sprawdzaj c w katalogu c:\db2\archiwum czas:
db2 restore database sample from c:\db2\archiwum taken at czas without rolling forward without prompting
- 20 -
21
IBM DB2 – Procedury składowane
12 Zadania
12.1 W pliku ins.sql (plik mo na pobra ze strony http://zti.polsl.pl/ibmdb2/db2_files/) utworzy (na
poziomie systemu operacyjnego) procedur ins, tworz c tabele Pracownik, Zespol, Dochod i
wstawiaj c do nich wiersze pochodz ce z ju istniej cych w systemie tabel
12.2 Wywoła procedur
ins
znajduj c si w pliku ins.sql:
db2 -td@ -f ./ins.sql
db2 call ins
12.3 Sprawdzi istniej ce w bazie tabele (komenda db2 list tables).
12.4 Utworzy procedur o nazwie ins_tem, tworz c i wypełniaj c warto ciami pocz tkowymi tabel
temat.
W tym celu nale y utworzy nowy zbiór (np. o nazwie ins_tem.sql) w katalogu bie cym
(Save As: ./ins_tem.sql).
Struktura tworzonej tabeli: nr_tem integer, nazwa_tem varchar(30), nr_prac_kt integer.
Uwagi!
Kolumn nazwa_tem tabeli temat nale y wypełni danymi z kolumny projname tabeli project.
Warto ci kolumny nr_tem maj by automatycznie generowane. W tym celu za specyfikacj typu
kolumny nale y doda fraz :
generated by default as identity (start with 1increment by 1)
12.5 Utworzy , a nast pnie wywoła , procedur
ins_tem
znajduj c si w pliku ins_tem.sql:
db2 -td@ -f ./ins_tem.sql
db2 call ins_tem
12.6 Sprawdzi istniej ce w bazie tabele (komenda db2 list tables) i wylistowa zawarto
tabeli temat:
db2 „select * from temat”
12.7 Przeczyta z katalogu sysroutines wybrane informacje o procedurze ins_tem:
db2 "select routinename, routinetype, text from sysibm.sysroutines where routinename = '
INS_TEM'
"
12.8 Napisa procedur o nazwie sel (plik sel.sql) z jednym parametrem OUT typu integer, zwracaj c
warto ci kolumny nr_prac tabeli Pracownik.
CREATE PROCEDURE sel
(OUT nr integer)
LANGUAGE SQL
BEGIN
SELECT ... INTO nr FROM ...;
END@
12.9 Utworzy , a nast pnie wywoła , procedur
sel:
db2 -td@ -f ./sel.sql
db2 "call sel (?)"
- 21 -
22
IBM DB2 – Procedury składowane
Co si stało?
12.10 Poprawi procedur sel, deklaruj c kursor kurs1, który pozwoli na wylistowanie danej warto ci.
W tre ci procedury – po deklaracjach zmiennych – nale y kursor zadeklarowa i otworzy
poleceniami
DECLARE kurs1 CURSOR FOR SELECT ....
OPEN kurs1;
a nast pnie – w p tli WHILE – pobiera
reprezentuj cej parametr wyj ciowy:
aktualne warto ci, zapami tuj c je w zmiennej
WHILE warunek DO
FETCH kurs1 INTO parametr;
...;
END WHILE;
W zwi zku z tym, e p tla ma by wykonywana tyle razy, ile jest wierszy w tabeli Pracownik, nale y
zadeklarowa zmienn pomocnicz – np. o nazwie liczba_rek, która b dzie przechowywała informacje
o liczbie wierszy tabeli: SELECT ... INTO liczba_rek FROM ... p tla oraz drug zmienn pomocnicz
– np. o nazwie il, która b dzie pełniła funkcj licznika p tli. Warto ci zmiennej il nale y w p tli
ustawia poleceniem:
SET il = il + 1;
12.11 Poprawion procedur nale y utworzy i ponownie wykona . Co si stało?
12.12 Jeszcze raz poprawi procedur sel, dopisuj c do polecenia DECLARE CURSOR fraz
(przed słowem FOR) i kasuj c cał p tl WHILE. Sprawdzi działanie procedury.
WITH RETURN
12.13 Sprawdzi , czy w ten sam sposób, co w punkcie poprzednim, mo na zwróci warto ci wszystkich
kolumn tabel Pracownik i Dochod (zastosowa 2 kursory).
12.14 Utworzy procedur o nazwie sel_prac, zwracaj c wszystkie informacje o pracowniku (tabela
Pracownik), którego numer podany jest parametrem procedury (typ IN). Utworzon procedur
wywoływa :
db2 "call sel_prac(10)"
12.15 Poprawi utworzon w poprzednim punkcie procedur , dodaj c wy wietlanie komunikatu 'Brak
pracownika o tym numerze w bazie' w momencie, gdy w tabeli Pracownik nie b dzie podanego
parametrem numeru pracownika. W cz ci operacyjnej procedury nale y zadeklarowa poleceniem
DECLARE zmienn SQLSTATE jako CHAR(5) i 2 kursory, które posłu
do pó niejszej sygnalizacji
bł du poleceniem SIGNAL:
SIGNAL SQLSTATE '
38000'
SET MESSAGE_TEXT='
Brak ....'
'
Pierwszy z kursorów zadeklarowa z fraz
WITH RETURN:
DECLARE nazwakursora1 CURSOR WITH RETURN FOR SELECT ... FROM Pracownik WHERE ...
- 22 -
23
IBM DB2 – Procedury składowane
natomiast drugi – dla polecenia SELECT nr_prac FROM Pracownik WHERE ...bez ww. frazy.
Kursor drugi otworzy (OPEN nazwakursora2), a nast pnie pobra dane do wcze niej zadeklarowanej
zmiennej pomocniczej – FETCH FROM nazwakursora2 INTO zmiennapomocnicza.
W przypadku gdy pobranie nie powiedzie si (brak danych), nale y zgłosi bł d; w przeciwnym
przypadku – wy wietli
dane informacje na ekranie:
IF (SQLSTATE <> '
00000'
) THEN
... zgłoszeniebłedu
ELSE
OPEN nazwakursora1;
END IF;
12.16 Napisa funkcj fun_nvl, sklejaj c
powinna mie posta :
2 ci gi znaków (varchar(20)) podanych parametrem. Funkcja
CREATE FUNCTION fun_nvl(zmienna typ, ...)
RETURNS varchar(40)
LANGUAGE SQL
RETURN (p_zm1 || p_zm2)@
12.17 Utworzy i wykona funkcj
nvl:
db2 -td@ -f ./fun_nvl.sql
db2 "select fun_nvl('
Jan'
,'
Kowalski'
) from sysibm.sysdummy1"
12.18 Utworzy procedur wiekowi, wypisuj c nazwiska tych pracowników, którzy przekroczyli 70 rok
ycia. W procedurze wykorzysta napisan specjalnie na jej potrzeby funkcj fun_wiek, obliczaj c i
zwracaj c ró nic (typ integer) lat (funkcja YEAR) pomi dzy podan parametrem dat urodzin a
dat bie c (CURRENT_DATE). W funkcji wykorzysta polecenie:
SELECT ... FROM sysibm.sysdummy1;
Funkcja b dzie u yta w procedurze we frazie WHERE polecenia SELECT:
... WHERE fun_wiek(Employee.birthdate) > 70;
12.19 Napisa wyzwalacz (trigger) typu BEFORE o nazwie trig_del_doch zabezpieczaj cy przed usuni ciem
jakichkolwiek wierszy z tabeli dochod. Wyzwalacz powinien zgłosi bł d w przypadku, gdy zostanie
wydane polecenie DELETE dla tabeli dochod:
CREATE TRIGGER trig_del_doch
BEFORE delete ON dochod
FOR EACH ROW
SIGNAL SQLSTATE '
75001'('
Nie wolno usuwa wierszy z tej tabeli'
)@
12.20 Utworzy (poleceniem db2 -td@ -f ...sql) wyzwalacz i przetestowa jego działanie wpisuj c polecenie:
db2 "DELETE FROM dochod WHERE kwota > 10000"
12.21 W celu ograniczenia zjawiska kaskadowego wyzwalania triggerów, usun
trigger poleceniem:
db2 drop trigger trig_del_doch;
- 23 -
utworzony przed chwil
24
IBM DB2 – Procedury składowane
12.22 Utworzy wyzwalacz trig_upd_sal, aktualizuj cy kwot wypłaty pod warunkiem, e proponowana
stawka nie przekracza 20% poprzedniej ("starej") wypłaty.
W definicji triggera doda frazy:
FOR EACH ROW
MODE DB2ROW
WHEN (...)
Cz
operacyjna triggera ma mie posta : BEGIN ATOMIC...END@
12.23 Napisa procedur upd_kt, aktualizuj c warto ci kolumny nr_prac_kt tabeli temat. Aktualizacja ma
przebiega nast puj co. Dla danego tematu (nr_tem) kierownikiem tego tematu powinien zosta
pracownik, który dostał w nim (jednorazowo) maksymaln wypłat . W procedurze wykorzysta
p tl FOR o konstrukcji:
P tla ta jest u ywana tylko do
FOR etykieta_p tli AS SELECT .....
przetwarzania wierszy tabel DO
tzn.
przetwarzania
ka dego
UPDATE ...
wiersza
zwróconego
przez
END FOR
- 24 -

Podobne dokumenty