Programowanie w SQL definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE, kontynuacja działania od instrukcji za podaną etykietą GOTO etykieta, wyjście bezwarunkowe RETURN[n], ustawienie czasu wykonania instrukcji WAITFOR, użycie pętli WHILE z klauzulami BREAK, WHILE. 1
IF @test ELSE SELECT prawda SELECT fałsz Przykład Instrukcja warunkowa /* Utworzenie zmiennej lokalnej przechowującej pierwszą literę nazwy olejku*/ DECLARE @PierwszaLitera char(1) SELECT @PierwszaLitera = LEFT(Min(NazwaOlejku),1) FROM Olejki /* Wyświetlenie pierwszej litery*/ SELECT @PierwszaLitera /* Zastosowanie instrukcji IF...ELSE do sprawdzenia, czy pierwszą literą jest 'A'*/ IF @PierwszaLitera = 'A' PRINT 'Zgadza się, pierwszą literą jest A' ELSE PRINT 'Niestety, pierwszą literą nie jest A' 2
CASE W programie SQL Servre CASE jest funkcję (wyrażeniem) nie poleceniem. CASE wartość (wyrażenie) WHEN wyrażenie_1 THEN wyrażenie_wynikowe_1 WHEN wyrażenie_2 THEN wyrażenie_wynikowe_2... WHEN wyrażenie_n THEN wyrażenie_wynikowe_n [ELSE wyrażenie_wynikowe_else] END 3
CASE Wyrażenie CASE można stosować: w instrukcji SELECT, w klauzuli GROUP BY, w klauzuli ORDER By, w klauzuli SET polecenia UPDATE, w w liście wartości polecenia INSERT, w klauzuli WHERE poleceń SELECT, UPDATE, DELETE. 4
CASE Przykład SELECT NazwaOlejku, IdSkladnikaRosliny, CASE IDSkladnikaRosliny WHEN 1 THEN 'Orzechy i jagody' WHEN 2 THEN 'Owoc' WHEN 3 THEN 'Orzechy i jagody' WHEN 7 THEN 'Owoc' WHEN 8 THEN 'Orzechy i jagody' WHEN 14 THEN 'Orzechy i jagody' WHEN 12 THEN 'Owoc' WHEN 15 THEN 'Owoc' ELSE 'Pozostałe' END AS SkladnikUzytkowy FROM Olejki ORDER BY SkladnikUzytkowy 5
CASE Przykład SELECT TOP 10 NazwaOlejku, NazwaLacinska, CASE WHEN LEFT(NazwaOlejku,1) = 'B' THEN 'Nazwa na B' WHEN LEFT(NazwaLacinska, 1) = 'C' THEN 'Nazwa łacińska na C' ELSE 'Nazwa na inną literę' END AS WynikiTestu FROM Olejki ORDER BY NazwaOlejku 6
Funkcje spokrewnione z CASE Funkcje te należą do specyfikacji ANSI SQL-92: COALESCE, NULIF, ISNULL. COALESCE zwraca pierwszą niepustą (NOT NULL) wartość z listy wyrażeń. COALESCE (wyrażenie 1, wyrażenie 2,..., wyrażenie n ) równoważne z CASE... WHEN wyrażenie1 IS NOT NULL THEN wyrażenie1 WHEN wyrażenie2 IS NOT NULL THEN wyrażenie2 ELSE wyrażenien END 7
Funkcje spokrewnione z CASE NULLIF zwraca wartość NULL, jeżeli wyrażenie 1 =wyrażenie 2 NULLIF(wyrażenie 1,wyrażenie 2 ) równoważne z CASE WHEN wyrażenie1=wyrażenie2 THEN NULL ELSE wyrażenie1 END ISNULL przeciwieństwo funkcji NULLIF. ISNULL (wyrażenie 1,wyrażenie 2 ) równoważne z CASE WHEN wyrażenie1 IS NULL THEN wyrażenie 2 ELSE wyrażenie1 END 8
WHILE Pętla WHILE w najprostszej postaci zawiera wyrażenie logiczne oraz instrukcję lub blok instrukcji. Przykład --Użycie zmiennej lokalnej jako licznika DECLARE @licznik int SET @licznik = 1 WHILE @licznik < 11 BEGIN PRINT @licznik SET @licznik = @licznik + 1 END 9
WHILE...BREAK WHILE...CONTINUE Przykład --Użycie zmiennej lokalnej jako licznika DECLARE @licznik int SET @licznik = 1 WHILE @licznik < 25 BEGIN PRINT @licznik SET @licznik = @licznik + 1 IF @licznik >15 BREAK END 10
KURSORY deklaracja, otwieranie, zamykanie, zwolnienie kursora, polecenie FETCH pobranie wiersza do: zmiennej, według pozycji bezwzględnej, według pozycji względnej, 11
Kursory Typy kursorów: języka T-SQL tworzone za pomocą polecenia DECLARE CURSOR, kursory API tworzone za pomocą bibliotek ADO (ActiveX Date Object, OLE DB, ODBC lub DB-Library. Klasyfikacja kursorów obsługiwanych przez T-SQL wg właściwości: zdolności do odzwierciedlenia danych źródłowych czułość kursora (ang. cursor sensitivity), kierunku przemieszczania się w zestawie wierszy (w przód i tył, tylko w przód), zdolności do aktualizacji zestawu wierszy. Typy kursorów obsługiwane przez T-SQL: statyczne, kluczowe, dynamiczne, błyskawiczne. 12
Kursory Kursor statyczny tylko do odczytu, jedno lub dwu kierunkowy. Kursor kluczowy do odczytu lub od odczytu i aktualizacji, jedno lub dwu kierunkowe. Przy zmianie wartość uwzględniane są tylko zmiany dokonane przez kursor. Kursor dynamiczny odzwierciedla zmiany zarówno w ilościach elementów, jak i wartościach danych niezależnie czy zostały one dokonane przez ten kursor, czy przez innego użytkownika. Ograniczenie - instrukcja SELECT użyta do zdefiniowania kursora może zawierać klauzulę SELECT tylko wtedy, gdy istnieje indeks kolumn zastosowanych w tej klauzuli. Kursor błyskawiczny nieprzewijalny, tylko do odczytu. 13
Kursory - tworzenie DECLARE nazwa_kursora CURSOR [widoczność LOCAL/GLOBAL] [przewijanie- FORWARD_ONLY/SCROLL] [typ - STATIC/KEYSET/DYNAMIC/FAST_FORWARD] [blokada READ_ONLY/SCROLL_LOCK/OPTIMISTIC] [TYPE_WARNING] FOR instrukcja_selekcji [FOR UPDATE[OF nazwa-kolumny]] 14
Parametr FORWARD_ONLY przodu. Kursory tworzy kursor przewijany tylko do Parametr typu FORWARD_ONLY i FAST_FORWARD wykluczają się wzajemnie. Parametr READ_ONLY powoduje, że kursor nie może modyfikować danych źródłowych, chociaż mogą to robić inni użytkownicy. Parametr SCROLL_LOCKS powoduje, że dane źródłowe będą mogły być aktualizowane tylko przez kursor. Każda inna instrukcja UPDATE wykonywana nawet przez innego użytkownika zakończy się niepowodzeniem. Parametr OPTIMISTIC pozwala na aktualizację wierszy zarówno przez kursor jak i innych użytkowników. 15
Kursory Parametr TYPE_WARING powoduje, że SQL Server ostrzega przy konwersji na inny typ kursora. Klauzula FOR (wymagana) określa wiersze oraz kolumny znajdujące się w zestawie kursora. Parametr FOR UPDATE z opcją OF pozwala określić kolumny w których dopuszczalna będzie modyfikacja. 16
Otwieranie, zamykanie, zwalniane kursora Zestaw kursora zostaje utworzony dopiero w momencie jego otwarcia. Składnia instrukcji OPEN [GLOBAL] nazwa_kursora_lub_zmiennej Parametr GLOBAL pozwala uniknąć konfliktu nazw, gdy kursor lokalny i globalny maja taką samą nazwę. Polecenie CLOSE zwalnia zasoby sytemu używane do obsługi zestawu kursora oraz zwalnia ewentualne blokady nałożone na wiersze. CLOSE [GLOBAL] nazwa_kursora_lub_zmiennej DEALLOCATE[GLOBAL] nazwa_kursora_lub_zmiennej jest to ostatnie polecenie jakie należy wykonać w celu usunięcia kursora. 17
FETCH Polecenie FETCH pobiera wiersze z kursora zgodnie z podanym kierunkiem. FETCH [selektor_wiersza FROM] nazwa_kursora [INTO @zm1, @zm2,...] Funkcja @@FETCH_STATUT zwraca 0 po pomyślnym pobraniu kursora. Selektory wiersza dla kursorów przemijalnych: NEXT (następny), PRIOR (poprzedni), FIRST (pierwszy), LAST( ostatni), ABSOLUTE n (skok bezwzględny do n), RELATIVE n (skok względny o n). Uwaga dla kursora dynamicznego nie można wykonać operacji FETCH ABSOLUTE. Przy pominięciu selektora wiersza domyślnie pobierany jest następny wiersz. 18
Najczęściej wykonywanym poleceniem jest FETCH Najczęściej wykonywanym poleceniem jest FETCH NEXT z połączeniu z pętlą WHILE, dopóki funkcja NEXT z połączeniu z pętlą WHILE, dopóki funkcja @@FETCH_STATUS zwraca wartość 0, lub różną od @@FETCH_STATUS zwraca wartość 0, lub różną od 1. Pamiętaj, że pierwszą instrukcję należy wykonać 1. Pamiętaj, że pierwszą instrukcję należy wykonać przed rozpoczęciem pętli i sprawdzeniem stanu funkcji przed rozpoczęciem pętli i sprawdzeniem stanu funkcji @@FETCH_STATUS. @@FETCH_STATUS. FETCH RELATIVE n zwraca n ty wiersz wzglądem ostatniej operacji pobrania. Może być wykonywane ze znakiem minus. Uwaga Po otwarciu kursora, jego bieżąca pozycja znajduje się logicznie przed pierwszym wierszem. Przy pierwszej operacji pobrania, wykonywanej zaraz po poleceniu OPEN obwiązuje: FETCH NEXT równoważne FETCH FIRST, FETCH PRIOR nie zwraca żadnego wiersza, FETCH RELATIVE+n równoznaczne ABSOLUTE n, FETCH RELATIVE n nie zwraca żadnego wiersza. Klauzula INTO pozwala na przepisanie danych z każdego atrybutu na liście polecenia SELECT określonym zmiennym lokalnym. 19
UPADTE, DELETE UPDATE nazwa_tabeli SET lista_przypisań WHERE CURRENT OF nazwa_kursora Modyfikuje wiersz relacji będący bieżącym wierszem kursora, jest to operacja modyfikacji pozycjonowanej. DELETE FROM nazwa_tabeli WHERE CURRENT OF nazwa_kursora Usuwa z określonej relacji wiersz odpowiadający bieżącej pozycji kursora, jest to operacja usuwania pozycjonowanego. 20
Praca z kursorem 1. Zadeklarować kursor i określić instrukcją SELECT zestaw wynikowy, na którym operuje kursor. 2. Otworzyć kursor. ( jest to wykonanie polecenia DECLARE z kroku pierwszego). 3. Pobrać wiersze do kursora. 4. Zmodyfikować lub usunąć wiersze w tabeli. 5. Zamknąć kursor. 6. Zwolnić kursor, aby usunąć istniejące odwołania. 21
Zmienne kursorowe DECLARE @nazwa_zmiennej CURSOR SET @nazwa_zmiennej (przypisanie wartości). Składnia typu DECLARE Kursor CORSOR LOCAL FAST_FORWARD FOR SELECT nazwaolejku FROM olejki DECLARE @zmiennakursora CURSOR SET @zmiennakursora = Kursor 22
@@FETCH_STATUS Funkcja zwraca status ostatniej operacji pobrania wiersz z kursora. 0 polecenie zostało pomyślnie zakończone -1 nie ma dalszych wiersz (polecenie zakończyło się błędem) -2 - żądanych wiersz nie istnieje (nie pobrano żadnego wiersza) np. został usunięty z tabeli bazowej. 23