Professional Documents
Culture Documents
Wykład 03. T-SQL Cz. 1 Język Proceduralny MS SQL Server
Wykład 03. T-SQL Cz. 1 Język Proceduralny MS SQL Server
Następny
Język proceduralny - wiadomości ogólne.
Język
Poprzedni rozdział
proceduralny
rozdział
Język proceduralny (ang. procedural language) – język programowania umożliwiający tworzenie oprogramowania w postaci programu głównego oraz
wielu procedur (lub podprogramów), z których każda realizuje określoną funkcję i może być wywoływana wielokrotnie przez program główny. (Cyt.
Wikipedia).
Zapoznając się z językiem SQL poznawaliśmy sposoby wykonywania pojedynczych instrukcji tego języka. Jednak w praktyce na ogół istnieje
konieczność jednoczesnego wykonania większej liczby instrukcji, przekazania wyników pomiędzy tymi instrukcjami, sprawdzenia warunków ich
wykonania i uzależnienia od uzyskanych wyników dalszego postępowania z danymi. Składnia „czystego” SQL nie umożliwia wykonywania tak
zaawansowanych operacji.
Serwery baz danych oferują rozszerzenie języka SQL o konstrukcje typowe dla nieobiektowych języków programowania. Rozszerzenie to jest
zdefiniowane w standardzie języka SQL już od wersji z roku 1999 i nosi nazwę SQL/PSM. Producenci serwerów baz danych implementują jednak
własne rozwiązania i tak, Microsoft SQL Server oferuje język Transact-SQL (T-SQL), ORACLE posiada swój PL/SQL a IBM w bazie danych DB2
implementuje język SQL/PL.
Każdy z tych języków wprowadza takie rozwiązania jak zmienne, instrukcje warunkowe, instrukcje pętli, możliwość tworzenia procedur i funkcji oraz
inne charakterystyczne tylko dla środowisk baz danych (np. kursory, wyzwalacze). Wszystkie te konstrukcje stanowią uzupełnienie języka SQL, który
z definicji jest ich pozbawiony. Polecenia języka SQL mogą być elementami struktur języków proceduralnych.
Po stronie serwera bazy danych powinny być wykonywane wszystkie operacje związane ze składowaniem danych, centralną kontrolą spójności i
bezpieczeństwa danych. Znaczna część tych zadań może zostać zrealizowana wprost przez polecenia języka SQL, ale ich możliwości są mocno
ograniczone. Języki proceduralne pozwalają rozszerzyć te zadania, a pojedyncze instrukcje łączyć w większe struktury, które mogą być
przechowywane jako obiekty bazy danych:
procedury składowane
wyzwalacze
Procedury składowane to zwyczajowa nazwa procedur tworzonych i przechowywanych po stronie serwera bazy danych. Przymiotnik „składowane” ma
zaakcentować właśnie tą ich cechę.
Przystępując do nauki języków proceduralnych w bazach danych, należy pamiętać, że stanowią one uzupełnienie języka SQL a nie jego ekwiwalent.
Serwery baz danych najsprawniej wykonują polecenia języka SQL, zatem zawsze priorytetowym rozwiązaniem powinno być to, które wykorzystuje w
celu dokonania operacji na danych "czysty" SQL. Użycie instrukcji języka proceduralnego powinno pojawiać się dopiero wówczas, gdy pewne operacje
w SQL są niemożliwe do wykonania, z uwagi na naturalne ograniczenia tego języka. Również nie wszystkie konstrukcje języków proceduralnych są
jednakowo wydajne. Wskazówki dotyczące tych kwestii będą umieszczane w dalszej części wykładów.
Język proceduralny..
Jako pierwszy zostanie omówiony język Transact SQL (T-SQL) implementowany przez serwer firmy Microsoft. Język ten został stworzony przez
firmę SYBASE i wbudowany do serwerów tej firmy, później prawa do jego wykorzystania kupiła firma Microsoft. Obecnie jest wbudowywany w
kolejnych wersjach serwera MS SQL i wraz z nim rozwijany. W dalszej części wykładu będzie zasadniczo omawiana wersja MS SQL Server 2012.
T-SQL
posiada dość prostą składnię, niemniej umożliwiającą realizację
wszystkich niezbędnych zadań po stronie serwera bazy danych. Kod
wykonywany jest bezpośrednio na serwerze.
Po
stronie serwera bazy danych powinny być wykonywane wszystkie operacje
związane ze składowaniem danych, centralną kontrolą spójności i
bezpieczeństwa danych. Znaczna część tych zadań może zostać zrealizowana
wprost przez polecenia języka SQL. T-SQL pozwala
rozszerzyć te zadania, a pojedyncze instrukcje łączyć w większe
struktury, które mogą być przechowywane jako obiekty bazy danych:
procedury składowane
wyzwalacze
Pytania kontrolne
Prawda
Następny
Język rozdział
Fałsz Poprzedni
proceduralny
rozdział
Sprawdź odpowiedź
Fałsz
Prawda
Sprawdź odpowiedź
3. Użycie poleceń języka SQL zawsze powninno mieć wyższy priorytet, niż użycie języka proceduralnego.
Prawda
Fałsz
Sprawdź odpowiedź
2021 © PJATK
Witaj, Agnieszka AM
pisane z Następny
Blok
Zgodnie z wymogami standardu języka SQL, wszystkie słowa kluczowe, nazwy obiektów i zmiennych są Not Case Sensitive – mogą być
rozdział
Poprzedni
dowolnym użyciem małych i dużych liter. Dotyczy to zarówno składni SQL jak i T-SQL. Jednak ten stan może zostaćanonimowy
zmieniony przez zmianę ustawień
serwera.
rozdział
Pod pojęciem bloku anonimowego przyjęło sie rozumieć pewien zestaw instrukcji (poleceń) języka SQL i/lub T-SQl, które są wspólnie wykonywane.
Nazwa ta ma pełne uzasadnienie w ORACLE, gdzie konstrukcja bloku jest ściśle określona. Konstrukcja bloku anonimowego w T-SQL jest bardzo
prosta (może nawet za prosta – pozwalająca na nieporządne pisanie kodu) i w zasadzie nie sformalizowana. Jako blok może zostać potraktowana
niemal każda pojedyncza instrukcja. Instrukcje mogą być pisane w jednej linii, linie mogą być łamane w dowolnym miejscu bez użycia jakiegokolwiek
znacznika. Jednak zdecydowanie zaleca się wprowadzanie pewnego porządku – umieszczanie kolejnych linii jedna pod drugą, kończenie poleceń
średnikami (choć MS SQL Server tego nie wymaga), stosowanie wcięć.
W T-SQL każdy blok powinien być kończony słowem GO, będącym poleceniem wykonania instrukcji zawartych w bloku. W praktyce słowo GO jest na
ogół pomijane. Management studio uzupełnia nim (niejawnie) każdy blok, jeśli zostało ono pominięte. Jawne wprowadzanie GO staje się istotne, gdy
chcemy uruchomić kilka kolejnych, niezależnych od siebie programów (bolków).
Blok może (ale nie musi!) być wyróżniany słowami BEGIN (otwarecie bloku) i END (zamknięcie bloku). Bloki mogą być zagnieżdżane. Jeżeli zostanie
użyte słowo BEGIN otwierające blok, musi on zostać zamknięty słowem END.
Każda zadeklarowana lokalnie zmienna „żyje” do wystąpienia najbliższego wystąpienia słowa GO.
Wynik działania instrukcji SELECT jest wypisywany na pulpit aplikacji MS Management Studio w postaci zestawu odczytanych rekordów (Result set).
W przypadku poprawnego wykonania instrukcji DML wyświetlany jest komunikat o liczbie zmodyfikowanych wierszy np. (5 row(s) affected).
Komunikat ten jest też przekazywany do aplikacji. Może zostać wyłączony poleceniem SET NOCOUNT ON (i ponownie włączony SET NOCOUNT
OFF).
Identyczny efekt da zastąpienie słowa PRINT przez SELECT. Jednak PRINT pozwala tylko wypisać wartości na pulpit, podczas
gdy SELECT umożliwia też inne operacje.
Komentarze
Część kodu nie przeznaczona do wykonywania (wyłączona), nazywana jest komentarzem. W trakcie wykonywania programu będzie ona ignorowana
przez interpreter. W obu środowiskach (ORACLE i MS SQL) komentarz oznaczany jest jednakowo.
/* te wiersze są zakomentowane
wykonywania programu*/
Blok anonimowy
SELECT 1;
PRINT 1;
Sprawdź odpowiedź
Pytania kontrolne
GO
OPEN
BEGIN
Sprawdź odpowiedź
3. Liczba słów BEGIN i END użytych w składni dowolnie rozbudowanych poleceń musi być identyczna.
Tak
Nie
Sprawdź odpowiedź
Tak
NIe
Sprawdź odpowiedź
2021 © PJATK
Witaj, Agnieszka AM
Następny
Pojęcie zmiennej Zmienne Poprzedni rozdział
rozdział
Zmienna jest jednym z podstawowych elementów niezbędnych przy programowaniu kodu. Pojęcie zmiennej pojawia się w niemal każdym języku
programowania. Rolą zmiennej jest przechowywanie wartości (danych) określonego typu. Deklaracja zmiennej to przekazanie do serwera bazy
danych informacji o konieczności zarezerwowania w pamięci RAM obszaru o rozmiarze odpowiadającym typowi deklarowanej zmiennej. Nazwa
zmiennej to jednocześnie jej identyfikator (musi być unikalna w obszarze swojego działania), jak też pośrednio wskaźnik do miejsca jej
przechowywania w pamięci.
W języku T-SQL użycie każdej zmiennej musi zostać poprzedzone jej deklaracją. Nazwa każdej zmiennej musi rozpoczynać się znakiem @. i może
zawierać litery, cyfry i znaki podkreślenia. Litery alfabetów narodowych są w zasadzie akceptowane, ale sugeruję unikanie takich rozwiązań.
W celu zadeklarowania zmiennej używana jest instrukcja DECLARE a po niej nazwa zmiennej i jej typ.
Typy zmiennych – takie same jak w przypadku poleceń języka SQL w poleceniach tworzenia tabel – zostaną wymienione na końcu wykładu. Można w
uproszczeniu przyjąć, że mamy do czynienia z typami napisowymi (Char,Varchar), liczbami stałoprzecinkowymi (Inetger), zmiennoprzecinkowymi
(Decimal, Money), daty i czasu (Date, Time, Datetime).
Przykład 1
Przykład 2
@Data_urodzenia Date;
Instrukcja DECLARE może pojawiać się wielokrotnie, w dowolnym miejscu kodu. Jedynym wymogiem jest, aby deklaracja zmiennej poprzedzała jej
użycie (odwołanie się do niej).
Każda zadeklarowana zmienna otrzymuje domyślną wartość NULL, bez względu na typ danych. Aby ten stan zmienić, należy zmienną zainicjować,
czyli nadać jej wartość znaczącą (mówimy potocznie "podstawić wartość na zmienną"). nadanie początkowej wartości zmiennej może nastąpić wraz z
jej deklaracją.
Przykład 1
W powyższym przykładzie wszystkim zmiennym w trakcie ich deklarowania zostaną nadane wartości początkowe, które w dalszym procesie
wykonywania obliczeń mogą zostać zmienione.
Wartość podstawiana na zmienną w trakcie jej deklaracji może być wynikiem wykonania instrukcji SELECT
Przykład 2
Wartości zmiennym nie muszą być nadawane wraz z ich deklaracją. Ale należy pamiętać, że próba użycia w dowolnym wyrażeniu niezainicjowanej
zmiennej, czyli mającej wartość NULL, zwróci NULL jako wartość całego wyrażenia.
Zmienne systemowe
Zmienne systemowe
Nazwy zmiennych systemowych w T-SQL zaczynają się od podwójnego znaku @. Nie należy ich deklarować, są one Read Only. Służą do przekazania
(odczytania z nich) istotnych informacji przechowywanych lub wyliczanych przez serwer bazy danych. Kilka najczęściej używanych:
@@Rowcount – liczba rekordów, na których operowała ostatnia instrukcja SQL; w przypadku SELECT – liczba zwracanych przez instrukcję
rekordów,
@@Fetch_status – zwraca informację o podstawieniu rekordu w ostatniej instrukcji FETCH kursora (0 sukces, rekord podstawiony, -1 porażka,
rekord niepodstawiony).
Wyświetlenie (odczyt) wartości zmiennych systemowych odbywa się przy użyciu instrukcji PRINT lub SELECT – tak jak w przypadku każdej
zmiennej.
Zmienne
Pytania kontrolne
DECLARE @Ala;
Sprawdź odpowiedź
2. Które z poniższych instrukcji nie podstawi na zmienną żadnej wartości? Zakładamy, że zmienna @Ala typu Varchar(10) została wcześniej prawidłowo
zadeklarowana i wcześniej nie została zainicjowana.
Sprawdź odpowiedź
Print @@Rowcount;
OK
Zbiór pusty
Sprawdź odpowiedź
Print @Ela;
10
10
Następny
Błąd? Nie, tu wszystko jest składniowo poprawne. Zmienne Poprzedni rozdział
rozdział
Sprawdź odpowiedź
2021 © PJATK
Witaj, Agnieszka AM
Proste Następny
Pod pojęciem programu będziemy rozumieli sekwencję poleceń języka SQL i T-SQL. W obu rodzajach poleceń mogą być wykorzystywane zmienne,
programy Poprzedni rozdział
zarówno lokalne, deklarowane przez programistę, jak też omówione wcześniej zmienne systemowe. Instrukcjami SQL które mogą się pojawić jako
w T-SQL
składniki programów, są wszystkie składniowo poprawne polecenia DQL, DML, DDL i DQL. Mogą w nich być używane zmienne do przekazywania
rozdział
wartości, na których instrukcje operują. Podstawienie pojedynczej wartości odczytanej ze źródła danych na pojedynczą, wcześniej zadeklarowaną
zmienną, przedstawia poniższy przykład:
Przykład 1
FROM EMP;
Print 'W tabeli EMP zapisanych jest ' + Cast(@Ilu AS Varchar) + ' pracowników';
W T-SQL należy pamiętać o konieczności dokonywania jawnej konwersji danych na typ napisowych przy konkatenacji (funkcje Cast i Convert).
W jednej instrukcji SELECT można dokonać podstawienia kilku wartości na wcześniej zadeklarowane zmienne.
Przykład 2
FROM EMP;
Print 'W tabeli EMP zapisanych jest ' + Cast(@Ilu AS Varchar) + ' pracowników i zarabiają łącznie '
+ Cast(@Budzet As Varchar);
UWAGA
Jeżeli instrukcja SELECT zwróci więcej niż jeden wiersz, podstawienie wartości na pojedyncze zmienne (tak jak w powyższych przykładach)
POWIEDZIE SIĘ, a na zmienne zostaną podstawione wartości odczytane z ostatniego wiersza źródła danych.
Przykład 3:
W tym przykładzie usuniemy dział o podanej nazwie, ustawiając wartość Deptno pracowników tego działu na NULL. W komunikacie wyświetlimy liczbę
zmodyfikowanych rekordów.
FROM DEPT
Pytania kontrolne
1. Jaki będzie wynik wykonania poniższej sekwencji poleceń w środowisku MS SQL Server?
CREATE TABLE X (X1 Int);
INSERT INTO X (X1) VALUES (10), (20), (30);
DECLARE @X Int;
SELECT @X = X1 FROM X;
PRINT @X;
0
10
20
30
Jeżeli instrukcja SELECT odczytuje dane z więcej niż jednego rekordu, na zmienną jest podstawiana jest największa odczytana wartość
Jeżeli instrukcja SELECT odczytuje dane z więcej niż jednego rekordu, na zmienną jest podstawiana jest wartość z ostatniego odczytanego rekordu
Sprawdź odpowiedź
2021 © PJATK