Programowanie w SQL

Transkrypt

Programowanie w SQL
Programowanie w SQL
UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}]
1. Deklaracja zmiennej lokalnej:
DECLARE @guid uniqueidentifier – – deklaracja zmiennej typu uniqueidentifier
SET @guid = NEWID() – – przypisanie losowej wartości
SELECT @guid
– – wyświetlenie w jednokolumnowej i jednowierszowej tabeli przypisanej wartości
GO– – koniec paczki (z ang. batch), a zarazem koniec zakresu zmiennej
SELECT @guid – – jaka jest teraz wartość zmiennej?
Przykładowym zastosowaniem może być tworzenie dynamicznych zapytań SQL:
DECLARE @kolumny varchar (100), @tabele varchar (100), @warunki varchar (100)
SET @kolumny = ’imie’ + ’,’ + ’nazwisko’ + ’,’ + ’nr indeksu’
SET @tabele = ’studenci’
SET @warunki = ’imie LIKE ”A%”’
EXEC(’SELECT’ + ’ ’ + @kolumny + ’ ’ + ’FROM’ + ’ ’ + @tabele + ’ ’
+ ’WHERE’ + ’ ’ + @warunki)
– – nie można zapomnieć o spacjach (dlatego są wyróżnione)
2. Deklaracja zmiennej globalnej – w Transact-SQL nie można definiować zmiennych globalnych użytkownika (co nie znaczy, że nie ma w ogóle zmiennych globalnych), ale można ten problem obejść
definiując tabelę przechowującą potrzebne wartości.
3. Instrukcja wypisania PRINT :
DECLARE @guid uniqueidentifier – – deklaracja zmiennej typu uniqueidentifier
SET @guid = NEWID() – – przypisanie losowej wartości
PRINT @guid – – wypisanie przypisanej wartości
4. Instrukcja CASE (oblicza listę warunków i zwraca jeden z możliwych wyników):
a) wersja podstawowa sprawdza równość na przykład w poniższym przypadku: plec = ’K’ i plec
= ’M’:
SELECT imie, nazwisko, plec studenta =
CASE plec
WHEN ’K’ THEN ’kobieta’
WHEN ’M’ THEN ’mezczyzna’
ELSE ’nieokreslona’
END
FROM studenci
b) wersja rozszerzona – dowolne warunki:
SELECT imie, nazwisko, wynik =
CASE
WHEN punkty > 160 THEN ’przyjety’
WHEN punkty < 80 THEN ’nie przyjety’
ELSE ’rezerwowy’
END
FROM rekrutacja
5. Instrukcja warunkowa IF . . . ELSE (bez THEN !!!):
DECLARE @liczba int
SET @liczba = CAST (RAND() * 10 AS int )
IF @liczba % 2 = 0 – – czy @liczba przystaje do 0 modulo 2
PRINT CAST (@liczba AS varchar ) + ’ jest parzysta’
ELSE
PRINT CAST (@liczba AS varchar ) + ’ jest nieparzysta’
6. Ciąg instrukcji (dłuższy niż jedna instrukcja), które mają być wykonane jako grupa muszą być
ograniczone BEGIN . . . END
DECLARE @imie varchar (30), @nazwisko varchar (30), @nr indeksu varchar (30)
– – równoczesne przypisane wartości trzem zmiennym
SELECT @imie = imie, @nazwisko = nazwisko, @nr indeksu = nr indeksu
FROM studenci
WHERE nr indeksu = 100010
IF @imie IS NOT NULL AND @nazwisko IS NOT NULL
BEGIN
PRINT ’imie: ’ + @imie
PRINT ’nazwisko: ’ + @nazwisko
PRINT ’numer indeksu: ’ + @nr indeksu
END
7. Pętla WHILE :
DECLARE @nr indeksu int
SET @nr indeksu = 1 – – lepiej zaczynać od większego numeru indeksu
WHILE EXISTS (SELECT * FROM studenci WHERE nr indeksu > @nr indeksu)
BEGIN
IF NOT EXISTS (SELECT * FROM studenci WHERE nr indeksu = @nr indeksu)
PRINT ’numer indeksu ’ + CAST (@nr indeksu AS varchar ) + ’ jest zajety’
ELSE
PRINT ’numer indeksu ’ + CAST (@nr indeksu AS varchar ) + ’ jest wolny’
SET @nr indeksu = @nr indeksu + 1
END
W pętli WHILE można również wykorzystać instrukcje skoku bezwarunkowego BREAK i CONTINUE – przykład w pomocy F1.
8. Kursor CURSOR :
a) prosty kursor na danych studentów – wyświetlimy tylko pierwszy wiersz z zapytania na jakim
działa kursor:
– – deklaracja kursora
DECLARE kursor studenci CURSOR
FOR
SELECT imie, nazwisko
FROM studenci
– – otwarcie kursora
OPEN kursor studenci
– – zmienne pomocnicze do przechowywania danych pobranych z kursora
DECLARE @imie varchar (30), @nazwisko varchar (30)
– – pobranie kolejnego wiersza z kursora
FETCH NEXT FROM kursor studenci
INTO @imie, @nazwisko
IF @@FETCH STATUS = 0
– – wyświetlenie wartości zmiennych @imie i @nazwisko
SELECT @imie, @nazwisko
– – zamknięcie kursora
CLOSE kursor studenci
– – usunięcie kursora z bazy danych
DEALLOCATE kursor studenci
Zmienna @@FETCH STATUS jest zmienną globalną (należy używać ją z rozwagą), która
zwraca stan ostatniego wykonania operacji FETCH na aktualnie otwartym kursorze w połączeniu, przy czym wartość: 0 – oznacza, że operacja zakończyła się powodzeniem, -1 – wystąpił
błąd albo nie ma więcej wierszy w kursorze, -2 – pobrany wiersz został stracony.
b) kursor aktualizujący dane w kolumnie nazwa tabeli przedmioty:
DECLARE kursor przedmioty CURSOR
FOR
SELECT nazwa
FROM przedmioty
FOR UPDATE OF nazwa
OPEN kursor przedmioty
DECLARE @nazwa varchar (30)
FETCH NEXT FROM kursor przedmioty
INTO @nazwa
IF @@FETCH STATUS = 0
UPDATE przedmioty
SET nazwa = @nazwa + ’ 1’
WHERE CURRENT OF kursor przedmioty
CLOSE kursor przedmioty
DEALLOCATE kursor przedmioty
Zadania
Zadanie 1. Zmodyfikować poniższy ciąg instrukcji, tak aby możliwe było przekazanie wartości zmiennej
pomiędzy dwoma paczkami (w wyniku wykonania zmodyfikowanych instrukcji mają się wyświetlić dwie
tabele z tą samą wartością). Co spowoduje usunięcie instrukcji GO?
DECLARE @zmienna float
SET @zmienna = RAND()
SELECT @zmienna
GO
DECLARE @zmienna float
SELECT @zmienna
WSKAZÓWKA: Punkt 2.
Zadanie 2. Zmodyfikować zapytanie z punktu 4. podpunktu b) tak, aby w zależności od płci kandydata w
kolumnie wynik znajdowały się napisy: przyjety, przyjeta, nie przyjety, nie przyjeta, rezerwowy i rezerwowa.
Zadanie 3. Zmodyfikować instrukcje z punktu 8. podpunktu a) tak, aby wyświetlone zostały wszystkie
wiersze z zapytania:
SELECT imie, nazwisko
FROM studenci
WSKAZÓWKA: Należy wykorzystać pętlę WHILE .
Zadanie 4.
a) Napisać program (ciąg instrukcji), który dla studenta o indeksie @nr indeksu, zadanym w zmiennej,
wyświetli tabele z jego: 1. danymi, 2. wynikami egzaminacyjnymi oraz średnią i 3. jeśli jest to
możliwe wynikiem z rekrutacji. UWAGA: Żadna tabela nie może być pusta.
b) Wykorzystując zdefiniowany wcześniej ciąg instrukcji napisać program wyświetlający dane wszystkich studentów – należy użyć kursora.