41$ 7. SYSTEMOWE ASPEKTY JĘZYKA SQI.
Przesyłanie danych między bazą danych, dostępną tylko z poziomu języka SQL, a programami podstawowymi odbywa się za pośrednictwem zmiennych z języka podstawowego, których wartości są odczytywane lub określane przez instrukcje systemu SQL. Imienne takie określa się jako dzielone. W instrukcjach SQL są one wyróżniane przez poprzedzenie nazwy dwukropkiem, w języku podstawowym ich nazwa nie jest natomiast odróżniana od innych nazw zmiennych.
Kod SQL, który' ma być osadzony w programie zapisanym w jeżyku podstawowym, poprzedza się słowem kluczowym EXEC SOL. Instrukcje, które następują po tym słowne, są zamieniane przez preprocesor na stosowne wywołania w języku podstawowym funkcji dostępnych w bibliotece SQL.
W standardzie SQL2 występuje specjalna zmienna SÓLSTATE, która służy' do łączenia programów' zapisanych w języku podstawowym z systemem przetwarzania SQL*. Zmienna SQlSTATE jest tablicą złożoną z pięciu znaków'. Za każdym razem, gdy wywołuje się jakąś funkcję biblioteczną SQL, do zmiennej SOLSTATF. zapisuje się kod oznaczający, czy i ewentualnie jakie problemy napotkano przy wykonywaniu instrukcji $QL. Na przykład kod ‘00000* (pięć zer) oznacza, że instrukcja SQL została przetworzona bez błędów, a z kolei kod ‘20000’ oznacza, że w wyniku przetwarzania zapytania SQL nic odnaleziono wskazanej w' nim krotki. W języku podstawowym można odczytywać wartość zmiennej SOLSTATF. i dzięki temu można uzależnić od jej wartości dalsze przetwarzanie.
Deklaracje zmiennych dzielonych wyróżnia się w programie podstawowym przez poprzedzenie jej i zakończenie następującymi instrukcjami SQL:
EXEC SQL BEGIN DECLARE SECTICN;
EXEC SQL 2ND DECLARE SECTION;
Fragment kodu między tymi dwiema instrukcjami nazywa się sekcją deklaracji. Postać deklaracji w tej sekcji jest zgodna z konwencją deklaracji w języku podstawowym. Ponadto nie ma sensu deklarować zmiennych innych typów niż typy wspólne dla języka podstawowego i SQL, czyli innych niż na przykład real, integer lub character.
' Może się zdarzyć, zc systemy, które nie są zgodne zc standardem SQL2, nie zawierają zmiennej SOLATATE, ale należy oczekiwać, iz występuje w nich jakaś inna zmienna odgrywająca taką samą rolę.
PRZYKŁAD 7.1
W funkcji zapisanej w języku C, która służy do modyfikowania relacji Studio, może na przykład wystąpić następująca instrukcja:
EXEC SQL BEGIN DECLARE SECTION;
char nazwaStudia[15], adresStudia[50J; char SQLSTA7E[6];
EXEC SQL END DECLARE SECTION;
Instrukcje pierwsza oraz ostatnia są wymaganymi nawiasami sekcji deklaracji Wewnątrz sekcji występuje deklaracja dwóch zmiennych: nazwaStudic i adresStudia. Obie są zmiennymi znakowymi i, jak przekonamy się później służą do przechowywania nazwy oraz adresu studia, które połączone razcu tworzą krotkę wstawianą do relacji Studio. W trzeciej instrukcji została zdefi niowana zmienna SQLSTATE jako tablica o długości sześciu znaków *.
□
W instrukcjach SQL zmienne dzielone występują w kontekstach prze znaczonych dla konkretnych wartości. Przypomnijmy tu, źe nazwy tyci zmiennych w instrukcjach SQL są poprzedzane dwukropkiem. Poniżej przed stawiamy przykład zastosowania zmiennych dzielonych zdefiniowanycł w' przykładzie 7.1 w instrukcji wstawiania nowej krotki do relacji Studio.
PRZYKŁAD 7.2
Na rysunku 7.2 został przedstawiony szkielet funkcji podaj Studio, któn służ>- do pobrania od użytkownika wartości atrybutów określających nazw* i adres studia filmowego oraz wstawienia nowej krotki do relacji Studio W wierszach od 1) do 4) umieszczono deklaracje analizowane w przykła dzie 7.1. Kod w języku C, który służy do interakcyjnego pobrania wartości d( tablic nazwaStudia i adresStudia, został pominięty.
W wierszach 5) i 6) zawarto osadzony w programie C kod instrukcji SQI służącej do wstawienia nowej krotki. Ta instrukcja insert została poprze dzona słowom kluczowym EXEC SQL, po to by było wiadomo, że jest on; osadzonym kodem języka SQL, a nic jest niepoprawnym kodem w języku C Dzięki temu ten fragment zostanie dostrzeżony przez preprocesor, który po kazano na rys. 7.1, i przetw orzony na właściwą sekwencję instrukcji.
Pięcioznakowa wartość zmiennej SQ1-STATE musi być przechowywana jako napi o długości sześciu znaków, ponieważ w programie przykładowym korzystamy z funkcji sircm przy porównywaniu napisów. Funkcja strernp natomiast korzysta zc standardowej konwencj kończenia napisu znakiem ‘\0\ a więc i wartość zmiennej SQLSTATK musi być w laki sposól zakończona. Wartość tego szóstego znaku trzeba początkowo ustawić jako ‘\0\ ale to przypisa nie nic wystąpi jawnie w naszym przykładzie.