tworzenie procedur i funkcji z wykorzystaniem języka transact sql

12
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.

Upload: siwydomel

Post on 14-Jun-2015

9.626 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

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;GOJeż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 DATABASECREATE TABLECREATE INDEXNastępujące polecenia nie mogą być łączone z innymi w tym samym pliku wsadowym:

Page 2: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

CREATE TRIGGERCREATE PROCEDURECREATE VIEWKorzystają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ępniewykonywane.

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, jaknp.: ładowanie lub konserwacja danych.USE Ewyp_autBEGIN TRANSELECT * INTO wyp_01 FROM wyp WHERE data_odd<’01/01/2001’;DELETE FROM wyp WHERE data_odd<’01/01/2001’;COMMIT TRAN;GOBEGIN TRANSELECT * INTO klienci_01 FROM klienci WHERE nr_klienta not in (SELECT nr_klienta from wypwhere data_wyp>’01/01/2001’);DELETE FROM klienci where nr_klienta not in (SELECT nr_klienta from wyp wheredata_wyp>’01/01/2001’);COMMIT TRAN;GOELEMENTY JĘZYKA KONTROLI PRZEPŁYWUJeż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 przydatnew 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}

Page 3: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

Wszystko, co można drukować to łańcuch ASCII (stała łańcuchowa) lub zmienna typu znakowego (stałalub o zmiennej długości).Blok IF...ELSEBlok 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 warunekWyraŜenie1ELSEWyraŜenie2IF (SELECT AVG(pensja) from pracownicy)<1600PRINT ‘średnia płaca poniżej 1600zł’ELSEPRINT ‘średnia płaca powyżej 1600zł’Wyrażenia CASEProgramiś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 expressionWHEN warunek1 THEN wyraŜenie1[[WHEN warunek2 THEN wyraŜenie2[ [...]][ELSE wyrażenie_n]ENDProste 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, (CASEWHEN pensja < 1500 THEN ‘mała’WHEN pensja BETWEEN 1500 and 2000 then ‘średnia’ELSE ‘duŜa’END) as jaka_pensjaFrom 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

Page 4: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

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) < 1800BEGINUPDATE pracownicy SET pensja = pensja * 1.05PRINT ‘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 przezuż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 razemz 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 procedurachskł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.

Page 5: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

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 wyp2003ASSELECT *FROM wypWHERE 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życzeniaEXEC wyp2003GOPoniższy kod tworzy procedurę składowaną, która podnosi pensję pracownika zgodnie z danymi zawartymi w zmiennych @z_dzial, @z_wysokoscCREATE PROCEDURE podwyzka @z_dzial varchar(20), @z_wysokosc integerASUPDATE pracownicy SET pracownicy.pensja=pracownicy.pensja+@z_wysokoscWHERE pracownicy.dzial=@z_dzial;Poniższe instrukcje uruchamiają procedurę składowaną podwyzkaUSE Ewyp_autEXEC podwyzka 'TECHNICZNY' ,20GOUSE Ewyp_autEXEC podwyzka @z_dzial= 'TECHNICZNY' , @z_wysokosc =20GO

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 ichtypy 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:

Page 6: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

- 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 lokalnychNajprostsze w budowaniu są funkcje skalarne. Podstawowa składnia w tym przypadku jestnastępująca:CREATE FUNCTION nazwa_użytkownika.nazwa funkcji(par1_nzwa typ1, par2_nazwa typ2)RETURNS wart_nazwa typTreść definiująca zwracaną wartośćRETURN wart_nazwaCREATE FUNCTION CALKA_N (@K_LEWY DECIMAL(16,10) ,@K_PRAWY DECIMAL(16,10))RETURNS DECIMAL(16,10)ASBEGINDECLARE @WYNIK DECIMAL(16,10)DECLARE @PUNKT DECIMAL(16,10)SET @PUNKT=@K_LEWYSET @WYNIK=0.0WHILE @PUNKT<@K_PRAWYBEGINSET @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)ENDRETURN @WYNIKENDSELECT 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

Page 7: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

ON nazwa_tabeliFOR AFTER (INSERT, UPDATE, DELETE)AS polecenia_SQLaPrzykład procedury wyzwalanej, sprawdzającej czy wypoŜyczane auto jest aktualnie na stanie (podobniew przypadku wypoŜyczania ksiąŜek – baza danych biblioteka)CREATE TRIGGER JUZ_WYPOZYCZONYON WYPFOR INSERTASIF(SELECT COUNT(*) FROM WYP, INSERTED WHEREWYP.NR_SAMOCHODU=INSERTED.NR_SAMOCHODU AND WYP.DATA_ODD IS NULL)<=1COMMIT TRANSACTIONELSEBEGINPRINT 'SAMOCHÓD JESZCZE NIE ODDANY'ROLLBACK TRANSACTIONENDPróba dodania rekordu poprzez wykonanie polecenia SQL:INSERT INTO wypVALUES (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 uruchomienieprocedury 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:

Page 8: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

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 ()

Page 9: Tworzenie procedur i funkcji z wykorzystaniem języka Transact SQL

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