którego zakresem ma być wynik przetworzenia zapytania zdefiniowanego w wierszu 8), a które służy do wy boru wartości sieci wszystkich dyrektorów. Ten kursor zostaje uruchomiony w wierszu 9). W wierszu 10) kończy się faza inicjowania przez wyzerowanie elementów tablicy liczniki.
1) void zakresyWartości() {
2) int i, cyfry, liczniki[15];
3) EXEC SQL REGIN DECLARE SEC7I0N;
4) int cena;
5) char SQLSTA7E[6);
6) EXEC SQL END DECLARE SECTION;
7) EXEC SQL DECLARE dyrKursor CURSOR FOR 8> SELECT cgnaSieci EROM FilmDyr;
9) EXEC 3QL CPEN dyrKursor;
10) for (i =0; i < 15; i++) liczniki[i] = 0;
11) whileU) {
12) EXEC SQL FETCH EROM dyrKursor TNTO :cena;
13) if (BRAK_NOWYCH_KROTEK) break;
14) cyfry = 1;
15) while {(cena /= 10) > 0) cyfry++;
16) if( cyfry <= 14) liczniki{cyfry]++;
)
17) EXEC £QL CLOSE dyrKursor;
18) for(i = 0; i < 15; i++)
19) printf(„cyfry = %d: liczba dyrektoróv; = %a\n",
i, liczniki[ i j );
}
RYSUNEK 7.4
Grupowanie wartości sieci dyrektorów według rzędów wielkości
Główne zadania są wykonywane za pomocą pętli zapisanej w wierszach od 11) do 16). W wierszu 12) krotka bieżąca jest przechwytywana do zmiennej dzielonej cena. Ponieważ krotki powstające w wyniku przetworzenia zapytania z wiersza 8) mają tylko po jednej składowej, więc jest potrzebna tytko jedna zmienna dzielona w myśl zasady, że trzeba stosować tyle zmiennych dzielonych, z ilu składowych jest złożona przechwycona krotka. W wierszu 13) zachodzi sprawdzenie, czy przechwycenie krotki powiodło się. Korzystamy w tymi celu z makra o nazwie BRAK_NOWYCH_KROTEK, które zapewne jest zdefiniowane w następujący sposób:
#def ine BRAK_NOWYCH_KROTEK ! (strcrap (SQLS?ATE,
„02000"))
Przypomnijmy tu. że kod „02000" zmiennej SQLSTATE oznacza, że nie w szukano żadnej krotki. A zatem w wierszu 13) następuje sprawdzenie, czyj wszystkie krotki zostały' zanalizowane i czy' w związku z tym nie ma już ża nej następnej krotki do przetworzenia. Jeśli tak jest, to pętla zostaje przerwa i sterowanie zostaje przekazane do wiersza 17).
Jeśli natomiast pewna krotka zostanie sprowadzona do programu po stawowego, to w wierszu 14) liczba cyfr wartości ceny sieci zostaje zainicj wana na 1. W wierszu 15) zapisano instrukcje iteracyjnego dzielenia wartoś sieci przez 10 i dodawania 1 do zmiennej cyfry. W chwili gdy cena sie osiągnie wartość 0, po kolejnym podzieleniu przez 10, w zmiennej cyfi znajduje się liczba określająca liczbę cyfr wartości zmiennej cena. Zakła< się, że długość liczb całkowitych nie przekracza 14 cyfr. Gdyby jednak zd rzyło się, że cena sieci ma więcej niż 14 cyfr, to i wartość odpowiedniej elementu tablicy liczniki nic zostanie zwiększona, co zapewnia stosowi warunek, a więc nadspodziewanie wysokie wartości sieci nie są uwzględniał w statystyce.
W wierszu 17) zostało zapisane zakończenie fragmentu obliczeniowej funkcji. Kursor zostaje zamknięty, a instrukcje, zapisane w wierszach 1 i 19), służą do wydrukowania wartości z tablicy liczniki.
Po przypisaniu kursora do pewnego zakresu krotek w tabeli podstawo w (tzn. do relacji zapamiętanej w bazie danych, a nie do perspektywy lub wyn ku zapytania) można nie tylko odczy tywać i przetwarzać wartości zapamięt; ne w tej relacji, ale można także zmieniać lub usuwać krotki. Składnia ii strukcji UPDATE oraz DELETE jest praw ie taka, jaką poznaliśmy w podro; dziale 5.6, inaczej zapisuje się tylko klauzulę a’HE RE. Jest ona w tym prz; padku złożona ze słowa kluczowego w.HERE CURREN? CF, po którym poda się nazwę kursora. Oczywiście można z poziomu języka podstawowego zd< cydować, czy analizowana krotka ma być zmieniona lub usunięta, lub też nie
PRZYKŁAD 7.5
Na rysunku 7.5 umieszczono zapis definicji funkcji zbliżonej do tej, któi przedstawiono na rys. 7.4. W obu został zadeklarowany kursor dyrKurso: który' służy do odczytu krotek z relacji Fi ImDyr. Na rysunku 7.5 służy' o jednak do rozstrzygnięcia, czy' analizowana krotka ma zostać usunięta z rei; cji, czy też należy w niej podwoić cenę sieci.