MINERVA superseeded IF/Prolog.
Please see
http://www.ifcomputer.co.jp/MINERVA
for details.
We discontinued to sell IF/Prolog Dec 31. 2003.
For current customers, we continue to provide
professional support for IF/Prolog until Dec 31, 2008.
?- _SqlCmd = 'SELECT ENAME,DEPNO,HIREDATE,SALARY FROM EMP
WHERE ENAME=:name OR (DEPNO = :dep AND SALARY >= :sal)',
sql declare(c3,_SqlCmd,N1,N2,RC).
N1 = 3
N2 = 4
RC = 0
このSQL SELECTコマンドは、入力として3個のバインド変数、出力として4個の選択変数を持っています。
?- sql_inout(c3,In,Out).
In = [name,dep,sal]
Out = [ename,depno,hiredate,salary]
バインド変数と選択変数の名前は、述語sql_input/3で得ることが出来ます。
?- BindSpec = [sal=29999.99,dep=20,name='SCOTT'],
sql_descr_in(c3,BindSpec).
yes
SELECTコマンドのWHERE節を指定しました。
?- sql_open(c1,RC).
RC = 0
SELECTコマンドをRDBMSで実行しました。
?- TypeSpec = [depno=integer,hiredate=date,salary=double],
sql_descr_out(c1,TypeSpec).
yes
アプリケーションのコラム検索用の「フォーマット」を指定しました。デフォルトのタイプは`atom'です。
?- sql_fetch(c1,Tuple,Warnings,RC).
Tuple = ['SMITH',30,date(87,12,7),29500.50]
Warnings = [0,0,0,0]
RC = 1
データの最初のレコードを取り出しました。
?- sql_fetch_n(c1,N,TupleList,IndTupleList,RC).
N = 5
TupleList = 'SCOTT',20,'',61098.0 , ...
IndTupleList = 0,0,-1,0 , ...
RC = 5
sql_fetch_n/5はN個までのデータタプルを取り出します。もしN(第2引数)を具体化せずにsql_fetch_n/5を呼びだしたときは、見つかったデータタプルをすべて取り出し、N(とRC)にその数をセットします。
Nが具体化されているとき、これによって取り出されるデータタプル数の最大値を指定します。RC(>=0, <= N)は、実際に見つかったデータタプルの数を与えます。
'SCOTT'のレコードにはHIREDATEが与えられていないので、NULL値が返され、対応するインジケータは-1にセットされます。
SQLコマンドの再構文解析をせずに、sql_descr_in/2を使って選択基準を変更し、引続き以下のようにデータベース照会を行なうことが出来ます。
?- sql_descr_in(c1, [ ... ] ),
sql_open(c1,0),
sql_descr_out(c1, [ ... ] ),
Max = 4,
repeat,
sql_fetch_n(c1,Max,Tuples,_,RC),
perform_data(RC,Tuples),
RC < Max,
!,
...
?- sql_close(c1,0).
アプリケーションが一度に一つのデータ要素だけを検索するようにしたいときは、次のようにするとよいでしょう。
?- sql_descr_in(c1, [ ... ] ),
sql_open(c1,0),
sql_descr_out(c1, [ ... ] ),
repeat,
sql_fetch_buf(c1,RC),
( RC = 1,
...
sql_get_value(c1,ename,atom,Name,Ind1),
sql_get_value(c1,salary,double,Salary,Ind2) ,
...
fail
;
RC = 0,
!
).
?- sql_close(c1,0).
|