You are on page 1of 9

Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

Transact-SQL, T-SQL oznacza transakcyjny SQL, czyli rozszerzenie języka SQL


umożliwiające tworzenie konstrukcji takich jak pętle, instrukcje warunkowe oraz zmienne.
Jest używany do tworzenia wyzwalaczy, procedur i funkcji składowanych w bazie. Został
stworzony przez Sybase i wbudowany do serwerów SQL tej firmy, później prawa kupiła
firma Microsoft i wykorzystuje ten język w kolejnych wersjach MS SQL Server.

Wyzwalacz (ang. trigger) jest to procedura wykonywana automatycznie jako reakcja na


pewne zdarzenia w tabeli bazy danych. Wyzwalacze mogą ograniczać dostęp do pewnych
danych, rejestrować zmiany danych lub nadzorować modyfikacje danych.

Istnieją trzy typowe zdarzenia powodujące wykonanie wyzwalaczy:

• dopisanie nowego rekordu do bazy danych w wyniku wykonania instrukcji INSERT,


• zmiana zawartości rekordu w wyniku wykonania instrukcji UPDATE oraz
• usunięcie rekordu w wyniku wykonania instrukcji DELETE.

Główne cechy wyzwalaczy to:

• nie mogą mieć parametrów (ale mogą zapisywać dane w tabelach tymczasowych)
• nie mogą zatwierdzać transakcji (COMMIT) ani ich wycofywać (ROLLBACK)
ponieważ działają w kontekście instrukcji SQL, która spowodowała ich uruchomienie
• mogą generować dodatkowe błędy, jeżeli są źle napisane.

PLIKI WSADOWE

Plik wsadowy jest zbiorem poleceń T-SQL (zadań wsadowych) interpretowanych przez SQL
Server jako całość. Polecenia są zgrupowane razem a polecenie GO oznacza koniec pliku
wsadowego. Następujący przykład pokazuje zadanie wsadowe.
USE EWYP_AUT;
BEGIN TRAN;
CREATE TABLE STANOWISKA (stanowisko char(15), wykaz_obowiazkow char(50));
INSERT INTO stanowiska (stanowisko) SELECT DISTINCT stanowisko FROM
pracownicy;
SELECT DISTINCT stanowisko FROM pracownicy ;
COMMIT TRAN;
GO
Jeżeli wystąpi błąd w składni w dowolnym miejscu zadania (polecenia) wsadowego, całe
zadanie jest usuwane (wyjątki !!!)
Niektóre polecenia mogą być usuwane w pliku wsadowym, podczas gdy dla innych nie jest to
możliwe.
Następujące polecenia CREATE mogą być połączone w pojedynczym pliku wsadowym:
CREATE DATABASE
CREATE TABLE
CREATE INDEX
Następujące polecenia nie mogą być łączone z innymi w tym samym pliku wsadowym:
CREATE TRIGGER
CREATE PROCEDURE
CREATE VIEW
Korzystając z zadań wsadowych należy mieć na uwadze jeszcze kilka innych kwestii. Zadanie
wsadowe jest poddawane : przetwarzaniu, analizie składniowej, optymalizowane,
kompilowane a następnie
wykonywane.

Skrypty

