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 -