Ćwiczenia 2 IBM DB2 Data Studio Temat: Aplikacje w Data Studio 1. Projekty Tworzenie procedur, UDF, trygerów zaczynamy od utworzenia projektu File -> New -> Project wybieramy Data Development Project. Wersja 2011.12.13.01 Strona 1
Kreator prowadzi w kilku krokach do utworzenia szkieletu aplikacji. Jednym z elementów jest utworzenie połaczenia z wybraną bazą danych. Jeżeli wcześniej zostało utworzone odpowiednie połączenie to należy je wybrać z listy, jeżeli brak to należy je utworzyć przy pomocy kreatora Klikamy przycisk New w panelu Select Connection Wersja 2011.12.13.01 Strona 2
Wybieramy DB2 for Linux, UNIX and Windows w oknie Select a database manager field W liście JDBC driver wskazujemy IBM Data Server Driver for JDBC and SQLJ (JDBC 4.0) Default. Uzupełniamy pozostałe pola i sprawdzamy połączenie przyciskiem Test Connection 2. Tworzenie procedur składowanych (stored procedure) Klikamy prawym klawiszem myszki na katalogu Stored Procedures wybieramy New -> Stored Procedure, uruchamia się kreator, wypełniamy pola z nazwą procedury i językiem, pozostałe parametry zostaja z wartościami domyślnymi. Wersja 2011.12.13.01 Strona 3
Po napisaniu treści procedury należy umieścić ją w zasobach serwera, czyli przeprowadzić proces deploy. W Data Project Explorer klikamy prawym klawiszem myszy na nazwie procedury i wybieramy Deploy. W kreatorze akceptujemy wartości domyślne i nacikamy klawisz Finish Wersja 2011.12.13.01 Strona 4
Uruchomienie procedury W Data Project Explorer klikamy prawym klawiszem myszy na nazwie procedury i wybieramy Run. Uruchomienie procedury w oknie Command lub Edytorze następuje przez polecenie call <procedure name> Wersja 2011.12.13.01 Strona 5
Syntaktyka polecenia CREATE PROCEDURE procedure_name [( {optional parameters} )] [optional procedure attributes] <statement> gdzie <statement> oznacza pojedynczą instrukvję lub grupę isntrukcji wyznaczoną przez słowa BEGIN i END. optional procedure attributes LANGUAGE SQL RESULT SETS <n> SPECIFIC unique_name optional parameters IN - Input parameter OUT - Output parameter INOUT - Input and Output parameter Przykład CREATE PROCEDURE proc ( IN v_p1 T, INOUT v_p2 INT, OUT v_p3 INT) LANGUAGE SQL SPECIFIC addproc BEGIN -- komentarz SET v_p2 = v_p2 + v_p1; SET v_p3 = v_p1; END Obsługa błędów DECLARE SQLSTATE CHAR(5); DECLARE SQLCODE INT; Deklaracja zmiennych DECLARE var_name <data type> [DEFAULT value]; Instrukcja przypisania SET t = 2; Instrukcje sterujące CASE IF Wersja 2011.12.13.01 Strona 6
FOR WHILE ITERATE LEAVE LOOP REPEAT GOTO RETURN CALL Syntaktyka kursora DECLARE <cursor name> CURSOR [WITH RETURN <return target>] <SELECT statement>; OPEN <cursor name>; FETCH <cursor name> INTO <variables>; CLOSE <cursor name>; Przykład CREATE PROCEDURE set() DYNAMIC RESULT SETS 1 LANGUAGE SQL BEGIN DECLARE cur CURSOR WITH RETURN TO CLIENT FOR SELECT name, dept, job FROM staff WHERE salary > 20000; OPEN cur; END 3. Tworzenie UDF Funkcje definiowane przez użytkownika to obiekty bazy danych, które na podstawie podanych argumentów dostarczają wynik w postaci pojedynczej wartości ( skalarne) lub tabeli ( tabelowe ) Wersja 2011.12.13.01 Strona 7
Przykłady: Funkcja skalarna CREATE FUNCTION deptname(p_empid VARCHAR(6)) RETURNS VARCHAR(30) SPECIFIC deptname BEGIN ATOMIC DECLARE v_department_name VARCHAR(30); DECLARE v_err VARCHAR(70); SET v_department_name = ( SELECT d.deptname FROM department d, employee e WHERE e.workdept=d.deptno AND e.empno= p_empid); SET v_err = 'Error: employee ' p_empid ' was not found'; IF v_department_name IS NULL THEN SIGNAL SQLSTATE '80000' SET MESSAGE_TEXT=v_err; END IF; RETURN v_department_name; END Sposób wywołania db2 "values (deptname ('000300'))" db2 "select (deptname ('000300')) from sysibm.sysdummy1" CREATE FUNCTION getenumemployee(p_dept VARCHAR(3)) RETURNS TABLE (empno CHAR(6), lastname VARCHAR(15), firstnme VARCHAR(12)) SPECIFIC getenumemployee RETURN SELECT e.empno, e.lastname, e.firstnme FROM employee e WHERE e.workdept=p_dept Funkcja tabelowa CREATE FUNCTION getenumemployee(p_dept VARCHAR(3)) RETURNS TABLE (empno CHAR(6), lastname VARCHAR(15), firstnme VARCHAR(12)) SPECIFIC getenumemployee RETURN SELECT e.empno, e.lastname, e.firstnme FROM employee e WHERE e.workdept=p_dept Wersja 2011.12.13.01 Strona 8