I. SrSUŁMUWB ASI-MU Y iIjiCYKA ?>0L
szego programu zapisanego w konwencjonalnym języku programowania, na przykład w C. W bieżącym rozdziale opiszemy, w jaki sposób można łączyć kod SQL ze zwykłymi programami.
Na rysunku 7.1 przedstawiono schemat typowego systemu programowania, który zawiera elementy SQL. Programista przygotowuje program w standardowej formie, ale z wstawionymi instrukcjami $QL, które nie należą do języka podstawowego. Gotowy program jest analizowany przez preprocesor, który powoduje zamianę kodu SQL na kod zapisany w języku podstawowym. Interpretacja SQL w najprostszym przypadku sprowadza się do wywołania funkcji, której argumentem jest tekst instrukcji SQI. i która uruchamia tę instrukcję. Na schemacie pokazano, że zamiast osadzać kod SQL w programie programista może w swoim programie bezpośrednio wywołać funkcję, która uruchamia SQL.
Język podstawowy +
Osadzony SQL
i
Preprocesor
Język podstawowy +
Wywołania funkcji
i
Biblioteka SQL
Kompilator języka
podstawowego *
Program
języka
podstawowego
RYSUNEK 7.1
Przetwarzanie programów z osadzonymi instrukcjami SQL
Po fazie preprocesowania program jest kompilowany w zwykły sposób. Dostawcy systemów baz danych na ogół dołączają do systemu biblioteki z definicjami niezbędnych funkcji. Potem funkcje, które implementują $QL, można wywoływać w programach zapisanych w innych językach; stanowią z nimi spójną całość.
Podstawowy problem przy łączeniu instrukcji SQL z konwencjonalnym językiem programowania można porównać z brakiem dopasowania falowego w fizyce, a wynika on z dużych różnic między modelami danych języka SQL i innych języków programowania. Jak wiemy SQL ma zaimplementowany relacyjny model danych. Natomiast C i inne języki konwencjonalne operują modelem typów strukturalnych z podstawowymi typami danych: całkowitym, rzeczywistym, znakowym itp. oraz strukturami typu macierz. Ani w'języku C, ani w innych językach imperatywnych zbiory nie mają bezpośredniej reprezentacji, natomiast w języku $QL nie można w bezpośredni sposób korzystać ze wskaźników, macierzy ani innych typów strukturalnych, które powszechnie stosuje się w językach konwencjonalnych. W wyniku tego nie istnieje bezpośrednie przełożenie między' strukturami SQL i innych języków, a więc trzeba tworzyć dodatkowe mechanizmy umożliwiające przepływ danych między fragmentami programu zapisanymi w jeżyku SQL i w języku podstawowym.
Języki, z którymi standardowo łączy się SQL2
Standard SQL2 narzuca wymaganie, aby jego implementacje umożliwiały połączenie z następującymi językami programowania: ADA, C, Cobol, Fortran, M (poprzednio nazywany Mumps), Pascal oraz PL/1. Każdy student informatyki powinien znać te języki, być może z pominięciem M czy Mumpsa, którego stosowanie było ograniczone do środowisk medycznych. W naszych przykładach bodziemy korzystać z języka C.
Na pozór mogłoby się wydawać, ze najlepiej używać jednego języka: albo wszystkie obliczenia zapisywać tylko w języku SQL, albo zaniechać jego stosowania i całość zapisać w innym języku programowania. Jednakże, gdy ma się do czynienia z działaniami na bazach danych, wówczas bardzo szybko odrzuca się pomysł zaniechania $QL. System SQL służy bowiem w ielką pomocą, jeśli działania na bazie trzeba wykonywać w sposób efektywny, a przy tym nic trzeba rezygnować z programowania wysokopoziomowego. Programista zostaje odciążony od konieczności ręcznego organizowania danych w pamięci oraz od wymyślania optymalnych algorytmów przeszukiwania bazy danych.
Jednakże $QL nie zapewnia obsługi wielu innych ważnych zadań. Na przykład w języku $QL nie da się zażądać obliczenia silni liczby n (/z! = n x x (/z—1) x...x 2 x 1), co jest jednym z najprostszych zadań programowania w języku C czy innym podobnym języku. Z poziomu SQL nie uda się także wyrazić zgrabnego formatu dla wyników, na przykład w postaci wykresu. A zatem w praktyce przy programowaniu baz danych trzeba korzystać jednocześnie zarówno z języka $QL, jak i konwencjonalnego języka, który będziemy nazywać językiem podstawowym.