Skrypt jest zbiorem złożonym z jednego lub więcej zadań wsadowych, które są zapisywane
jako grupa. Skrypty są wykonywane na ogół jako część pewnej jednostki pracy, która ma
zostać zrealizowana, jak
np.: ładowanie lub konserwacja danych.
USE Ewyp_aut
BEGIN TRAN
SELECT * INTO wyp_01 FROM wyp WHERE data_odd<’01/01/2001’;
DELETE FROM wyp WHERE data_odd<’01/01/2001’;
COMMIT TRAN;
GO
BEGIN TRAN
SELECT * INTO klienci_01 FROM klienci WHERE nr_klienta not in (SELECT nr_klienta
from wyp
where data_wyp>’01/01/2001’);
DELETE FROM klienci where nr_klienta not in (SELECT nr_klienta from wyp where
data_wyp>’01/01/2001’);
COMMIT TRAN;
GO
ELEMENTY JĘZYKA KONTROLI PRZEPŁYWU
Jeżeli zadanie wsadowe z wieloma poleceniami jest wysyłane do SQL Servera do wykonania,
polecenia są wykonywane w kolejności, w jakiej zostały podane. Język T-SQL dostarcza
kilku poleceń, które pozwalają na zmianę kolejności wykonywania poleceń w pliku
wsadowym. Są one szczególnie przydatne
w transakcjach, procedurach wyzwalanych, funkcjach i procedurach składowanych.

Blok BEGIN...END

Niektóre z poleceń kontroli przepływu jakie zostaną omówione będą wymagały pojedynczego
polecenia jako części swojej składni. Wszędzie gdzie oczekiwane jest pojedyncze polecenie,
można używać tego pojedynczego polecenia. Jeżeli zajdzie potrzeba, aby wiele poleceń było
wykonywanych razem, należy zamknąć je pomiędzy słowami kluczowymi BEGIN i END.
Konstrukcja ta zostanie wykorzystana w kolejnych przykładach.

Polecenie PRINT

Do tego momentu, jedynym sposobem zwrócenia informacji z SQL Servera do programu


