在 prolog 和 db2 之间加载数据

load data between prolog and db2

我只是在学习prolog。我前面有一个任务。我必须使用 Prolog ODBC 接口将一些数据插入到像 Db2 express c v9.7.1 这样的数据库中。我知道文档 swi-prolog home

中有一些示例谓词(SWI-PROLOG)

open_wordnet :-
odbc_connect('WordNet', _,
[用户(一月),
密码(xxx),
别名(wordnet),
打开(一次)
])。
我不知道如何准确地使用这些谓词并展示一个工作示例。谁能告诉我,一旦在 eclipse sdk-win 32 中建立了 prolog 和 db2 之间的连接,我该如何准确地使用这些将数据插入数据库,例如 Db2 express C v9.7.1。请写信给我,地址是邮件 intriguer@alice。它。

任何帮助或信息将不胜感激。

谢谢。


几年前我做过类似的事情;该数据库是关于学术关系/信息的,我使用了 prolog 和 ODBC(加上 xpce 用于 gui)。

首先我打开了一个到数据库的连接:

1
2
3
fconn(C):-
    odbc_connect('academia_info', C, [user(academia_info_user),
                  password(secret), alias(academia_info), open(once)]).

open(once) 用于避免重新连接到数据库,C 是处理程序

然后我使用这个谓词提交查询:

1
2
3
4
%run_statement(+SQL,-Row)
rs( SQL, Row):-
   fconn(Connection),
   odbc_query(Connection, SQL, Row).

如果我想要所有解决方案,我会这样做

1
2
3
4
%returns all solutions (findall)
%rsall(+SQL,-Rows)
rsall(SQL, Rows):-
    findall(Row,rs(SQL,Row), Rows).

例如:

1
rsall('SELECT * FROM institution', D).

这个谓词准备一个 SQL 查询:

1
2
3
4
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

例如:

1
2
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]

这里我删除了一些东西

1
2
3
delete(ID,Table):-
    swritef(S,'DELETE FROM %t WHERE id = ?', [Table]),
    prep(S, [integer], _ , [ID]).

准备一个插入新值的语句(稍后执行):

1
prep('INSERT INTO professor (id, title) VALUES (?,?)', [integer, varchar], _, [ID,T]).

btw odbc_query 返回具有以下格式的值 row(D1,D2,D3,....,Dn)
所以也许你必须把它转换成一个列表。

我希望上面的例子可能会有所帮助..虽然我有点忘记了细节:/
无论如何,整个项目都可以在这里找到,但是代码不是那么可读