Tworzenie funkcji CREATE FUNCTION nazwa_funkcji (argument
Transkrypt
Tworzenie funkcji CREATE FUNCTION nazwa_funkcji (argument
Laboratorium Bazy danych SQL 4 1 Tworzenie funkcji CREATE FUNCTION nazwa_funkcji (argument[, ...]) RETURNS { STRING | INTEGER | REAL | DECIMAL } definicja_ciała_funkcji; Usuwanie funkcji DROP FUNCTION nazwa_funkcji; Tworzenie procedury CREATE PROCEDURE nazwa_procedury(tryb argument[, ...]) definicja_ciała_procedury; Usuwanie funkcji DROP PROCEDURE nazwa_procedury; tryb przekazania argumentu: – IN tylko do odczytu, widoczna wartość początkowa, zmiany wartości zmiennej wewnątrz funkcji nie są widoczne na zewnątrz; – OUT tylko do zapisu, wartość początkowa nie jest widoczna, zmiany wartości zmiennej wewnątrz funkcji są widoczne na zewnątrz; – INOUT do odczytu i zapisu, widoczna wartość początkowa, zmiany wartości zmiennej wewnątrz funkcji są widoczne na zewnątrz; BEGIN ... END; blok instrukcji DECLARE deklaracja zmiennej(-ych) IF w1 THEN i1 ELSEIF w2 THEN i2 ELSE i3 END IF; SET zm = w; zmiana wartości zmiennej SELECT … INTO... umieszczenie w zmiennej wartości zwróconej przez instrukcję select. WHILE w DO …. END WHILE; REPEAT …. UNTIL w END REPEAT; Laboratorium Bazy danych SQL 4 2 Przykład 1 SET @a = 1; CREATE PROCEDURE A(IN aa integer) SELECT aa; CALL A(@a); DROP PROCEDURE A; SET @a = 1; CREATE PROCEDURE A(OUT aa integer) SELECT aa; CALL A(@a); DROP PROCEDURE A; SET @a = 1; CREATE PROCEDURE A(INOUT aa integer) SELECT aa; CALL A(@a); DROP PROCEDURE A; Przykład 2 IN OUT SET @a = 1; SELECT @a; DELIMITER // CREATE PROCEDURE A(IN aa integer) BEGIN SELECT aa; SET aa = 100; SELECT aa; END; // DELIMITER ; CALL A(@a); SELECT @a; DROP PROCEDURE A; SET @a = 1; SELECT @a; DELIMITER // CREATE PROCEDURE A(OUT aa integer) BEGIN SELECT aa; SET aa = 100; SELECT aa; END; // DELIMITER ; CALL A(@a); SELECT @a; DROP PROCEDURE A; INOUT SET @a = 1; SELECT @a; DELIMITER // CREATE PROCEDURE A(INOUT aa integer) BEGIN SELECT aa; SET aa = 100; SELECT aa; END; // DELIMITER ; CALL A(@a); SELECT @a; DROP PROCEDURE A; Laboratorium Bazy danych SQL 4 Przykład 3 CREATE FUNCTION dwaRazy(a integer) RETURNS integer RETURN 2*a; SELECT dwaRazy(1), dwaRazy(-10), dwaRazy(25); Przykład 4 Obliczyć i zwrócić wartość średniej płacy podstawowej na etacie przekazanym jako argument funkcji. DELIMITER // CREATE FUNCTION srednia(e varchar(20)) RETURNS decimal BEGIN DECLARE wynik decimal default 0; SELECT round(AVG(placa_pod),2) into wynik FROM pracownik WHERE etat = e; RETURN wynik; END; // DELIMIETER ; select srednia('profesor'); DELIMITER // CREATE PROCEDURE srednia_pr(e varchar(20), out wynik decimal) BEGIN SELECT round(AVG(placa_pod),2) into wynik FROM pracownik WHERE etat = e; END; // DELIMITER ; set @w = 1; call srednia_pr('profesor', @w); select @w; 3 Laboratorium Bazy danych SQL 4 4 Każdą z poniższych procedur i funkcji należy przetestować. Zad.1 Zdefiniuj procedurę, która w zależności od wartości argumentu wypisze na ekranie komunikat: 'liczba dodatnia', 'liczba ujemna' lub 'zero'. Zad.2 Zdefiniuj procedurę, która będzie wyświetlać na ekranie wartość argumentu dopóki jest on dodatni. Zad.3 Zdefiniuj funkcję o dwóch argumentach całkowitych, która zwróci wartość pierwszego argumentu pomniejszonego o 1 tyle razy jaka jest wartości drugiego argumentu. UWAGA: użyj pętlę REPEAT...UNTIL... . Zad.4 Napisz funkcję MINIMUM, która obliczy i zwróci minimalna płacę podstawową na etacie podanym jako parametr. Przetestuj działanie funkcji dla etatów: 'profesor', 'adiunkt', 'asystent'. Zad.5 Zdefiniuj i wywołaj procedurę ZWIEKSZ, która zwiększy o 10% płacę dodatkową pracownikom, którzy ją posiadają, i zmieni wartość płacy dodatkowej na 100 zł tym, którzy jej nie mają. Zad.6 Zdefiniuj funkcję SUMA, która zwróci sumę płac podstawowych pracowników z zespołu, którego nazwa jest parametrem funkcji. Wypisz wartość zwracaną przez funkcję dla zespołu 'systemy OPERACYJNE'. (UWAGA: pamiętaj by funkcja ignorowała wielkość liter parametru!) Zad.7 Zdefiniuj funkcję ROCZNA_PLACA zwracającą roczną płacę podstawową powiększoną o płacę dodatkową pracownika o numerze, który jest parametrem funkcji. Zad.8 Zdefiniuj procedurę WYPISZ, która określi numery tych pracowników, których nazwiska zawierają na dowolnym miejscu literę podaną jako parametr, wyniki uporządkuj rosnąco. Wywołaj procedurę dla parametru 's'. (UWAGA: pamiętaj by funkcja ignorowała wielkość liter parametru!) Zad.9 Zdefiniować procedurę WIECEJ_NIZ, która wyświetli numery zespołów zatrudniających więcej niż x pracowników, gdzie x jest argumentem procedury. Zad.10 Zdefiniować funkcję, która zwróci pierwszą literę nazwiska pracownika o numerze podanym jako pierwszy argument funkcji, którego staż pracy przekracza wartość podaną jako drugi argument. Jeśli pracownik nie istnieje zostanie zwrócona wartość NULL. Zad.11 Zdefiniować procedurę, która w zależności od wartości swojego argumentu wypisze: – numer i nazwisko wszystkich pracowników w malejącym porządku numerów, dla argumentu równego -1; – numer i nazwisko wszystkich pracowników w rosnącym porządku numerów, dla argumentu równego 1; – numer i nazwisko wszystkich szefów wśród pracowników, dla argumentu równego 0. Zad.12 Zdefiniować procedurę, która wypisze połączone wartości: 2 ostatnie litery nazwiska, 2 początkowe litery etatu oraz rok zatrudnienia pracowników zawierających na dowolnym miejscu w nazwisku lub etacie literę podaną jako argument procedury. Zad.13 Zdefiniować procedurę, która wypisze nazwę tego zespołu, w którym zatrudniony jest pracownik o numerze podanym jako pierwszy argument procedury i w którym nie jest zatrudniona sekretarka. Laboratorium Bazy danych SQL 4 5 Zad.14 Zdefiniować funkcję, która obliczy i zwróci liczbę pracowników zatrudnionych na etacie podanym jako argument funkcji. Zad.15 Zdefiniować procedurę o trzech argumentach: pierwszy – pojedynczy znak, drugi – liczba całkowita, trzeci – data, która wypisze na ekranie tych pracowników, których nazwiska zaczynają się od litery-pierwszego argumentu lub którzy zarabiają więcej niż wartość drugiego argumentu i zatrudnionych po dacie podanej jako trzeci argument.