To jest stara wersja strony!
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).
Interackja taka jest możliwa z wykorzystaniem ODBC.
1 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ść:
[prolog]
Description = PostgreSQL Unicode
Driver = PostgreSQL Unicode
Trace = No
TraceFile =
Database = prolog
Servername = borg.ia.agh.edu.pl
Username =
Password =
Port = 5432
Protocol = 6.4
ReadOnly = No
RowVersioning = No
ShowSystemTables = No
ShowOidColumn = No
FakeOidIndex = No
ConnSettings =
Wartości pól Username
oraz Password
będą podane przez prowadzącego na zajęciach.
Powyższe działąnia konfigurują połączenie z źródłem danych ODBC o nazwie prolog
.
Źródło to łączy się z systemem zarządzania relacyjnymi bazami danych PostgreSQL działającym na serwerze borg.ia.agh.edu.pl
, a konkretnie z bazą danych prolog
.
ODBC w SWI-Prolog
Dokumentacja dotycząca predykatów obsługujących połączenia ODBC z bazami danych.
Połączenia
Do nawiązaywania połączenia z źródłem danych ODBC służy predykat odbc_connect/3
.
Pierwszym argumentem jest nazwa źródła danych (w poniższym przykładzie prolog
), drugim jest identyfikator połączenia, trzecim opcje, np.
?- odbc_connect('prolog', Polaczenie,
[open(once)
]).
Przed zakończeniem korzystania z połączenia z źródłem danych należy wywołać predykat
odbc_disconnect/1
, którego argumentem musi być identyfikator połączenia:
?- odbc_disconnect(Polaczenie).
Zamiast identyfikatora połączenia można użyć synaonimu połączenia, korzystając z opcji alias
:
?- odbc_connect('prolog', _,
[ alias(prolog),
open(once)
]).
Tak otwarte połączenie można zakończyć:
?- odbc_disconnect(prolog).
Schemat Bazy Danych
Schemat bazy danych, dostępnej jako źródło danych prolog
przedstawiony jest poniżej.
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
);
Wykonywanie zapytań
Zapytania można realizować korzystając z predykatu odbc_query/4
(albo odbc_query/3
, patrz dokumentacja).
Pierwszym argumentem jest identyfikator połączenia, drugim zapytanie w języku SQL, trzecim rezultat zapytania w postaci termu row/n
(argumenty 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:
?- odbc_query(prolog, 'SELECT nazwa, email FROM klienci' ,row(Nazwa, Email), []).
Ostatni argument odbc_query/4
umożliwia przekazanie dodatkowych opcji, m.in. konwersje typów pomiędzy SQL a Prologiem (patrz dokumentacja).
Proste zapytania
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
dokumentacja).
Przetestuj działanie w/w predykatów.
Złożone przetwarzanie
Jakie kompozycje można kupić za 200 zł?