несколько лет назад я сделал что-то подобное;база данных была об академических отношениях / информации, и я использовал пролог и ODBC (плюс xpce для графического интерфейса).
сначала я открыл соединение с базой данных:
fconn(C):-
odbc_connect('academia_info', C, [user(academia_info_user),
password(secret), alias(academia_info), open(once)]).
открыто (один раз)используется, чтобы избежать повторного подключения к БД, а C является обработчиком
, затем я использовал этот предикат для отправки запросов:
%run_statement(+SQL,-Row)
rs( SQL, Row):-
fconn(Connection),
odbc_query(Connection, SQL, Row).
и, если мне нужны все решения, я сделал это
%returns all solutions (findall)
%rsall(+SQL,-Rows)
rsall(SQL, Rows):-
findall(Row,rs(SQL,Row), Rows).
например:
rsall('SELECT * FROM institution', D).
этот предикат подготавливает запрос SQL:
prep(SQL, Type, Row,Values):-
fconn(Connection),
odbc_prepare(Connection, SQL, Types,Q), %uses the types of the parameters to prepare Q
odbc_execute(Q,Values,Row). %executes Q by replacing the parameters with their values
например:
prep('UPDATE professor SET title = ? WHERE id IN (SELECT professor.id FROM professor, researcher, "hadPosition" WHERE professor.id = researcher.id AND professor.id = "hadPosition".researcher_id AND hadPosition.title = ? AND professor.title=? GROUP BY professor.id HAVING sum("hadPosition".end_date - "hadPosition".start_date) > ?*365 )',
[varchar,varchar,varchar, integer],_, [MT, LT,LT, Y]).
где? Sзаменены значениями [MT, LT, LT, Y]
здесь я удаляю некоторые вещи
delete(ID,Table):-
swritef(S,'DELETE FROM %t WHERE id = ?', [Table]),
prep(S, [integer], _ , [ID]).
готовим оператор для вставки новых значений (он выполняется позже):
prep('INSERT INTO professor (id, title) VALUES (?,?)', [integer, varchar], _, [ID,T]).
Кстати, odbc_query возвращает значение со следующей строкой формата (D1, D2, D3, ...., Dn), поэтому, возможно, вам придется преобразовать его в список.
Я надеюсь, чтоприведенные выше примеры могут помочь ... хотя я и забыл подробности: / в любом случае, весь проект можно найти здесь но код яне так читабельно