TWORZENIE PROCEDUR SK艁ADOWANYCH I FUNKCJI BAZODANOWYCH
Z WYKORZYSTANIEM NARZ臉DZIA
MS SQL SERVER
Warszawa 2007
Spis tre艣ci
1. Wprowadzenie
Wprowadzenie
Procedury sk艂adowane s膮 obiektami zapewniaj膮cymi realizacj臋 ci膮gu zdefiniowanych w procedurze operacji w ramach jednego prostego wywo艂ania. Pozwalaj膮 na budowanie z艂o偶onych (cz臋sto zagnie偶d偶onych struktur programistycznych), a potem wywo艂ywanie ich w dowolnych miejscach programu. Umo偶liwia to tworzenie r贸wnie偶 takich struktur, kt贸re wykonuj膮 kilka r贸偶nych operacji w ramach uruchomienia jednej procedury.
Funkcje bazodanowe, podobnie jak procedury sk艂adowane, s膮 obiektami umieszczonymi na serwerze bazy danych. Posiadaj膮 jednak par臋 dodatkowych cech, kt贸rymi odr贸偶niaj膮 si臋 od procedur, a znacznie u艂atwiaj膮 przeprowadzanie ca艂ego szeregu tworz膮cych je operacji.
Procedury sk艂adowane tworzymy podobnie jak skrypty sql, ale dzia艂aj膮 one znacznie szybciej ni偶 taki sam skrypt. Dzieje si臋 tak, poniewa偶 SQL Server przy ka偶dym uruchamianiu skryptu musi wykona膰:
sprawdzenie poprawno艣ci wpisanego skryptu,
sprawdzenie statystyk,
wykonanie planu zapytania.
Za ka偶dym razem, gdy wykonywany jest skrypt SQL, wszystkie powy偶sze operacje s膮 realizowane podczas jego uruchomienia. Procedura sk艂adowana jest z definicji sprawdzana przez kompilator podczas jej tworzenia, a plan zapytania jest tworzony automatycznie przy jej pierwszym uruchomieniu. Tak wi臋c dodatkowym atutem procedur sk艂adowanych jest szybko艣膰 ich dzia艂ania w stosunku do skrypt贸w.
Poni偶sze 膰wiczenia umo偶liwi膮 zapoznanie si臋 ze sk艂adni膮 procedur i funkcji sk艂adowanych w MS SQL Server.
Procedury sk艂adowane
Wprowadzenie
Procedury sk艂adowane s膮 zbiorami instrukcji j臋zyka SQL zapisanymi pod wsp贸ln膮 nazw膮 i wywo艂ywanymi jak pojedyncza instrukcja. Procedury sk艂adowane umo偶liwiaj膮:
przekazywanie parametr贸w wywo艂ania,
wykonywanie instrukcji j臋zyka SQL - w tym wywo艂ywania innych procedur sk艂adowanych,
zwracanie dowolnej liczby wynik贸w do programu, kt贸ry wywo艂a艂 t臋 procedur臋,
zwracanie informacji o udanej lub niewykonanej procedurze.
Procedury sk艂adowane s膮 podstaw膮 przy tworzeniu warstwy bazodanowej system贸w informatycznych. S膮 powszechnie u偶ywane w celu:
implementacji regu艂 logiki biznesowej,
zabezpieczenia obiekt贸w bazy danych przed bezpo艣rednim dost臋pem u偶ytkownik贸w,
ochrony bazy danych przed atakami polegaj膮cymi na iniekcji kodu SQL,
poprawy wydajno艣ci cz臋sto wykonywanych instrukcji,
zminimalizowania obci膮偶enia sieci - zamiast wysy艂a膰 ca艂e instrukcje j臋zyka SQL, u偶ytkownik wywo艂uje jedynie procedur臋, wysy艂aj膮c jej nazw臋 i przekazuj膮c parametry jej wywo艂ania.
Wewn膮trz procedury mo偶emy umieszcza膰 dowolne instrukcje SQL. Dzi臋ki temu mo偶na stworzy膰 standardow膮 procedur臋, kt贸ra zapewni realizacj臋 okre艣lonych operacji, np. nada uprawnienia okre艣lonemu u偶ytkownikowi albo usunie u偶ytkownika i zapisy z nim zwi膮zane z bazy danych. Takie grupowanie operacji usprawni obs艂ug臋 bazy danych i stworzy standardowe podprogramy, kt贸re b臋d膮 mo偶liwe do wielokrotnego wykorzystania w r贸偶nych typach zastosowa艅. Wywo艂anie procedury z wn臋trza programu spowoduje automatyczne pobranie przez ni膮 danych wej艣ciowych i wykonanie wszystkich operacji, kt贸re zosta艂y w niej zapisane.
Ka偶da procedura sk艂ada si臋 z nazwy oraz parametr贸w, dzi臋ki kt贸rym komunikuje si臋 z programem. Aby utworzy膰 procedur臋 sk艂adowan膮 wystarczy wstawi膰 blok instrukcji w szablon tworz膮cy procedur臋 sk艂adowan膮: CREATE PROCEDURE.
Zadanie 1
Przygotowa膰 procedur臋 sk艂adowan膮, kt贸rej zadaniem jest wprowadzenie tabel: Jezyki oraz PracJezyki do bazy danych Kadry oraz wygenerowanie relacji pomi臋dzy tabelami Pracownicy -> PracJezyki i Jezyki -> PracJezyki.
Tabela Jezyki sk艂ada si臋 z jednego pola, kt贸re jest jednocze艣nie kluczem podstawowym, o nazwie Jezyk. Pole to b臋dzie przechowywa艂o nazwy wszystkich mo偶liwych j臋zyk贸w, jakimi pos艂uguj膮 si臋 pracownicy firmy.
Tabela PracJezyki sk艂ada si臋 z trzech p贸l: idPracJezyki (pole - klucz podstawowy tabeli), idPrac (numer pracownika), Jezyk (nazwa jezyka) oraz Poziom (poziom umiej臋tno艣ci w pos艂ugiwaniu si臋 j臋zykiem).
Wykonanie zadania 1
Nale偶y odnale藕膰 w folderze Databases - Kadry - Programmability folder przechowuj膮cy procedury sk艂adowane - Stored Procedures i z menu podr臋cznego wybra膰 opcj臋 New Stored Procedure (pp. Rys. 1)
Rys. 1 Tworzenie nowej procedury sk艂adowanej
W oknie roboczym po prawej stronie pojawi si臋 szablon procedury (pp. Rys. 2).
Rys. 2 Szablon procedury sk艂adowanej
W szablon nale偶y wprowadzi膰 procedur臋, kt贸ra utworzy dwie tabele oraz relacje pomi臋dzy nimi - zgodnie z wytycznymi podanymi w zadaniu 1 (pp. Rys. 3).
Rys. 3 Tre艣膰 procedury sk艂adowanej Tworzenie_Tabel
Po wpisaniu tre艣ci procedury wystarczy j膮 uruchomi膰 (przycisk Execute), a nast臋pnie od艣wie偶y膰 folder Stored Procedures i sprawdzi膰 czy nowa procedura sk艂adowana zosta艂a utworzona (pp. Rys. 4)
Rys. 4 Utworzona procedura sk艂adowana w folderze Stored Procedures
Utworzona procedura mo偶e by膰 w ka偶dym momencie uruchomiona z menu podr臋cznego na nazwie procedury - po wybraniu opcji Execute Stored Procedure (pp. Rys. 5).
Rys. 5 Uruchamianie procedury sk艂adowanej
UWAGA! Przy ponownym uruchomieniem procedury trzeba z folderu Tables usun膮膰 najpierw tabel臋 PracJezyki, a nast臋pnie tabel臋 Jezyki.
Tabele zosta艂y utworzone - co mo偶na sprawdzi膰 na li艣cie tabel bazy danych (pp. Rys. 6)
Rys. 6 Nowe tabele na li艣cie bazy danych Kadry
Nale偶y te偶 uaktualni膰 struktur臋 relacji bazy danych (pp. Rys. 7)
Rys. 7 Uaktualniona struktura bazy danych Kadry
Zadanie 2
Przygotowa膰 procedur臋 sk艂adowan膮, kt贸rej zadaniem jest wprowadzenie do tabel Jezyki i PracJezyki nowych rekord贸w.
Wykonanie zadania 2
Tre艣膰 procedury, kt贸r膮 nale偶y utworzy膰 prezentuje Rys. 8.
Rys. 8 Tre艣膰 procedury Wprowadzanie_danych
Procedura powinna spowodowa膰 wprowadzenie do tabeli Jezyki 6 nowych rekord贸w I do tabeli PracJezyki - 40 nowych rekord贸w (dane oczywi艣cie mog膮 si臋 r贸偶ni膰 w stosunku do zamieszczonego przyk艂adu). Procedura powinna by膰 dost臋pna na li艣cie procedur sk艂adowanych (pp. Rys. 9).
Rys. 9 Uruchamianie procedury Wprowadzanie_danych
Zadanie 3
Przygotowa膰 procedur臋 sk艂adowan膮, kt贸rej zadaniem jest wy艣wietlenie informacji o pracownikach i ich umiej臋tno艣ci pos艂ugiwania si臋 j臋zykami posortowanych wed艂ug nazw jednostek organizacyjnych (miejsca zatrudnienia pracownik贸w) i wed艂ug nazwisk pracownik贸w.
Wykonanie zadania 3
Tre艣膰 procedury sk艂adowanej prezentuje Rys. 10.
Rys. 10 Tre艣膰 procedury Pracownicy_Jezyki
Po uruchomieniu procedury sk艂adowanej (Execute Stored Procedure) mo偶na obejrze膰 jej wyniki (pp. Rys. 11).
Rys. 11 Wynik dzia艂ania procedury Pracownicy_Jezyki
Zadanie 4
Przygotowa膰 procedur臋 sk艂adowan膮, kt贸rej zadaniem jest wyszukanie informacji o pracownikach, kt贸rzy pos艂uguj膮 si臋 konkretnym j臋zykiem (j臋zyk to parametr procedury) na okre艣lonym poziomie (poziom to parametr procedury).
Wykonanie zadania 4
Kolejna procedura sk艂adowana to procedura z parametrem. Wynik jej dzia艂ania b臋dzie uzale偶niony od tego, jakie warto艣ci parametr贸w wyspecyfikuje u偶ytkownik w momencie uruchamiania procedury. Tre艣膰 procedury sk艂adowanej prezentuje Rys. 12.
Rys. 12 Tre艣膰 procedury z parametrem Jezyk_Poziom
Po wywo艂aniu procedury (Execute Stored Procedure) pojawi si臋 okno, do kt贸rego nale偶y wprowadzi膰 warto艣ci parametr贸w: nazw臋 j臋zyka i nazw臋 poziomu (pp. Rys. 13)
Rys. 13 Wprowadzanie warto艣ci parametr贸w procedury
Po wprowadzeniu poprawnych warto艣ci parametr贸w w oknie wynik贸w pojawi si臋 wynik dzia艂ania procedury sk艂adowanej z parametrem (pp. Rys. 14).
Rys. 14 Okno wynik贸w procedury Jezyki_Poziom
Zadanie 5
Przygotowa膰 procedur臋 sk艂adowan膮, kt贸rej zadaniem jest udzielenie podwy偶ki (wysoko艣膰 podwy偶ki to parametr) wszystkim pracownikom pos艂uguj膮cym si臋 w stopniu dobrym lub bardzo dobrym wskazanym j臋zykiem (nazwa j臋zyka to parametr).
Wykonanie zadania 5
Tre艣膰 procedury sk艂adowanej prezentuje Rys. 15. Instrukcja UPDATE dokona podwy偶szenia p艂acy pracownik贸w o wskazan膮 przez u偶ytkownika warto艣膰 podwy偶ki. Instrukcja SELECT wy艣wietli dane wszystkich pracownik贸w pos艂uguj膮cych si臋 wskazanym przez u偶ytkownika j臋zykiem.
Rys. 15 Tre艣膰 procedury z parametrem Podwyzka
Instrukcja SELECT zosta艂a tak napisana, 偶e wy艣wietli wszystkich pracownik贸w, kt贸rzy pos艂uguj膮 si臋 danym j臋zykiem na wszystkich poziomach (bardzo dobrym, dobrym i niskim). Natomiast podwy偶k臋 otrzymali tylko ci, kt贸rzy j臋zykiem pos艂uguj膮 si臋 na poziomie dobrym lub bardzo dobrym. Dlatego powinna by膰 widoczna r贸偶nica w p艂acy tych pracownik贸w, kt贸rzy otrzymali i nie otrzymali podwy偶ki (pp. Rys. 16 i Rys. 17).
Rys. 16 Parametry procedury Podwyzka
Rys. 17 Wyniki dzia艂ania procedury Podwyzka
Funkcje bazodanowe
Wprowadzenie
Funkcje bazodanowe, kt贸re u偶ytkownik sam mo偶e zdefiniowa膰, a nast臋pnie wywo艂ywa膰 je w obr臋bie r贸偶nych skrypt贸w i podprogram贸w mo偶na podzieli膰 na trzy typy:
inline table-valued,
multi-statement table-valued,
scalar-valued.
Funkcje tabelaryczne rozwijane (ang. inline table-valued) zwracaj膮 dane w postaci tabeli. Mo偶na ich u偶ywa膰 zamiast widok贸w (ang. views). Maj膮 t臋 przewag臋 nad widokami, 偶e umo偶liwiaj膮 przekazanie parametru do funkcji.
Funkcje tabelaryczne wielowierszowe (ang. multi-statement table-valued) to najbardziej zaawansowany rodzaj funkcji u偶ytkownika. Podobnie jak funkcje tabelaryczne rozwijane zwracaj膮 dane w postaci tabeli, jednak pozwalaj膮 na bardziej skomplikowany spos贸b tworzenia zwracanego zestawu danych. W funkcji tego typu najpierw deklaruje si臋 struktur臋 zwracanej tabeli. Nast臋pnie, aby zbudowa膰 zwracan膮 tabel臋, mo偶na u偶y膰 dowolnych instrukcji Transact SQL, oczywi艣cie z wyj膮tkiem funkcji wbudowanych - niedost臋pnych dla funkcji u偶ytkownika. Zadeklarowan膮 struktur臋 tabeli traktuje si臋 tak, jak ka偶d膮 inn膮 tabel臋 bazy danych i dodaje si臋 do niej kolejne rekordy za pomoc膮 instrukcji INSERT.
Funkcje skalarne (ang. Scalar) zwracaj膮 pojedyncz膮 warto艣膰, kt贸ra mo偶e by膰 dowolnego typu obs艂ugiwanego przez MS SQL Server. Funkcje te znajduj膮 zastosowanie np. w ograniczeniach sprawdzaj膮cych (CHECK CONSTRAINT).
Zadanie 1
Przygotowa膰 funkcj臋, kt贸ra zmieni uk艂ad daty ze standardowego formatu: rrrr-mm-dd hh:mm:ss na format niestandardowy: dd-mm-rrrr. Parametrem funkcji powinien by膰 separator daty (dopuszczalny dowolny znak, np. `-`, `:', `/') oraz sama data, kt贸ra podlega formatowaniu. Zastosowa膰 t臋 funkcj臋 do przeformatowania p贸l DataUrP i DataZatP w tabeli Pracownicy.
Wykonanie zadania 1
Utworzy膰 now膮 funkcj臋 tabelaryczn膮 rozwijan膮 (pp. Rys. 18)
Rys. 18 Tworzenie funkcji tabelarycznej rozwijanej
Tre艣膰 funkcji prezentuje Rys. 19. Funkcja pobiera, jako parametry, dat臋 do formatowania (@Data) i separator tej daty (@Separator), a nast臋pnie do艂膮cza do tabeli nowa kolumn臋 o nazwie DataForm, kt贸ra zawiera t臋 sam膮 dat臋, ale ju偶 sformatowan膮.
Rys. 19 Tre艣膰 funkcji Format_Daty
Po uruchomieniu funkcja zostanie w艂膮czona do grupy funkcji Table-valued Functions (pp. Rys. 20)
Rys. 20 Folder funkcji bazodanowych
呕eby zobaczy膰 wynik dzia艂ania funkcji, nale偶y jej tre艣膰 rozszerzy膰 o wywo艂anie zawieraj膮ce warto艣ci parametr贸w funkcji: data do formatowania to pole DataUrP, separator daty to znak `/' (pp. Rys. 21).
Rys. 21 Formatowanie pola DataUrP w tabeli Pracownicy
Funkcj臋 mo偶na te偶 wywo艂ywa膰 z innymi warto艣ciami parametr贸w, np. DataUrP, `:'. Mo偶na te偶 wywo艂anie odnie艣膰 do innej tabeli - Dzieci lub Projekty. Na Rys. 22 przedstawiono przyk艂ad formatowania daty rozpocz臋cia projektu - pole DataRoz w tabeli Projekty. Separatorem daty jest znak dwukropka (:). Przy kolejnym uruchomieniu funkcji w nag艂贸wku kolumny nale偶y zmieni膰 s艂owo kluczowe CREATE na ALTER (pp. Rys. 22)
Rys. 22 Formatowanie pola DataRoz w tabeli Projekty
Zadanie 2
Przygotowa膰 funkcj臋 bazodanow膮, kt贸ra wyznaczy liczb臋 pracownik贸w pos艂uguj膮cych si臋 na poszczeg贸lnych poziomach umiej臋tno艣ci poszczeg贸lnymi j臋zykami.
Wykonanie zadania 2
Tym razem skorzystamy z funkcji typu tabelaryczna wielowierszowa (pp. Rys. 23), kt贸ra utworzy now膮 tabel臋 (kt贸ra mo偶e by膰 zachowana w charakterze widoku).
Rys. 23 Tworzenie funkcji tabelarycznej wielowierszowej
Tre艣膰 funkcji prezentuje Rys. 24. Nowo tworzona tabela @LiczbaPrac sk艂ada si臋 z trzech kolumn: Jezyk, Poziom i LiczbaPracow (liczba pracownik贸w, kt贸rzy pos艂uguj膮 si臋 danym j臋zykiem na okre艣lonym poziomie). Funkcja Liczba_PracJezyki nie posiada 偶adnego parametru.
Rys. 24 Tre艣膰 funkcji Liczba_PracJezyk
Po dodaniu wywo艂ania funkcji mo偶na obejrze膰 wyniki jej dzia艂ania (pp. Rys. 25).
Rys. 25 Wywo艂anie funkcji Liczba_PracJezyki
Zadanie 3
Przygotowa膰 funkcj臋 bazodanow膮, kt贸ra policzy ile czasu up艂yn臋艂o pomi臋dzy wskazanymi datami. Daty s膮 parametrami funkcji. Je偶eli pomi臋dzy datami up艂yn臋艂o ponad 365 dni to wynik podawany jest w latach, a w przeciwnym wypadku wynik jest wyznaczany w dniach.
Wykonanie zadania 3
Nale偶y wybra膰 funkcj臋 skalarn膮 (pp. Rys. 26).
Rys. 26 Tworzenie funkcji skalarnej
Tre艣膰 funkcji prezentuje Rys. 27.
Rys. 27 Tre艣膰 funkcji Jak_Dlugo
Funkcji mo偶na u偶y膰 do obliczenia czasu trwania od rozpocz臋cia do zako艅czenia realizacji poszczeg贸lnych projekt贸w (pp. Rys. 28)
Rys. 28 Zastosowanie funkcji w tabeli Projekty
Funkcji mo偶na tak偶e u偶y膰 do obliczenia sta偶u pracy pracownik贸w (pp. Rys. 29). Przy kolejnym uruchomieniu funkcji nale偶y w nag艂贸wku procedury s艂owo kluczowe CREATE zast膮pi膰 s艂owem kluczowym ALTER (pp. Rys. 29).
Rys. 29 Zastosowanie funkcji w tabeli Pracownicy
Zadanie do wykonania
Przygotowa膰 procedury sk艂adowane i funkcje bazodanowe dla swojego projektu. Zadanie stanowi element oceniany.
dr in偶. T. Ostrowska, dr in偶. K. Rostek Zak艂ad System贸w Informatycznych
IOSP PW Bazy Danych - laboratorium
cw 13-14 Procedury sk艂adowane i funkcje bazodanowe, 2007-09-25