Funkcje: Procedury składowane cz. IV
Procedury składowane to pewnego rodzaju funkcje tablicowe z tym wyjątkiem, że przy procedurach składowanych mamy większe możliwości operacji na danych. Oczywiście wszystko tak jak zwykłe funkcje zapisujemy bezpośrednio na serwerze bazodanowym, a następnie możemy ich użyć na przykład z poziomu jakiejś aplikacji korzystającej z bazy danych.
Procedury składowane mogą między innymi modyfikować dane w tabelach i co najważniejsze sprawdzać poprawność przesyłanych wartości. Oznacza to, że na przykład procedura składowana dodająca nowy wiersz w jakiejś tabeli automatycznie po stronie serwera SQL sprawdzi czy dane, które chcemy zapisać są poprawne czyli czy spełniają wcześniej ustalone kryteria.
Stosowanie procedur składowanych zwiększa również wydajność aplikacji. Należy tutaj zwrócić uwagę iż po stronie klienta, przesyłana jest tylko nazwa danej procedury wraz z danymi, a nie na przykład całe zapytanie SQL. Ważne jest również to, że wszystko wykonywane jest bezpośrednio na serwerze bazodanowym, a więc nie musimy po kilka razy przesyłać jakiś informacji.
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 |
Procedury składowane tworzymy bardzo podobnie jak zwykłe funkcje, które zostały opisane w poprzednich częściach tego artykułu.
Napiszmy przykładową procedurę składowaną, która będzie dodawała nowy wiersz do tabeli pracownicy. Musimy tutaj zwrócić uwagę między innymi na to, żeby żadne z pól nie było puste:
GO CREATE PROC dbo.dodaj_dane @imie VARCHAR(200) = NULL, @nazwisko VARCHAR(200) = NULL, @dataUrodzenia DATE = NULL, @stanowisko VARCHAR(200) = NULL, @dataZatrudnienia DATE = NULL AS DECLARE @blad AS NVARCHAR(500); IF @imie IS NULL OR @nazwisko IS NULL OR @dataUrodzenia IS NULL OR @stanowisko IS NULL OR @dataZatrudnienia IS NULL BEGIN SET @blad = 'Błędne dane!'; RAISERROR(@blad, 16,1); RETURN; END INSERT INTO pracownicy(Imie, Nazwisko, Data_urodzenia, Stanowisko, Data_zatrudnienia) VALUES (@imie, @nazwisko, @dataUrodzenia, @stanowisko, @dataZatrudnienia); GO
Kod ten podobnie jak zwykłe funkcje uruchamiamy w taki sposób (możemy to również zrobić z poziomu aplikacji klienckiej):
EXEC dbo.dodaj_dane @imie = 'Jan', @nazwisko = 'Kowalski', @dataUrodzenia = '1991-08-08', @stanowisko = 'Programista', @dataZatrudnienia = '2001-11-11' GO
Po uruchomieniu powyższego kodu otrzymamy informację, że 1 wiersz został dodany.
Tabela pracownicy
wygląda więc tak:
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 |
5 | Jan | Kowalski | 1991-08-08 | Programista | 2001-11-11 |
Jak widać na końcu pojawił się nowy wiersz.
Oczywiście w procedurze składowanej możemy umieścić również zapytania typu SELECT oraz DELETE
.
Ogólna struktura procedury składowanej w SQL
GO CREATE PROC nazwaProcedury --//Argumenty które przyjmuje np.: @imie VARCHAR(200) = NULL, @nazwisko VARCHAR(200) = NULL, --//@nazwaZmiennej typDanych = NULL - Opcjonalnie możemy od razu zainicjować zmienne AS --//Deklarowane jakieś inne zmienne (wewnętrzne) DECLARE @blad AS NVARCHAR(500); --//@nazwaZmiennej AS typDanych --//Sprawdzamy poprawność wprowadzonych danych np.: IF @imie IS NULL OR @nazwisko IS NULL BEGIN --//Jeżeli dane są nie poprawne wyświetlamy komunikat o błędzie SET @blad = 'Błędne dane!'; --//Ustawiamy komunikat RAISERROR(@blad, 16,1); RETURN; --//Kończymy działanie procedury END --//Dowolne zapytanie SQL, operujące na danych przekazanych jako argumenty INSERT INTO pracownicy(Imie, Nazwisko) VALUES (@imie, @nazwisko); GO
„Procedury to pewnego rodzaju funkcje SQL”??? To co to są funkcje SQL? Masło maślane, merytorycznie przeciętnie (że niby brak konieczności przesłaniea skryptu SQL ma być znaczącą optymalizacją), błędy gramatyczne też się pojawiają…
Fakt w tym pierwszym zdaniu jest drobna nieścisłość merytoryczna, zaraz poprawię ;-) A co do optymalizacji to nigdzie nie napisałem, że brak konieczności przesyłania całego zapytania znacznie przyspiesza ogólne działanie aplikacji klienckiej. Na pewno na to ma wpływ brak konieczności przesyłania danych po kilka razy (zwłaszcza przy wolnym łączu internetowym) proszę czytać dokładniej ;) A co do błędów gramatycznych to niestety pomimo wielu moich starań i tak zawsze gdzieś się będą pojawiać, jak jakieś znajduję to poprawiam.