Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Teoretyczne założenia

Podobne prezentacje


Prezentacja na temat: "Teoretyczne założenia"— Zapis prezentacji:

1 Teoretyczne założenia
Osadzony SQL Teoretyczne założenia

2 Wiele Języków Programowania umożliwia operacje na zewnętrznych bazach danych za pomocą instrukcji języka SQL. Język SQL używany w kodzie programu określany jest jako osadzony SQL w odróżnieniu od jego interakcyjnej (dotąd omawianej ) wersji. Podstawowa zasada osadzonego SQL tzw. zasada podwójnego trybu mówi, że każda instrukcja SQL, którą można wykonać w trybie interakcyjnym, może być także zastosowana w aplikacji (za pomocą osadzonego SQL). (Odwrotne stwierdzenie nie jest prawdziwe).

3 Zasady Używania Osadzonego SQL
Instrukcje osadzonego SQL są poprzedzane zwrotem EXEC SQL i zakończone są specjalnym symbolem zakończenia (zależnym od implementacji np. ;) Wykonywalna instrukcja SQL może wystąpić wszędzie tam, gdzie może występować wykonywalna instrukcja języka zewnętrznego. (Osadzony SQL zawiera również instrukcje deklaratywne) Instrukcje SQL mogą obejmować referencje do zmiennych języka zewnętrznego. Referencje takie musi poprzedzać dwukropek. Zmienne języka zewnętrznego mogą pojawić się tam gdzie w SQL są dostępne literały. Zmienne takie nazywane są dzielonymi.

4 Zasady Używania Osadzonego SQL Cd. 1
klauzula INTO wskazuje zmienne celu, na które mają być zapisane wyszukiwane wartości np: EXEC SQL SELECT Czesci.WAGA INTO :WAGA FROM Czesci WHERE Czesci.P# = :P WAGA i P są nazwami zadeklarowanymi wcześniej w języku zewnętrznym (Nazwy tych zmiennych mogą pokrywać się z nazwami pól (atrybutów), tak jak ma to miejsce ze zmienną WAGA i polem w relacji Części Części.WAGA). Wynik poszukiwania zostanie umieszczony w zmiennej WAGA.

5 Zasady Używania Osadzonego SQL Cd. 2
Wszystkie zmienne języka zewnętrznego, które będą występowały w poleceniach SQL muszą być zdefiniowane w sekcji deklaracji osadzonego SQL, ograniczonej instrukcjami BEGIN DECLARE SECTION oraz  END DEKLARE SECTION. Przykład: (Dla zewnętrznego języka PL/I ). EXEC SQL BEGIN DECLARE SECTION; DCL SQLSTATE CHAR(5); DCL P CHAR(6); DCL WAGA FIXED DECIMAL(3); EXEC SQL END DECLARE SECTION.

6 Testowanie poprawności wykonania polecenia
Każdy program z osadzonym SQL musi zawierać zmienną języka zewnętrznego zwaną SQLSTATE (wcześniejsze wersje używały SQLCODE). Po wykonaniu dowolnej instrukcji SQL do programu jest zwracany kod statusu zapisany na tej zmiennej. W szczególności kod statusu oznacza, że instrukcja została wykonana poprawnie, a kod oznacza, że instrukcja została zrealizowana, ale nie znaleziono danych wymaganych w żądaniu. Zmienne języka zewnętrznego muszą mieć typy dopasowane do swego przeznaczenia w Bazie Danych.

7 Instrukcja WHENEVER Zastąpienie testowania zmiennej SQLSTATE Składnia:
EXEC SQL WHENEVER warunek działanie terminator warunek jest to albo SQLERROR albo NOT FOUND, działanie to instrukcja albo CONTINUE albo GO TO. WHENEVER jest dyrektywą dla procesora języka SQL. Zdanie “WHENEVER warunek GO TO etykieta” sprawia, że procesor wstawi instrukcję “IF warunek GO TO etykieta” po każdej wykonywanej instrukcji SQL, na jaką napotka. Zdanie “WHENEVER warunek CONITNUE” powoduje, że żadna instrukcja nie będzie wstawiana.

8 Instrukcja WHENEVER Cd.
Dwa warunki dla tej instrukcji zdefiniowane są następująco: NOT FOUND nie znaleziono danych (SQLSTATE = 02000) SQLERROR wystąpił błąd. Każda instrukcja WHENEVER napotkana przez procesor w sekwencyjnym przeszukiwaniu tekstu programu (dla danego warunku) zastępuje poprzednio znalezioną instrukcję (dla tego warunku).

9 Kursory Wynik operacji na tabelach (relacjach) = tabela (relacja).
Języki zewnętrzne przystosowane są na ogół do obsługi co najwyżej pojedynczych rekordów (krotek) Stąd potrzeba mechanizmu umożliwiającego przekazywanie danych w przypadku gdy wynikiem zapytania jest grupa rekordów (krotek). Mechanizm ten nazywa się kursorem. Kursor jest rodzajem wskaźnika, który można wykorzystać do poruszania się po wierszach (krotkach) wskazując po kolei każdy wiersz wyniku. W ten sposób mamy możliwość adresowania tych wierszy – po jednym za każdy razem.

