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.