422 7. SYSTEMOWE ASPEKTY JĘZYKA SQL
PRZYKŁAD 7.3
Przedstawimy tu funkcję C. która służy do określenia wartości sieci prezesa na podstawie podanej nazwy studia. Szkic tej funkcji został przedstawiony na rys. 7.3. Zaczyna się ona od sekcji deklaracji, w której w wierszach od 1) do 5) zapisano definicję potrzebnych zmiennych. Polem następują pominięte na rysunku instrukcje C, które powodują wczytanie wartości nazwy studia z wejścia standardowego. W wierszach od 6) do 9) występuje instrukcja wyboru pojedynczego wiersza. Jest ona bardzo podobna do instrukcji, którą już znamy. Pierwsza różnica polega na tym. że zamiast stałej w warunku występującym w wierszu 9) użyto zmiennej nazwaStudia, a druga na tym, że w wierszu 7) pojawia się klauzula IN70, dzięki której wiadomo, co należy zrobić z wynikiem przetwarzania. W tym przypadku oczekujemy, że w wyniku powstanie dokładnie jedna krotka, która ma tylko jedną składową, odpowiadającą atrybutowri cenaSieci. Wartość tej jednej składowej jednej krotki zostaje zapamiętana w całkowitej zmiennej dzielonej cenaSieciPrezesa.
□
Elcgantszy sposób przekazywania wartości między językiem SQL a językiem podstawowym polega na zastosowaniu kursora, który pobiera wartości z kolejnych krotek relacji. Relacja może być albo pamiętaną tabelą, albo wynikiem zapytania. Do utworzenia i wykonania kursora trzeba użyć następujących elementów:
1. Deklaracja kursora. Najprostsza postać deklaracji kursora składa się z następujących elementów-;
a) Wstępny exec sql, tak jak w każdym przy padku osadzania kodu SQL.
b) Słowo kluczowe DECLARE.
c) Nazwa kursora.
d) Słowo kluczowe CURSOR FOR.
e) Wyrażenie, którego wynikiem jest relacja, a zatem np. nazwa tabeli lub wyrażenie typu selcct-from-whcre. Zakres kursora stanowią krotki tej relacji, co oznacza, że kursor wskazuje po kolei krotki relacji wówczas, gdy zostaje uruchomiony instrukcją FETCH.
Postać deklaracji kursora można przedstawić w następujący sposób:
EXEC SQL DECLARE <kursor> CURSOR FOR <zapytanie>
2. Instrukcja EXEC SQL OPEN, po której umieszcza się nazwę kursora. Powoduje ona przygotowanie kursora do odczytu pierwszej krotki z właściwego mu zakresu.
3. Jedno (lub więcej) użycie instrukcji FETCH. Celem instrukcji FETCH jest przesunięcie kursora do kolejnej krotki jego zakresu. Po osiągnięciu końca zakresu żadna krotka nic jest zwracana, natomiast zmiennej SQLS?ATE zostaje przypisana wartość ' 02000', co oznacza: „nic odnaleziono żadnej krotki”. Do instrukcji FETCH wchodzą następujące elementy:
a) Słowo kluczowe £XEC SQL FETCH FROM.
b) Nazwa kursora.
c) Słowo kluczowe tntc.
d) Lista zmiennych dzielonych, oddzielanych przecinkami. Jcśl w’wyniku działania instrukcji FETCH zostanie wybrana jakaś krot ka, to wymienionym na liście kolejnym zmiennym dzielonym zo stają przypisane wartości kolejnych składowych tej krotki.
Postać deklaracji instrukcji FETCH można przedstawić w następując; sposób:
EXEC SQŁ FETCH FROM <kursor> CURSOR 1NTO <lista zmiennych dzieionych>
4. Instrukcja F,XEC SQL CLOSE, po której umieszcza się nazwę kursora Powoduje ona zamknięcie kursora, który- przestaje być związan z dotychczasowym zakresem. Oczywiście można go potem jeszcz raz zainicjować inną instrukcją O PEN i wów-czas można ponowni mieć dostęp do kolejnych krotek relacji.
PRZYKŁAD 7.4
Przypuśćmy, żc trzeba określić ilu dyrektorów produkcji posiada sieć o wai tości mieszczącej się w kolejnych zakresach liczbowych, przy czym zakres wynikają z liczby cyfr wartości sieci. W tym celu powstanie zapytanie, któr do zmiennej cena zapisuje wartość atrybutu cenaSieci, pochodzącą z kre tek relacji FilmDyr. Wynikowa relacja o jednym atrybucie stanowi zakre dla kursora dyrKursor. Po pobraniu krotki oblicza się liczbę cyfr zmienni całkowitej cena oraz zwiększa się odpowiedni element tabeli liczniki.
Funkcja zakresyCen została zapisana w języku C i przedstawiona n rys. 7.4. W wierszu 1) jest jej nagłów-ek, w wierszu 2) zapisano deklaracj tych zmiennych, które są dostępne tylko z poziomu języka C, a nie są dostęj nc z poziomu SQL. W tablicy liczniki przechowuje się zliczane wartośi wynikowe liczby dyrektorów, których sieci mają wrartość mieszczącą s wdanym zakresie. Zmienna cyfry służy- do przechowania wyliczonej t bieżąco liczby cyfr wartości sieci, a zmienna _ określa wartość indeksu bież; ccgo elementu tablicy liczniki.
W wierszach od 3) do 6) zawarto sekcję DECLARE, w której zostały zdi finiowane zmienne dzielone cena oraz zmienna standardowa sęLSTAl Z kolei w wierszach 7) i 8) umieszczono deklarację kursora dyrKurso