Funkcje: Tworzenie funkcji – funkcje skalarne w SQL cz. II
Jak wspomniałem w pierwszej części tego artykułu, SQL poza zwykłymi kwerendami jak prawie każdy język programowania umożliwia również tworzenie funkcji. Przyjrzyjmy się więc jak je napisać…
Funkcje skalarne, którymi zajmiemy się w tej części tego wpisu zazwyczaj są tak zbudowane, że zwracają pojedynczą wartość. Ważne jest jednak to, że konstrukcji takiej można używać we wszystkich zapytaniach SQL w których dopuszczalne jest użycie wyrażeń skalarnych.
Przy budowie funkcji skalarnych należy zwrócić szczególną uwagę na:
- nazwę (nie może ona zawierać znaków specjalnych, polskich liter oraz spacji czy tak zwanych znaków białych),
- blok
BEGIN ... END
, który musi zostać umieszczony w ciele funkcji, - parametry, przy wywoływaniu funkcji muszą zostać podane wszystkie jej parametry (argumenty) nawet te domyślne.
Po zapoznaniu się z teorią, najlepiej prześledzić wszystko w praktyce. Napiszmy więc funkcję skalarną w SQL.
Uwaga: Omawiany materiał działa na bazach danych firmy Microsoft.
Tabela pracownicy
, na której uruchomimy przykładowe zapytanie:
ID | Imie | Nazwisko | Data_urodzenia | Stanowisko | Data_zatrudnienia |
1 | Jan | Kowalski | 1984-12-23 | Programista | 1999-12-09 |
2 | Adam | Adamiak | 1991-08-08 | Menadżer | 2011-01-31 |
3 | Jakub | Kowalik | 1990-03-16 | Programista | 2010-01-04 |
4 | Michał | Jakubiak | 1981-05-02 | Projektant | 1998-09-22 |
Przykład
GO CREATE FUNCTION nazwaFunkcji (@zmienna AS VARCHAR(200)) RETURNS VARCHAR(200) AS BEGIN DECLARE @imie AS VARCHAR(200) SET @imie = '' SELECT @imie = @imie + Imie + ', ' FROM dbo.pracownicy WHERE Stanowisko = @zmienna; RETURN @imie; END GO
Powyższą funkcję możemy uruchomić takim kodem:
SELECT dbo.nazwaFunkcji(Stanowisko) FROM pracownicy;
Rezultat:
Jan, Jakub |
Adam |
Jan, Jakub |
Michał |
Jak widać, funkcja dla każdego wiersza, zwróciła nam informacje o imionach pracowników, zajmujących dane stanowisko.
Jak to działa?
Uruchamiając zapytanie:
SELECT dbo.nazwaFunkcji(Stanowisko) FROM pracownicy;
„Przechodziliśmy” po wszystkich wierszach z tabeli pracownicy
, podając do funkcji nazwaFunkcji()
dane z kolumny Stanowisko
. W funkcji tej znowu przechodziliśmy, tym razem po całej tabeli pracownicy
tak aby odczytać imiona pracowników zajmujących dane stanowisko. Informacje te były zapisywane do zmiennej @imie
, którą na końcu zwróciliśmy.
Jak widać została zwrócona jedna wartość (zmienna @imie
) czyli zgodnie z tym co napisałem na początku nasza funkcja skalarna zwróciła pojedynczą daną.
Usuwanie funkcji
Funkcje możemy skasować za pomocą takiego kodu:
IF OBJECT_ID('dbo.nazwaFunkcji') IF NOT NULL --jeżeli funkcja istnieje DROP FUNCTION dbo.nazwaFunkcji; --kasowanie