10 Kursor – ograniczenia i deklaracja
Kursorów nie używamy gdy mamy do czynienia z: – jednostkowym SELECT tzn. zwracającym tylko jedną krotkę – dla operacji INSERT – - || UPDATE – - || DELETE Deklaracja Kursora: EXEC SQL DECLARE nazwa_kursora CURSOR FOR wyrażenie_tabelowe [ORDER BY przecinkowa_lista_elementów_do_wyboru ]; wyrażenie_tabelowe specyfikuje tabelę na którą będzie wskazywał zadeklarowany kursor.

11 Instrukcje wykonywane na kursorach
EXEC SQL OPEN nazwa_kursora; Otwiera lub aktywuje określony kursor (który w tym momencie nie może być otwarty). Wykonywane jest wówczas wyrażenie_tabelowe kursor wskazuje na pozycję tuż przed pierwszym wierszem uzyskanej tabeli. EXEC SQL FETCH nazwa_kursora INTO przecinkowa-lista- zmiennych-języka-zewnętrznego Przesuwa wskazany kursor (który musi być otwarty) do następnego wiersza w zbiorze aktywnym. Następnie nadaje zmiennym języka zewnętrznego, wymienionym w klauzuli INTO, wartości z tego wiersza. Jeżeli nie ma następnego wiersza w chwili wykonywania instrukcji FETCH, SQLSTATE przypiera wartość i żadne dane nie będą wyszukiwane.

12 Kursor – zamykanie EXEC SQL CLOSE kursor
Zamyka, bądź dezaktywuje wskazany kursor (w tym czasie musi być on otwarty). Może być otwarty ponownie. Operacje otwierania i zamykania kursora pozwalają na uzyskiwanie (dzięki np. zmianie wartości zmiennych języka zewnętrznego) zmianę wierszy uzyskiwanych za każdym otwarciem kursora.

13 Kursor - Przykład EXEC SQL DECLARE X CURSOR FOR /* definicja kursora */ SELECT Dostawcy.S#, Dostawcy.SNazwisko, Dostawcy.STATUS FROM Dostawcy WHERE Dostawcy.MIASTO = :Y; EXEC SQL OPEN X; /* Wykonanie zapytania dla wszystkich dostępnych wierszy tzn. dopóki SQLSTATUS jest różny od * / /* W tym miejscu jakiś rodzaj pętli */ EXEC SQL FETCH X INTO :S, :SNAME, :SSTATUS; /*następny dostawca */ /* Koniec pętli */ EXEC SQL CLOSE X /* zamknij kursor X */

14 Szkic: MySQL, API C i Builder

15 Builder 6.0 Personal - wstępne czynności:
1. Użycie programu coff2omf (z katalogu /bin C++ Buildera) do zmiany pliku biblioteki libMySQL.lib (format coff2omf wejscie wyjscie). Biblioteka libMySQL.lib znajduje się w katologu MySQL-a w podkatalogu lib/opt/ 2. Dołączenie przetworzonego pliku biblioteki (u mnie po przetworzeniu libMySQL2.lib) do projektu, najlepiej w widoku Project Manager (ADD); 3. Zmiana katalogów plików dołączanych (w menu Project/Options/ Directories/Conditionals w polu Include path) aby można było dołączyć mysql.h, albo wypisanie ścieżki dostępu do tegoż pliku w dyrektywie #include np. #include "c:\\mysql\\include\\mysql.h"

16 Builder 6.0 wersja Personal Cz. 2.
4. Zmiana w pliku mysql_com.h (ze względu na komunikaty systemowe, plik ten otworzy się sam po próbie kompilacji kodu) dodane wiersze: (definiowany napis może być dowolny) #ifdef solecki typedef int my_socket; #endif co wymagało dołączenia dyrektywy #define solecki na początku kodu tzn. PRZED dyrektywą #include <mysql.h> 5. Umieszczenie pliku biblioteki dll tj. libMySQL.dll w katalogu programu.

17 Główne procedury 1. Inicjacja głównej struktury
MYSQL mysql; // Główna struktura if(!mysql_init(&mysql)) //raportuj błąd gdy się nie udało otworzyć. 2. Otwarcie komunikacji z serwerem if (!mysql_real_connect(&mysql, NazwaSerwera, Uzytkownik,Haslo,0,0,NULL,0)) { /* raport "Nie udało się połączyć” mysql_error(&mysql); */ }

18 Główne Procedury 2 MYSQL_RES *rezultat; MYSQL_ROW wiersz;
mysql_query(&mysql,"show databases;"); rezultat = mysql_store_result(&mysql); if(rezultat) { int stop = mysql_num_rows(rezultat); for(int i=0;i<stop;i++) //... wiersz = mysql_fetch_row(rezultat); mysql_free_result(rezultat); } rezultat jest dwuwymiarową tablicą napisów przechowującą rezultat zapytania. wiersz jest tablicą napisów przygotowaną do przechowywania pojedynczej krotki.

19 Inne istotne zmienne i funkcje
MYSQL_FIELD *argumenty; //Informacje o kolumnach int liczba_pol = mysql_num_fields(rezultat); // liczba argumentów wyniku (kolumn) argumenty = mysql_fetch_fields(rezultat); for(i = 0; i < liczba_pol; i++) { Wyniki->Cells[i+1][0]=argumenty[i].name; }


Pobierz ppt "Teoretyczne założenia"

Podobne prezentacje


Reklamy Google