このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1316769778/153
#  if select * from t where id=1 
#  then update t set foo=bar where id=1 
#   
#  これをSQLで表現したいのですが可能でしょうか? 
# 
# 

'if select * from t where id=1 then update t set foo=bar where id=1' :-
        '1要素のupdate'(t,id1,'1',foo,bar).        

'1要素のupdate'(_テーブル名,_鍵属性名,_鍵値,_置換属性名,_置換する値) :-
        組構造を得る(_テーブル名,_属性名ならび),
        鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,P),
        置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換する項),
        retract(_現在の項),
        '置換される組の変数部分だけ元の値に単一化する'(_現在の組,_置換する組),
        asserta(_置換する項).

組構造を得る(_テーブル名,_属性名ならび) :-
        findall([_属性番号,_属性名],(
                    テーブル構造(_テーブル名,_属性番号,_属性名)),
                L1),
        sort(L1,L2),
        findall(_属性名,(
                    member([_,_属性名],L2)),
                _属性名ならび).

置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換項) :-
        置換する組(_属性名ならび,_置換する組),
        置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組),
        _置換項 =.. [_テーブル名|_置換する組].

鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,_現在の項) :-
        現在の組(_属性名ならび,_現在の組),
        鍵を現在の組に設定(_属性名ならび,_鍵属性名,_鍵値,_現在の組),
        _現在の項 =.. [_テーブル名|_現在の組].

現在の組(_属性名ならび,_現在の組) :-
        length(_属性名ならび,Len),
        length(_現在の組,Len).

置換する組(_属性名ならび,_置換する組) :-
        length(_属性名ならび,Len),
        length(_置換する組,Len).

鍵を現在の組に設定(_属性名ならび,_鍵名,_鍵値,_現在の組) :-
        nth1(_鍵属性名の位置,_属性名ならび,_鍵属性名),
        nth1(_鍵属性名の位置,_現在の組,_鍵値),!.

置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組) :-
        nth1(_置換属性名の位置,_属性名ならび,_鍵属性名),
        nth1(_鍵属性名の位置,_置換する組,_鍵値),!.

'置換する組の変数部分だけ元の値に単一化する'([],[]).
'置換する組の変数部分だけ元の値に単一化する'([A|R1],[A|R2]) :-
        '置換する組の変数部分だけ元の値に単一化する'(R1,R2).
'置換する組の変数部分だけ元の値に単一化する'([A|R1],[B|R2]) :-
        \+(A = B),
        '置換する組の変数部分だけ元の値に単一化する'(R1,R2).