klienta było korzystanie z polecenia SELECT. SQL Server obsługuje również polecenie
PRINT, ale jest ono ograniczone:
PRINT {'dowolny tekstt' | @zmienna_lokalna | @@zmienna_globalna}
Wszystko, co można drukować to łańcuch ASCII (stała łańcuchowa) lub zmienna typu
znakowego (stała
lub o zmiennej długości).
Blok IF...ELSE
Blok IF..ELSE pozwala aby polecenie było wykonywane warunkowo. Po słowie IF występuje
wyrażenie, które musi być warunkiem typu prawda lub fałsz. Jeżeli wyrażenie jest
prawdziwe, to polecenie jest wykonywane. Opcjonalne słowo kluczowe ELSE wprowadza
polecenie alternatywne, które może być
wykonywane gdy wyrażenie występujące po IF jest fałszywe.
IF warunek
WyraŜenie1
ELSE
WyraŜenie2
IF (SELECT AVG(pensja) from pracownicy)<1600
PRINT ‘średnia płaca poniżej 1600zł’
ELSE
PRINT ‘średnia płaca powyżej 1600zł’
Wyrażenia CASE
Programiści często wymagają możliwości stosowania wyrażenia warunkowego w innym
poleceniu.
Wyrażenie CASE pozwala aby wyrażenia T-SQL były upraszczane dla wartości
warunkowych. Wyrażenie to pozwala zwracać różne wartości w zależności od wartości
kontrolnej lub warunku. Składnia prostego polecenia CASE wygląda następująco:
CASE expression
WHEN warunek1 THEN wyraŜenie1
[[WHEN warunek2 THEN wyraŜenie2[ [...]]
[ELSE wyrażenie_n]
END
Proste wyrażenie CASE porównuje wartość początkową z każdą z wartości na liście i zwraca
w wyniku skojarzone z tą wartością wyrażenie. Jeżeli żadne z wyrażeń nie zostanie
dopasowane, zwracane jest wyrażenie występujące po słowie kluczowym ELSE.
SELECT nazwisko, imie, (CASE
WHEN pensja < 1500 THEN ‘mała’
WHEN pensja BETWEEN 1500 and 2000 then ‘średnia’
ELSE ‘duŜa’
END) as jaka_pensja
From pracownicy

Polecenie WHILE

Język T-SQL posiada konstrukcję WHILE, która pozwala na wykonywanie powtarzane, aż do


momentu, gdy jest spełniony odpowiedni warunek. Używanie tej konstrukcji jest ograniczone
w wielu przypadkach, ponieważ ze swojej natury, SQL Server działa na zbiorach wierszy.
Przykładowo, nie ma potrzeby używania polecenia WHILE, aby przejrzeć wszystkie wiersze
w tabeli; polecenie SELECT pozwala przeglądnąć wszystkie wiersze, sprawdzając dla
każdego wiersza kryteria zawarte w poleceniu WHERE.
W niektórych sytuacjach potrzebna jest możliwość powtórzenia akcji. Można powtarzać
działanie wewnątrz transakcji (nie polecane, ponieważ transakcje powinny być małe i
szybkie), w procedurze składowanej lub w funkcji SQL. Konstrukcja WHILE jest
powtarzana, do czasu, aż podany warunek będzie prawdziwy. Podobnie jak w przypadku
IF...ELSE, jeżeli warunek zawiera polecenie SELECT, polecenie to w całości musi być ujęte
w nawiasy zwykłe.
Następujący przykład wielokrotnie sprawdza średnią pensję wszystkich pracowników.
Dopóki średnia płaca jest mniejsza niż 1800, płaca pracownika jest zwiększana o 5%.
Powtarzanie zostaje przerwane gdy średnia płaca jest większa lub równa 1800.
WHILE (SELECT AVG(pensja) FROM pracownicy) < 1800
BEGIN
UPDATE pracownicy SET pensja = pensja * 1.05
PRINT ‘pensja pracowników została podniesiona o 5%’
END

PROCEDURY SKŁADOWANE

Procedura składowana jest nazwanym, prekompilowanym zestawem instrukcji SQL,


przechowywanym na serwerze, zapewniającym szybszą i wydajniejszą realizację. Procedury
składowane mogą być uruchamiane przez pojedyncze wywołanie z aplikacji klienta,
dopuszczają zmienne deklarowane przez
użytkownika, wykonanie warunkowe i inne użyteczne właściwości programistyczne. Na
serwerze SQL występują procedury składowane różnych typów: systemowe, lokalne,
tymczasowe i zdalne. Systemowe procedury składowane są procedurami składowanymi
dostarczanymi razem
z serwerem SQL jako ułatwienie w pobieraniu informacji z tabel systemowych. Obsługują
one także zadania administratorskie w bazie, które powodują modyfikacje tabel systemowych
bez bezpośredniego odwoływania się do nich. Mogą być uruchamiane w każdej bazie.
Lokalne procedury składowane tworzone są w konkretnych bazach użytkownika.
Tymczasowe procedury składowane mogą być lokalne lub globalne—jako lokalne
tymczasowe procedury w ramach sesji użytkownika lub jako globalne tymczasowe procedury
w ramach sesji wszystkich użytkowników. Zdalne procedury składowane są procedurami
wywoływanymi ze zdalnego serwera lub przez klienta podłączonego do innego serwera.
Procedury składowane są podobne do procedur w innych językach programowania i mogą:
akceptować parametry, zawierać programowe instrukcje do realizacji zadań w bazie (np.
uruchamianie innych procedur), zwracać wartość stanu do procedury wywołującej lub wsadu,
aby sygnalizować udane lub nieudane wykonanie (i przyczynę błędu) oraz zwracać wiele
wartości w formie parametrów do procedury wywołującej lub wsadu. Procedury składowane
posiadają wiele zalet. Mogą one:
Realizować logikę aplikacji dla aplikacji klienckich, zapewniając spójność danych i
manipulacji nimi. Dostarczać logikę przetwarzania. Logika przetwarzania i założenia zawarte
w procedurach
składowanych mogą być zmieniane w jednym miejscu. Wszystkie aplikacje mogą używać
tych samych procedur składowanych, aby zapewnić spójność modyfikacji danych. Dostarczać
mechanizmy bezpieczeństwa. Użytkownik może mieć prawo do uruchamiania procedury
składowanej nawet jeśli nie ma praw do używanych przez procedurę tabel i widoków.
Automatycznie uruchamiać się przy starcie, jeśli systemowa procedura składowana
sp_procoption ma ustawioną opcje true. Procedury systemowe uruchamiane są przy starcie po
odbudowaniu wszystkich baz danych. Zwiększać wydajność, gdyż są prekompilowane, a po
pierwszym uruchomieniu pozostają w pamięci dla dalszych wywołań. Redukować obciążenie
sieci. Operacje mogą być wykonywane przez przesłanie pojedynczych instrukcji, zamiast
wysyłania setek linii kodu języka Transact-SQL. Procedury składowane redukują ilość żądań
wysyłanych przez klienta do serwera.
Instrukcja CREATE PROCEDURE (presidze) nie może być użyta w jednym wsadzie z
innymiinstrukcjami SQL.
Definicja CREATE PROCEDURE może zawierać dowolną ilość i typ instrukcji SQL z
wyjątkiem następujących: CREATE VIEW, CREATE TRIGGER, CREATE DEFAULT,
CREATE PROCEDUREi CREATE RULE. Inne obiekty bazy danych mogą być w
procedurze tworzone. Procedury składowane mogą odwoływać się do istniejących tabel,
widoków i procedur składowanych, a także tabel tymczasowych. Poniższy kod tworzy
procedurę składowaną, która wyświetla wypożyczenia przechowywane w tabeli dokonane w
2003 roku.
CREATE PROC wyp2003
AS
SELECT *
FROM wyp
WHERE data_wyp BETWEEN ‘01/01/2003’ and ‘12/31/2003’

Uruchamianie procedur składowanych

Procedury składowane uruchamia się przy użyciu instrukcji EXECUTE razem z nazwą
procedury i parametrami Poniższa instrukcja uruchamia procedurę składowaną wyp2003,
która wymienia wypożyczenia przechowywane w bazie wypożyczenia
EXEC wyp2003
GO
Poniższy kod tworzy procedurę składowaną, która podnosi pensję pracownika zgodnie z
danymi zawartymi w zmiennych @z_dzial, @z_wysokosc
CREATE PROCEDURE podwyzka @z_dzial varchar(20), @z_wysokosc integer
AS
UPDATE pracownicy SET pracownicy.pensja=pracownicy.pensja+@z_wysokosc
WHERE pracownicy.dzial=@z_dzial;
Poniższe instrukcje uruchamiają procedurę składowaną podwyzka
USE Ewyp_aut
EXEC podwyzka 'TECHNICZNY' ,20
GO
USE Ewyp_aut
EXEC podwyzka @z_dzial= 'TECHNICZNY' , @z_wysokosc =20
GO

FUNKCJE ZDEFINIOWANE PRZEZ UŻYTKOWNIKA

Ważną własnością SQL Servera 2005 jest możliwość definiowania przez użytkownika
własnych funkcji (User-Defined-Functions) których wartością może być skalar (tekst, data)
jak i tabela. Definiowane funkcje przez użytkownika mogą zależeć od wielu parametrów
(zmiennych). Klauzula RETURNS w definiowanych funkcjach decyduje czy zwracana jest
pojedyncza wartość czy też tabela.
Można wyróżnić dwa typy definicji funkcji UDF której wartością jest tabela:
- zwracana tabela jest wynikiem pojedynczego polecenia Select; wtedy nazwy kolumn i ich
typy są zdeterminowane przez polecenie Select (funkcja typu inline).
- definicja funkcji zawiera : określenie struktury tabeli wynikowej oraz wstawienie do niej
określonych rekordów. Określenie tego typu funkcji daje większą swobodę w jej
definiowaniu (funkcje typu multistatement)
Definicje funkcji typu multistatemen mogą zawierać następujące polecenia:
- przypisania
- polecenia kontroli przepływu
- operacje na kursorach
- polecenia deklarowania zmiennych
-polecenia INSERT, UPDATE, DELETE
- polecenia SET/SELECT, używane do przypisania wartości do zmiennych lokalnych
Najprostsze w budowaniu są funkcje skalarne. Podstawowa składnia w tym przypadku jest
następująca:
CREATE FUNCTION nazwa_użytkownika.nazwa funkcji
(par1_nzwa typ1, par2_nazwa typ2)
RETURNS wart_nazwa typ
Treść definiująca zwracaną wartość
RETURN wart_nazwa
CREATE FUNCTION CALKA_N (
@K_LEWY DECIMAL(16,10) ,@K_PRAWY DECIMAL(16,10))
RETURNS DECIMAL(16,10)
AS
BEGIN
DECLARE @WYNIK DECIMAL(16,10)
DECLARE @PUNKT DECIMAL(16,10)
SET @PUNKT=@K_LEWY
SET @WYNIK=0.0
WHILE @PUNKT<@K_PRAWY
BEGIN
SET @WYNIK=@WYNIK+1/(SQRT(2*PI()))*(((@K_PRAWY-
@K_LEWY)*0.00005*(EXP(-POWER(@PUNKT,2)/2)
+4*EXP(-POWER(@PUNKT+0.00005*(@K_PRAWY-@K_LEWY),2)/2)+EXP(-
POWER(@PUNKT+0.0001*(@K_PRAWY-@K_LEWY),2)/2))/3))
SET @PUNKT=@PUNKT+0.0001*(@K_PRAWY-@K_LEWY)
END
RETURN @WYNIK
END
SELECT DBO.CALKA_N(0,0.1),DBO.CALKA_N(0,1),DBO.CALKA_N(0,10)

PROCEDURY WYZWALANE

Procedura wyzwalana jest specjalnym typem procedury składowanej, wywoływanej


automatycznie przy próbie modyfikacji danych chronionych. Procedury wyzwalane pomagają
zachować integralność danych przez ochronę nieautoryzowanymi lub niespójnymi zmianami
danych. Procedury wyzwalane nie mają parametrów i nie mogą być wywoływane
bezpośrednio. Wszystkie procedury wyzwalane (INSERT, UPDATE, DELETE) domyślnie
uruchamiają się po wykonaniu modyfikacji danych. Zwane są one procedurami wyzwalanymi
AFTER. Procedury wyzwalane używają tabel wirtualnych Inserted, Deleted, o takiej samej
strukturze jak struktura tabeli aktualizowanej. Jeżeli dodawany jest nowy wiersz do tabeli
aktualizowanej, wpis rejestrowany jest w tabeli bazowej jak i w tabeli Inserted. Gdy dane są
usuwane, usunięty rekord przechowywany jest w tabeli Deleted. Uaktualnienie wiąże się z
umieszczeniem modyfikowanego rekordu w postaci oryginalnej w tabeli Deleted oraz tegoŜ
rekordu w wersji modyfikowanej w tabeli Inserted jak i w tabeli bazowej. Procedurę
wyzwalaną tworzy się za pomocą polecenia CREATE TRIGGER.
CREATE TRIGGER nazwa_triggera
ON nazwa_tabeli
FOR AFTER (INSERT, UPDATE, DELETE)
AS polecenia_SQLa
Przykład procedury wyzwalanej, sprawdzającej czy wypoŜyczane auto jest aktualnie na stanie
(podobnie
w przypadku wypoŜyczania ksiąŜek – baza danych biblioteka)
CREATE TRIGGER JUZ_WYPOZYCZONY
ON WYP
FOR INSERT
AS
IF(SELECT COUNT(*) FROM WYP, INSERTED WHERE
WYP.NR_SAMOCHODU=INSERTED.NR_SAMOCHODU AND WYP.DATA_ODD IS
NULL)<=1
COMMIT TRANSACTION
ELSE
BEGIN
PRINT 'SAMOCHÓD JESZCZE NIE ODDANY'
ROLLBACK TRANSACTION
END
Próba dodania rekordu poprzez wykonanie polecenia SQL:
INSERT INTO wyp
VALUES (INSERT INTO wyp VALUES (15, 7, 'Jan 1 2007 12:00AM', 'Jan 6 2007
12:00AM', 4, 6, 44,
62)
)
Kończy się komunikatem 'SAMOCHÓD JESZCZE NIE ODDANY'
Informacje o triggerach przechowywane są w tabeli systemowej syscomments.
Wyświetlenie tekstu tworzącego poszczególne procedury wyzwalane odbywa się poprzez
uruchomienie
procedury systemowej sp_helptext.
Przykład:
EXECUTE sp_helptext juz_wypozyczony

Tworzenie funkcji

W Transact-SQL, podstawowe formuły tworzenia funkcji:

CREATE FUNCTION FunctionName ()

Przy tworzeniu funkcji, musisz określić typ wartości jaką funkcja zwróci.. Aby dostarczyć
tych informacji, po nazwie funkcji, typu RETURNS słowa kluczowego po definicji typu
danych. Oto prosty przykład:

CREATE FUNCTION Addition()


RETURNS Decimal(6,3)

Po określeniu typu wartość funkcji wróci, można utworzyć ciało funkcji. Ciało funkcji
zaczyna się początek i kończy się słowa kluczowe END. Oto przykład:
CREATE FUNCTION Dodatek ()
RETURNS Decimal(6,3)
BEGIN
END

Opcjonalnie, można wpisać słowo kluczowe przed danym słowem BEGIN:

CREATE FUNCTION Addition()


RETURNS Decimal(6,3)
AS
BEGIN
END

Pomiędzy BEGIN i słowa kluczowe celowi, którym jest część, która stanowi zbiór funkcji,
można zdefiniować zadania funkcja które musi wykonać. Po wykonaniu tego zadania, tuż
przed kluczowym END, należy określić wartość zwraca. Odbywa się to poprzez wpisanie
słowa kluczowego return po wypowiedziWzór próbce wynosi:

CREATE FUNCTION Addition()


RETURNS Decimal(6,3)
AS
BEGIN
RETURN Expression
END

Oto przykład

CREATE FUNCTION GetFullName()


RETURNS varchar(100)
AS
BEGIN
RETURN 'Doe, John'
END

Oto kolejny przykład:

CREATE FUNCTION CalculateWeeklySalary() CREATE


RETURNS Decimal(8, 2)
AS
BEGIN B
RETURN 880.44
END;
GO

Wywoływanie Funkcji

Po funkcja została utworzona, można użyć wartości wraca. Korzystanie z funkcji jest także
dalej nazywając ją. Aby wywołać funkcję, należy zakwalifikować jego nazwę. Aby to zrobić,
wpisz nazwę bazy danych, w którym została utworzona, a następnie przez operatora okresie, a
następnie dbo, a następnie przez operatora okresie, a następnie nazwę funkcji, a jego
nawiasach. Wzór do wykorzystania jest:

DatabaseName .dbo. FunctionName () DatabaseName. Dbo. NazwaFunkcji ()


Ponieważ funkcja zwraca wartość, możesz użyć tej wartości zgodnie z potrzebami. Na
przykład, można użyć PRINT wydrukować lub SELECT wyświetlanie funkcji wartości okna
kwerendy.: Oto przykład, że rozmowy nad Dodatek () function:

PRINT Exercise.dbo.GetFullName(); Exercise.dbo.GetFullName print ();

Jako alternatywę do połączenia funkcji, w Object Explorer, kliknij prawym przyciskiem


myszy jego nazwę, położenie myszy na Script Function As, SELECT opcję, a następnie
kliknij przycisk New Query Editor Window.

Dominik Obarski

Rok V TRiL

You might also like