Programowanie w SQL – procedury i funkcje

Transkrypt

Programowanie w SQL – procedury i funkcje
Programowanie w SQL – procedury i funkcje
UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}]
Funkcje użytkownika
1. Funkcje o wartościach skalarnych (ang. scalar–valued user–defined function) – zwracają jako
wynik pojedyńczą wartość. Instrukcja tworząca przykładową funkcję skalarną poniżej:
CREATE FUNCTION guid studenta (@nr indeksu varchar (6))
RETURNS uniqueidentifier
AS
BEGIN
RETURN
(
SELECT guid
FROM studenci
WHERE nr indeksu = @nr indeksu
)
END
Przykład wykorzystania funkcji a zarazem wywołanie funkcji w innej funkcji:
CREATE FUNCTION srednia(@nr indeksu varchar (6))
RETURNS float
AS
BEGIN
RETURN
(
SELECT AVG(CAST (ocena AS float) )
FROM egzaminy
WHERE student guid = dbo.guid studenta(@nr indeksu)
– – UWAGA na prefiks w nazwie funkcji
)
END
Z kolei wywołanie funkcji dbo.guid studenta może wyglądać następująco:
SELECT dbo.srednia(100000)
– – UWAGA na prefiks w nazwie funkcji
W celu usunięcia funkcji wystarczy wykonać polecenie:
DROP FUNCTION dbo.srednia
2. Funkcje o wartościach tabelarycznych (ang. table–valued function) – są nazywane również
sparametryzowanymi widokami, zwracają jako wartość tablicę rekordów, na przykład:
CREATE FUNCTION oceny(@nr indeksu AS varchar (6))
RETURNS TABLE
AS
RETURN
SELECT ocena
FROM egzaminy
WHERE student guid = dbo.guid studenta(@nr indeksu)
– – UWAGA na prefiks w nazwie funkcji
3. ... (ang. multi–statement table–valued function) – jest to funkcja o wartościach tabelarycznych z
tym, że zwracana tabela jest traktowana jak zmienna w ciele funkcji, na przykład poniższa funkcja
wyświetla ranking w bieżącej rekrutacji do pozycji @top:
CREATE FUNCTION ranking rekrutacji(@top int )
RETURNS @ranking TABLE – nazwanie zmiennej tabelarycznej i deklaracja tabeli
(
pozycja int IDENTITY ,
– – deklaracja kolumny typu int, która uzupełniana jest kolejnymi wartościami od 1
– – w ogólności IDENTITY ([początkowa wartość, inkrementacja])
imie varchar (30),
nazwisko varchar (30),
punkty int
)
AS
BEGIN
INSERT @ranking
SELECT TOP (@top) imie, nazwisko, punkty
FROM rekrutacja
ORDER BY punkty DESC
RETURN
END
oraz przykład wywołania
SELECT *
FROM dbo.ranking rekrutacji(10)
Procedury
4. Procedury składowane – są to prekompilowane wyrażenia języka SQL przechowywane na serwerze bazodanowym. Mogą być definiowane z parametrami wejściowymi i wyjściowymi, na przykład:
CREATE PROCEDURE dodaj kandydata
@imie varchar (30),
@nazwisko varchar (30),
@plec char (1),
@adres varchar (50),
@punkty int
AS
INSERT rekrutacja
VALUES (@imie, @nazwisko, @plec, @adres, @punkty)
została zdefiniowana tylko z parametrami wejściowymi: @imie, @nazwisko, @plec, @adres, @punkty, a jej wywołanie może wyglądać następująco:
EXECUTE rekrutacja ’Adam’, ’Wawrzyniak’, ’M’, ’Poznan’, 186
Poniżej przykład definicji procedury z obydwoma typami parametrów:
CREATE PROCEDURE lista kandydatow
@wzor imienia varchar (30),
@wzor nazwiska varchar (30),
@liczba int OUTPUT
AS
BEGIN
SET NOCOUNT ON – – wyłączenie wyświetlania liczby przetworzonych rekordów
SELECT @liczba = COUNT (*)
FROM rekrutacja
WHERE imie LIKE @wzor imienia AND nazwisko LIKE @wzor nazwiska
SELECT *
FROM rekrutacja
WHERE imie LIKE @wzor imienia AND nazwisko LIKE @wzor nazwiska
END
W celu wykorzystania procedury lista kandydatów konieczna jest deklaracja zmiennej do której
przekazana zostanie wartość zatem na przykład:
DECLARE @liczba int
EXEC lista kandydatow ’A%’, ’W%’, @liczba OUTPUT
SELECT @liczba
Domyślne wartości parametrów
Zarówno w przypadku funkcji jak i procedur możliwe jest określenie domyślnych parametrów wywołania
określając ich warotść, na przykład:
CREATE PROCEDURE lista przedmiotow
@wzor symbolu varchar (3) = ’%’,
@wzor nazwy varchar (30) = ’%’
AS
BEGIN
SELECT symbol, nazwa, punkty
FROM przedmioty
WHERE symbol LIKE @wzor symbolu AND nazwa LIKE @wzor nazwy
END
Dla powyżej zdefiniowanej procedury możliwe są następujące sposoby wywołania:
EXEC lista przedmiotow
EXEC lista przedmiotow ’M%’
EXEC lista przedmiotow ’A%’, ’ n%’
ale jeżeli chcemy zmienić tylko drugi parametr należy odwołać się do niego po nazwie następująco:
EXEC lista przedmiotow @wzor nazwy = ’ n%’
czyli wywołanie:
EXEC lista przedmiotow @wzor nazwy = ’ n%’, @wzor symbolu = ’A%’
ze zmienioną kolejnością parametrów, jest równoważne wywołaniu:
EXEC lista przedmiotow ’A%’, ’ n%’
Triggery – procedury wyzwalane
5. Triggery – są to pezparametrowe procedury użytkownika „wyzwalane” automatycznie w wyniku
wykonania jednego z poleceń: INSERT , DELETE , UPDATE , w trakcie (FOR ), po (AFTER
) lub zamiast (INSTEAD ) niego. Wykorzystują tabele systemowe inserted i deleted. Poniżej
przykład triggera, który jest zdefiniowany na tabeli studenci i usuwaja wpisy z tabeli egzaminy dla
studentów których chcemy usunąć z tabeli studenci:
CREATE TRIGGER trigger usun wpisy ON studenci
FOR DELETE
AS
BEGIN
IF EXISTS (SELECT * FROM deleted)
DELETE egzaminy
WHERE student guid IN (SELECT guid FROM deleted)
END
Sprawdzanie istnienia obiektów w bazie danych
Informacje o tabelach, widokach, procedurach i funkcjach zawartych w bazie danych znajdują się w
tabelach: sysobjects, syscolumns. Informacje o użytkownikach bazy danych znajdują się z kolei w tabeli
sysyusers. W celu sprawdzenia czy dany obiekt istnieje już w bazie danych można również skorzystać z
funkcji OBJECT ID(nazwa obiektu, typ obiektu) na przykład w przypadku procedury, możemy ją usunąć
(bez błędu) w następujący sposób:
IF OBJECT ID(’lista przedmiotow’, ’P’) IS NOT NULL
DROP PROCEDURE lista przedmiotow
Zadania
UWAGA: We wszystkich tworzonych procedurach i funkcjach należy dodać podstawową obsługę błędów.
Zadanie 1. Napisać procedurę dodawania nowych przedmiotów.
Zadanie 2. Napisać procedurę dodawania nowego studenta, przy czym konieczne jest wcześniejsze sprawdzenie, czy przeszedł on pomyślnie proces rekrutacji. Po dodaniu studenta, należy odpowiednie dane usunąć z tabeli rekrutacja. Pomocna może się również okazać funkcja wyznaczająca pierwszy wolny numer
indeksu.
Zadanie 3. Napisać procedurę dodawania nowego wpisu z egzaminu. W tym przypadku należy umożliwić
egzaminatorowi posługiwanie się symbolem lub pełną nazwą przedmiotu podczas dodawania wpisu.
Zadanie 4. Napisać trigger, który będzie przenosił usuwane dane z tabeli studenci do odpowiedniej tabeli
danych historycznych, np. studenci historia.

Podobne dokumenty