Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:prolog:prolog_lab:prolog_lab_rdbms [2009/05/11 18:08]
wojnicki
pl:prolog:prolog_lab:prolog_lab_rdbms [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== LAB: Integracja z RDBMS ====== ====== LAB: Integracja z RDBMS ======
 +
  
 Celem laboratorium jest pokazanie możlwości integracji maszyny wnioskującej SWI Prolog z systemami zarządzania relacyjnymi bazami danych (RDBMS). Celem laboratorium jest pokazanie możlwości integracji maszyny wnioskującej SWI Prolog z systemami zarządzania relacyjnymi bazami danych (RDBMS).
  
-===== Konfiguracja ODBC =====+Interackja taka jest możliwa z wykorzystaniem [[wp>​ODBC]]. 
 + 
 +===== Konfiguracja ODBC ===== 
 + 
 +Aby móc skorzystać z tzw. źródła danych ODBC, należy w domowym katalogu utworzyć plik o nazwie ''​.odbc.ini''​ oraz umieścić w nim poniższą treść:
  
 <​code>​ <​code>​
Linia 15: Linia 20:
 Username ​               = Username ​               =
 Password ​               = Password ​               =
-Port = 5432+Port         ​= 5432
 Protocol = 6.4 Protocol = 6.4
 ReadOnly = No ReadOnly = No
 RowVersioning = No RowVersioning = No
-ShowSystemTables = No+ShowSystemTables = No
 ShowOidColumn = No ShowOidColumn = No
 FakeOidIndex = No FakeOidIndex = No
 ConnSettings = ​ ConnSettings = ​
 +</​code>​
  
 +**Uwaga**: ​
 +  - Wartości pól ''​Username''​ oraz ''​Password''​ będą podane przez prowadzącego na zajęciach.
 +  - Prawa dostępu do pliku ''​.odbc.ini''​ powinny być ustawione na 600.
 +
 +Powyższe działania konfigurują źródło danych ODBC o nazwie ''​prolog''​ (''​[prolog]''​).
 +Źródło to jest skojarzone z systemem zarządzania relacyjnymi bazami danych PostgreSQL działającym na serwerze ''​borg.ia.agh.edu.pl'',​ a konkretnie z bazą danych o nazwie ''​prolog''​ (''​Database''​).
 +
 +**Ćwiczenie**
 +
 +Sprawdź, czy źródło danych jest poprawnie skonfigurowane. W tym celu uruchom narzędzie ''​isql''​ umożlwiające wykonywanie zapytań w języku SQL na źródle ODBC:
 +
 +<​code>​
 +isql prolog
 </​code>​ </​code>​
  
-Wartości pól ''​Username''​ oraz ''​Password''​ będą podane przez prowadzącego.+Jeżeli połączenie powiodło się zostanie wyświetlony stosowny komunikat:​ 
 +<​code>​ 
 +~$ isql prolog 
 ++---------------------------------------+ 
 +| Connected! ​                           | 
 +|                                       | 
 +| sql-statement ​                        | 
 +| help [tablename] ​                     | 
 +| quit                                  | 
 +|                                       | 
 ++---------------------------------------+ 
 +SQL> 
 +</​code>​
  
-===== ODBC w SWI-Prolog =====+Następnie wykonaj proste zapytanie np. ''​SELECT nazwa FROM kompozycje;''​. Rezultat powinien być zbliżony do tego poniżej:
  
-http://​www.swi-prolog.org/​pldoc/​package/odbc.html+<​code>​ 
 +SQL> SELECT nazwa FROM kompozycje;​ 
 ++-----------------------------------------+ 
 +| nazwa                                   | 
 ++-----------------------------------------+ 
 +| Bukiet 1                                | 
 +| Bukiet 2                                | 
 +| Bukiet 3                                | 
 +| Kosz 1                                  | 
 +| Kosz rozyczek ​                          | 
 +| Kosz mix                                | 
 +| Kompozycja suszona ​                     | 
 +| Koszyk gozdzikowy ​                      | 
 +| Hiacynty w koszyku ​                     | 
 +| Biala azalia ​                           | 
 +| Rozowa azalia ​                          | 
 +| Orchidea rozowa ​                        | 
 +| Kosz z azalia ​                          | 
 +| Wiazanka czerwona ​                      | 
 +| Bukiecik serc                           | 
 +| Ikebana z rozami ​                       | 
 +| Kwitnacy kosz                           | 
 +| Sloneczniki z lilia                     | 
 +| Strelicje ​                              | 
 +| Anturium latem                          | 
 ++-----------------------------------------+ 
 +SQLRowCount returns 20 
 +20 rows fetched 
 +SQL> 
 +</code>
  
-===== Połączenia ​===== +===== - ODBC w SWI-Prolog ​=====
-odbc_connect/​3 +
-odbc_disconnect/​1+
  
 +SWI Prolog umożliwia wykonywanie zapytań na źródłach ODBC.
 +Rezultaty zapytania (pojedynczy wiersz) uzgodniane są ze wskazanymi szukanymi.
 +Wartości kolejnych kolejnych wierszy dostępne są poprzez mechanizm nawrotów.
 +
 +Przed wykonaniem zapytania należy nawiązać połączenie ze skonfigurowanym źródłem ODBC.
 +
 +[[http://​www.swi-prolog.org/​pldoc/​package/​odbc.html|Dokumentacja]] dotycząca predykatów obsługujących połączenia ODBC z bazami danych.
 +
 +===== - Połączenia =====
 +
 +Do nawiązaywania połączenia ze źródłem danych ODBC służy predykat ''​odbc_connect/​3''​.
 +Pierwszym argumentem jest nazwa źródła danych ODBC (w poniższym przykładzie ''​prolog''​),​ drugim jest identyfikator połączenia,​ trzecim opcje połączenia,​ np.
  
 <code prolog> <code prolog>
-        ​odbc_connect('​prolog', ​_+odbc_connect('​prolog', ​Polaczenie
-                     ​user(jan),​ +             ​[open(once) 
-                       ​password(xxx),​ +           ​]).
-                       ​alias(wordnet),​ +
-                       open(once) +
-                     ​]).+
 </​code>​ </​code>​
  
 +Przed zakończeniem korzystania z połączenia ze źródłem danych należy wywołać predykat
 +''​odbc_disconnect/​1'',​ którego argumentem musi być identyfikator połączenia (zakładając,​ że szukana ''​Polaczenie''​ jest uzgodniona z wartością będącą identyfikatorem połączenia utworzonym za pomocą ''​odbc_connect/​3''​):​
 +
 +<code prolog>
 +odbc_disconnect(Polaczenie).
 +</​code>​
 +
 +Zamiast identyfikatora połączenia można użyć synonimu połączenia,​ korzystając z opcji ''​alias'':​
 +
 +<code prolog>
 +?- odbc_connect('​prolog',​ _,
 +             [ alias(prolog),​
 +               ​open(once)
 +           ]).
 +</​code>​
 +
 +Tak otwarte połączenie można zakończyć:​
 +
 +<code prolog>
 +?- odbc_disconnect(prolog).
 +</​code>​
 +===== - Schemat Bazy Danych =====
 +
 +Schemat bazy danych, dostępnej jako źródło danych ''​prolog''​ przedstawiony jest poniżej.
 +
 +<code sql>
 +CREATE TABLE klienci (
 +    idklienta varchar(10) NOT NULL,
 +    haslo varchar(10) NOT NULL,
 +    nazwa varchar(40) NOT NULL,
 +    miasto varchar(40) NOT NULL,
 +    kod char(6) NOT NULL,
 +    adres varchar(40) NOT NULL,
 +    email varchar(40),​
 +    telefon varchar(16) NOT NULL,
 +    fax varchar(16),​
 +    nip char(13),
 +    regon char(9)
 +);
 +
 +CREATE TABLE kompozycje (
 +    idkompozycji char(5) NOT NULL,
 +    nazwa varchar(40) NOT NULL,
 +    opis varchar(100),​
 +    cena numeric(7,​2),​
 +    minimum integer,
 +    stan integer
 +);
 +
 +
 +CREATE TABLE odbiorcy (
 +    idodbiorcy integer NOT NULL,
 +    nazwa varchar(40) NOT NULL,
 +    miasto varchar(40) NOT NULL,
 +    kod char(6) NOT NULL,
 +    adres varchar(60) NOT NULL
 +);
 +
 +
 +CREATE TABLE zamowienia (
 +    idzamowienia integer NOT NULL,
 +    idklienta varchar(10) NOT NULL,
 +    idodbiorcy integer NOT NULL,
 +    idkompozycji char(5) NOT NULL,
 +    termin date NOT NULL,
 +    cena numeric(7,​2),​
 +    zaplacone boolean,
 +    uwagi varchar(200)
 +);
 +
 +
 +CREATE TABLE historia (
 +    idzamowienia integer NOT NULL,
 +    idklienta varchar(10),​
 +    idkompozycji char(5),
 +    wartosc numeric(7,​2),​
 +    termin date
 +);
 +
 +</​code>​
 +
 +Kompletny {{:​pl:​prolog:​prolog_lab:​baza.sql.txt|skrypt}} z schematem i danymi.
 +
 +===== - Wykonywanie zapytań =====
 +
 +Zapytania można realizować korzystając z predykatu ''​odbc_query/​4''​ (albo ''​odbc_query/​3'',​ patrz [[http://​www.swi-prolog.org/​pldoc/​doc_for?​object=section(3%2c '​2.2'​%2c swi('​%2fdoc%2fpackages%2fodbc.html'​))|dokumentacja]]).
 +Pierwszym argumentem jest identyfikator połączenia,​ drugim zapytanie w języku SQL, trzecim rezultat zapytania w postaci termu ''​row/​n''​ (argumenty predykatu ''​row/​n''​ będą uzgodnione z wartościami w kolejnych kolumnach zwaracanych przez zapytanie), czwartym lista dodatkowych opcji.
 +
 +Przykładowe zapytanie zwracające jako wartości szukanych ''​Nazwa'',​ ''​Email''​ wartości kolumn ''​nazwa''​ i ''​email''​ tabeli ''​klienci''​ będzi wyglądało następująco:​
 +
 +<code prolog>
 +?- odbc_query(prolog,​ '​SELECT nazwa, email FROM klienci'​ ,row(Nazwa, Email), []).
 +</​code>​
 +
 +Ostatni argument ''​odbc_query/​4''​ umożliwia przekazanie dodatkowych opcji, m.in. konwersje typów pomiędzy SQL a Prologiem (patrz [[http://​www.swi-prolog.org/​pldoc/​doc_for?​object=section(3%2c '​2.2'​%2c swi('​%2fdoc%2fpackages%2fodbc.html'​))|dokumentacja]]).
 +
 +**Ćwiczenie**
 +
 +  - Otwórz połączenie do bazy danych korzystając ze źródła danych ''​prolog''​.
 +  - Wykonaj następujące zapytanie SQL: ''​SELECT SUM(cena), miasto FROM zamowienia JOIN odbiorcy USING (idodbiorcy) GROUP BY miasto;'',​ przeglądnij wyniki.
 +  - Zamknij połączenie.
 +
 +===== - Proste zapytania =====
 +
 +**Ćwiczenie**
 +
 +Zaimplementuj:​
 +  - predykat ''​op/​0''​ otwierający połączenie ze źródłem danych ''​prolog'',​
 +  - predykat ''​cl/​0''​ zamykający w/w połączenie,​
 +  - predykat ''​kompozycje/​2''​ udostępniający informacje o kompozycji tj. identyfikator oraz cenę. **Uwaga**: może być konieczne zastosowanie konwersji typów, użyteczny predykat: ''​atom_number/​2''​ (patrz [[http://​www.swi-prolog.org/​pldoc/​doc_for?​object=section(2%2c '​4.21'​%2c swi('​%2fdoc%2fManual%2fmanipatom.html'​))|dokumentacja]]).
 +
 +Przetestuj działanie w/w predykatów.
 +
 +===== - Złożone przetwarzanie =====
 +
 +Częstą rozterką kupojącego jest: mam określoną sumę pieniędzy, ale co moge za to kupić np.:
 +  * Jakie i ile kompozycji można kupić za 200 zł?
 +Takie zapytanie jest trudne lub wręcz niemożliwe do zaimplementowania za pomocą SQL.
 +
 +**Ćwiczenie**
 +
 +Zaimplementuj predykat ''​jakieza/​2'',​ tak aby zapytanie:
 <code prolog> <code prolog>
-        odbc_connect('​prolog'​Polaczenie,​ +?- jakieza(200,X).
-                     ​[open(once) +
-                     ]).+
 </​code>​ </​code>​
 +uzgadniało X z listą nazw identyfikatorów kompozycji kwiatowych, które można kupić mając do dyspozyji 200 zł. **Uwaga**: predykat winien być niedeternistyczny,​ umożliwiać znalezienie alternatywnych rozwiązań.
  
  
 +===== - Samodzielny program =====
  
 +Wykorzystaj kod z poprzedniego ćwiczenia.
  
-===== Proste Zapytania =====+**Ćwiczenie**
  
-===== C.d=====+Zmodyfikuj kod programu z poprzedniego ćwiczenia, tak aby stanowił samodzielną aplikację. 
 +Program po skonsultowaniu,​ powinien zapytać o kwotę i wyświetlić wszystkie możlwie kombinacje kompozycji kwiatowych, które można za podaną kwotę kupić, podając: identyfikator kompozycji, nazwę oraz cenę.
  
-Ile można kupić czekoladek za 100 zł.+====== Uwagi, komentarze, propozycje ======
  
 +Laboratorium jest za krótkie. Zostaje ok. 30 minut wolnego czasu.
  
 + --- //​[[szymek@adres.pl|Szymon Świerkosz]]//​
pl/prolog/prolog_lab/prolog_lab_rdbms.1242058108.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0