ADP
Programming Language ADP

Japanese

Sourceforge.net

SourceForge.JP

Loading

DBライブラリ

ADPにはODBC-APIを使用したDBライブラリが組み込まれています。
下記のようなコードにより、自然にSQLが発行できる他、select,insert,update,delete,saveと言ったよりシンプルな述語も用意されています。

以下のコードでは、カレントディレクトリにあるtest_db.mdbというMS AccessデータベースのMYTABLEテーブルのデータをCSV形式に変換し表示します。
+db("Driver={Microsoft Access Driver (*.mdb)}; DBQ=test_db.mdb"),!;
,db.sql@("SELECT * FROM MYTABLE ", {}).csv.prtn,next;

DBライブラリ・リファレンス
■ODBC接続文字列
DBライブラリに共通する事項ですが、各述語の第一引数にはODBCの接続文字列を指定します。

,sql("Driver={Microsoft Access Driver (*.mdb)}; DBQ=test_db.mdb", ・・・・・

通常ODBCの接続文字列は長くなる傾向がある為、その定義をホーン節にし、メソッド形式(.)を使い述語を連結させると便利です。以下の例は上記の例をホーン節とメソッド形式を使って記述し直しています。
+db("Driver={Microsoft Access Driver (*.mdb)}; DBQ=test_db.mdb"),!;
,db.sql(・・・・・

ODBC接続文字列は、2種類の記述方法が存在します。

接続の管理とコミット
 DBライブラリのDBに対する接続は、ODBC接続文字列単位で行われます。つまりODBC接続文字列が同じ述語の呼び出しは同一の接続で行われます。ODBC接続文字列が異なる場合は別の接続となります。
また、DBライブラリはトランザクションモードをマニュアルコミットで初期化しています。
つまりデータに対して追加・更新・削除等を行った場合、commit述語を呼び出さない場合、プログラム終了時にロールバックされます。commit述語を呼び出した段階でトランザクションがコミットされます。手動でrollbackを呼び出すことも出来ます。

64ビットWindowsにおける 32ビットODBCドライバ(MS Access)
 一部のWindowsでは、MS AccessのODBCドライバは32ビット版しかない為、32ビット版のADPコマンドを使用します。64ビット版のADPコマンドではMS Accessドライバを使えません。
また、64ビットWindowsで32ビットODBCデータソースアドミニストレーターを呼び出すには以下のパスのコマンドを実行します(Windowsがデフォルトのパスでインストールされている場合)。
C:\WINDOWS\syswow64\odbcad32.exe


DBライブラリ・リファレンス

_binary(バイナリフラグのセット)


形式
 _binary($str,[$result])
 _binary($array,$key)
引数
  • $str: バイナリーとマークする文字列
  • $result: 結果(省略可)
  • $array: バイナリとマークする文字列を格納する配列
  • $key: バイナリーとマークする文字列を格納する配列へのキー
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ADPではバイナリーデータ型は存在せずに文字列型を使用します。
DBライブラリを用いて画像データ等のバイナリーデータを格納(Insert/Update等)する場合、文字列として格納すると不用意な変換が発生し、正しくデータが格納されません。
_binary述語は、バイナリフラグをセットし、DBライブラリでデータを受け渡すときに、正しくバイナリと指定しDBへデータを渡します。

_db_quote (SQL生成時のクオート文字の指定)


形式
 _db_quote($db, $quote_s, $quote_e)
引数
  • $db: 接続文字列
  • $quote_s: クオート開始文字
  • $quote_e: クオート終了文字(省略可)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 DBライブラリで、SQLを自動生成する述語(select / insert / update / delete / save )が付与するテーブルクオート文字を$dbで指定された接続文字列の接続に対して設定します。デフォルトは `(バッククオート)になります(_db_default_quote述語でデフォルトクオートが変更できます)。
デフォルト状態で、select述語等が生成するSQLでテーブル部分が ` でクオートされます。
select * from `tablename`
SQL Server 2008ではバッククオートがテーブルクオート文字として使用できませんので、本述語を用いて、クオート文字を変更します。

,_db_quote( $db, '[',']');

例では、テーブル名が[](かぎ括弧)で囲まれます。
select * from [tablename]

クオート文字をデフォルト状態に戻すときは以下のようにします。
,_db_quote( $db, '`');

引数2つで_db_quoteを呼び出しますと、クオートの開始文字と終了文字が同じ文字で設定されます。

 ※Ver0.75から追加になります。

_db_default_quote (SQL生成時のクオート文字のデフォルト値の設定)


形式
 _db_default_quote( $quote_s, $quote_e)
引数
  • $quote_s: クオート開始文字
  • $quote_e: クオート終了文字(省略可)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 DBライブラリで、SQLを自動生成する述語(select / insert / update / delete / save )が付与するクオート文字を設定します。デフォルトは `(バッククオート)になりま。
デフォルト状態で、select述語等が生成するSQLでテーブル部分が ` でクオートされます。
select * from `tablename`
SQL Server 2008ではバッククオートがテーブルクオート文字として使用できませんので、本述語を用いて、クオート文字を変更します。
特定の接続のみクオート文字列を変更する場合は、_db_quote述語を使用します。

,_db_default_quote( $db, '[',']');

例では、テーブル名が[](かぎ括弧)で囲まれます。
select * from [tablename]

クオート文字をデフォルト状態に戻すときは以下のようにします。
,_db_default_quote( $db, '`');

引数2つで_db_default_quoteを呼び出しますと、クオートの開始文字と終了文字が同じ文字で設定されます。

 ※Ver0.75から追加になります。

_table_quote (テーブルクオート文字の設定) - deleted


形式
 _table_quote( $quote_s, $quote_e)
引数
  • $quote_s: テーブルクオート開始文字
  • $quote_e: テーブルクオート終了文字(省略可)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明

※Ver 0.75から削除されました。_db_quote述語または_db_default_quote述語を使用してください。

 DBライブラリで、SQLを自動生成する述語(select / insert / update / delete / save )が付与するテーブルクオート文字を設定します。デフォルトは `(バッククオート)になります。
デフォルト状態で、select述語等が生成するSQLでテーブル部分が ` でクオートされます。
select * from `tablename`
SQL Server 2008ではバッククオートがテーブルクオート文字として使用できませんので、本述語を用いて、クオート文字を変更します。

,_table_quote('[',']');

例では、テーブル名が[](かぎ括弧)で囲まれます。
select * from [tablename]

クオート文字をデフォルト状態に戻すときは以下のようにします。
,_table_quote('`');

引数一つで_table_quoteを呼び出しますと、クオートの開始文字と終了文字が同じ文字で設定されます。

commit (DBのコミットを行う)

形式
 commit($constr)
引数
  • $constr:ODBC接続文字列
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された接続文字列のDB接続のコミットを行います。
現在のバージョンでは、DBへの接続は、接続文字列毎に管理されます。
接続文字列が同じ場合は同一の接続になり、異なる場合は違う接続となります。
デフォルトでは、DBに対する操作はオートコミットOFFになっています。
DBに対する変更を行った場合、commitを呼び出さないと結果が反映されません。

columns (カラム定義の取得)

形式
 columns($constr, $tablename,@result)
引数
  • $constr: ODBC接続文字列
  • $tablename:定義情報を取得するテーブル名
  • @result:定義情報
完了時の動作
  • カラムが存在する時:次の述語を実行に移ります。
  • カラムが存在しない時:バックトラックします。
バックトラック時の動作
  • 次のカラムが存在する時:次の述語を実行に移ります。
  • 次のカラムが存在しない時:バックトラックします。
  • ※テーブルに定義されているカラムの数(-1)だけバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
ODBC APIのSQLColumnsを呼び出してテーブルに含まれるカラム情報を取得します。

※返される値についてはODBCドライバにより代わる場合があります。
※SQLiteでは動作しません。

コード例(lib/columns.p - Windows32ビットモードでのみ有効)
+con("Driver={Microsoft Access Driver (*.mdb)}; DBQ=sample.mdb");
,con.columns("sample_table",@x),prtn(@x:COLUMN_NAME,":",@x:TYPE_NAME),next;

実行例
D:\sample\lib>adp columns.p
ID:COUNTER
col1:VARCHAR
col2:INTEGER
col3:DATETIME

delete (テーブルレコードの削除)

形式
 delete($constr, $wherefilter, $tablename)
引数
  • $constr: ODBC接続文字列
  • $wherefilter: 条件カラム・値マップ
  • $tablename: テーブル名
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された条件($wherefilter)で、指定されたテーブル($tablename)のレコードを削除します。
$wherefilterは、以下のように、連想配列でキー部分にカラム名、値部分にそのカラムの値を指定します。
キー値のペアは複数指定できます。複数指定するとANDで結ばれます。
{ 'colname1' => value1, 'colname2' => value2 ... }
以下のようなSQLに変換されます。

 DELETE FROM tablename WHERE colname1 = value1 AND colname2 = value2 ... 

上記以外の条件式(数値で代償比較演算子を使用したい。OR条件を付与したい等)を指定したい場合は、SQL述語を使用します。

他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

DBライブラリのサンプル

insert (テーブルレコードの追加)

形式
 insert($constr, $insertmap, $tablename)
引数
  • $constr:ODBC接続文字列
  • $insertmap:追加カラム・値マップ
  • $tablename:テーブル名
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された値($insertmap)で、指定されたテーブル($tablename)にレコードを追加します。
$insertmapは、以下のように、連想配列でキー部分にカラム名、値部分にそのカラムの値を指定します。
{ 'colname1' => value1, 'colname2' => value2 ... }
以下のようなSQLに変換されます。

 INSERT INTO tablename(colname1, colname2,...) = VALUES(value1,value2,...)

他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

DBライブラリのサンプル

rollback (DBのロールバックを行う)

形式
 rollback($constr)
引数
  • $constr:ODBC接続文字列
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された接続文字列のDB接続のロールバックを行います。
現在のバージョンでは、DBへの接続は、接続文字列毎に管理されます。
接続文字列が同じ場合は同一の接続になり、異なる場合は違う接続となります。
デフォルトでは、DBに対する操作はオートコミットOFFになっています。
DBに対する変更を行った場合、commitを呼び出さないと結果が反映されません。
rollbackを呼び出すと結果をロールバックします。

save (テーブルレコードのUPSERT)

形式
 save($constr, $savemap, $tablename, $filterlist)
引数
  • $constr:ODBC接続文字列
  • $savemap:保存・絞込みカラム・値マップ
  • $tablename:テーブル名
  • $filterlist:フィルターカラムリスト
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された値($savemap)で、指定されたテーブル($tablename)にレコードデータを保存します。UPSERTと呼ばれている操作を行うことで、一部のDBサーバーが対応しているMERGE文の代用とします。

$savemapは、以下のように、連想配列でキー部分にカラム名、値部分にそのカラムの値を指定します。
{ 'colname1' => value1, 'colname2' => value2, 'wcol1' => value1, 'wcol2' => value2 ... }
$filterlistは、$savemapのうちwhere句に入れるキー・値ペアのキーを指定します。
{ 'wcol1', 'wcol2', ... }

saveは最初に以下のようなSQLを発行し、フィルターで指定されたレコードが存在するか確認します。

 SELECT count(*) FROM tablename WHERE wcol1 = value1 AND wcol2 = value2 ...

該当するレコードが存在する場合はupdate述語が実行され、存在しない場合はinsert述語が実行されます。

※現在のバージョン(Ver0.7)はトランザクション(テーブルロック等)を、考慮していません。上記のレコードの確認から、insertまでに他のプログラムからinsertされる可能性があります。
安全に運用するには別途テーブルロックをかけるかアプリケーションレベルで同時実行が行われない等、排他制御の必要があります。

他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

DBライブラリのサンプル

select (テーブルレコードの取得)

形式
 select($constr, $wherefilter, $tablename, $selectlist, @result)
引数
  • $constr: ODBC接続文字列
  • $wherefilter: 条件カラム・値マップ
  • $tablename: テーブル名
  • $selectlist:セレクトカラムリスト(省略可)
  • @result: レコードの内容
完了時の動作
  • レコードが存在する時:次の述語を実行に移ります。
  • レコードが存在しない時:バックトラックします。
バックトラック時の動作
  • 次のレコードが存在する時:次の述語を実行に移ります。
  • 次のレコードが存在しない時:バックトラックします。
  • ※レコードの数(-1)だけバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された条件($wherefilter)で、指定されたテーブル($tablename)のレコードを取得します。
$wherefilterは、以下のように、連想配列でキー部分にカラム名、値部分にそのカラムの値を指定します。
キー値のペアは複数指定できます。複数指定するとANDで結ばれます。
{ 'colname1' => value1, 'colname2' => value2 ... }
以下のようなSQLに変換されます。

 SELECT * FROM tablename WHERE colname1 = value1 AND colname2 = value2 ... 

SELECT リストを指定する場合は、$selectlistを指定します。
{ 'scol1', 'scol2', ... }
上記のように指定しますと、以下のようにSQLが作成されます。

 SELECT scol1, scol2 FROM tablename WHERE colname1 = value1 AND colname2 = value2 ... 

上記以外の条件式(数値で代償比較演算子を使用したい。OR条件を付与したい等)を指定したい場合は、SQL述語を使用します。

レコードの内容は、$resultにSELECTリスト名をキーとして連想配列として格納されます。

他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

DBライブラリのサンプル

selecta (テーブルレコードの全件取得)

形式
 select($constr, $wherefilter, $tablename, $selectlist, @result)
引数
  • $constr: ODBC接続文字列
  • $wherefilter: 条件カラム・値マップ
  • $tablename: テーブル名
  • $selectlist:セレクトカラムリスト(省略可)
  • @result: 全レコードの内容
完了時の動作
  • レコードが存在する時:次の述語を実行に移ります。
  • レコードが存在しない時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された条件($wherefilter)で、指定されたテーブル($tablename)のレコードを取得します。
$wherefilterは、以下のように、連想配列でキー部分にカラム名、値部分にそのカラムの値を指定します。
キー値のペアは複数指定できます。複数指定するとANDで結ばれます。
{ 'colname1' => value1, 'colname2' => value2 ... }
以下のようなSQLに変換されます。

 SELECT * FROM tablename WHERE colname1 = value1 AND colname2 = value2 ... 

SELECT リストを指定する場合は、$selectlistを指定します。
{ 'scol1', 'scol2', ... }
上記のように指定しますと、以下のようにSQLが作成されます。

 SELECT scol1, scol2 FROM tablename WHERE colname1 = value1 AND colname2 = value2 ... 

上記以外の条件式(数値で代償比較演算子を使用したい。OR条件を付与したい等)を指定したい場合は、SQL述語を使用します。

レコードの内容は、SELECTリスト名をキーとして連想配列として格納されたものになり、全てレコードが配列として$resultに格納されます。

select述語は、1レコードずつ処理するときに使用します。selectaは全レコードを取得する必要があるときに使用します。selectaで結果を取得するとselect述語で全ての結果を変数に配列として構成するよりもよりメモリを効率よく使用できます。


他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

※Ver0.79で追加になりました。

DBライブラリのサンプル

sql (SQLの実行)

形式
 sql($constr, $sql, $paramlist, @result)
引数
  • $constr: ODBC接続文字列
  • $sql: SQL文
  • $paramlist: パラメーターリスト
  • @result: レコードの内容(省略可)
完了時の動作
  • レコードが存在する時:次の述語を実行に移ります。
  • レコードが存在しない時:バックトラックします。
バックトラック時の動作
  • 次のレコードが存在する時:次の述語を実行に移ります。
  • 次のレコードが存在しない時:バックトラックします。
  • ※レコードの数(-1)だけバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 $sqlで指定されたSQL文を実行します。ODBCのパラメータ(SQL文中の?)を$paramlistで配列またはリストで指定します。

レコードの内容は、$resultにSELECTリスト名をキーとして連想配列として格納されます。

※insert / update / delete 等結果を取得しないSQLの実行の場合は、$resultを省略できます。

他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

DBライブラリのサンプル

sqla (SQLの実行および結果の全件取得)

形式
 sql($constr, $sql, $paramlist, @result)
引数
  • $constr: ODBC接続文字列
  • $sql: SQL文
  • $paramlist: パラメーターリスト
  • @result: 全レコードの内容
完了時の動作
  • レコードが存在する時:次の述語を実行に移ります。
  • レコードが存在しない時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 $sqlで指定されたSQL文を実行します。ODBCのパラメータ(SQL文中の?)を$paramlistで配列またはリストで指定します。

レコードの内容は、SELECTリスト名をキーとして連想配列として格納されたものの配列として、$resultに全レコードの内容が入ります。
sql述語は、1レコードずつ処理するまたは結果が不要なときに使用します。sqlaは全レコードを取得する必要があるときに使用します。sqlaで結果を取得するとsqlで全ての結果を変数に配列として構成するよりもよりメモリを効率よく使用できます。


他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

※Ver0.79で追加になりました。

DBライブラリのサンプル

tables (テーブル定義の取得)

形式
 tables($constr, @result)
引数
  • $constr: ODBC接続文字列
  • @result: 定義情報
完了時の動作
  • テーブルが存在する時:次の述語を実行に移ります。
  • テーブルが存在しない時:バックトラックします。
バックトラック時の動作
  • 次のテーブルが存在する時:次の述語を実行に移ります。
  • 次のテーブルが存在しない時:バックトラックします。
  • ※定義されているテーブルの数(-1)だけバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
ODBC APIのSQLTablesを呼び出してDBに含まれるテーブル情報を取得します。

※返される値についてはODBCドライバにより代わる場合があります。
※SQLiteでは動作しません。


update (テーブルレコードの更新)

形式
 update($constr, $updatemap, $tablename, $filterlist)
引数
  • $constr:ODBC接続文字列
  • $updatemap:変更・絞込みカラム・値マップ
  • $tablename:テーブル名
  • $filterlist:フィルターカラムリスト(省略可)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 ODBC接続文字列については、DBライブラリを参照下さい。
 指定された値($updatemap)で、指定されたテーブル($tablename)にレコードデータを変更します。
$updatemapは、以下のように、連想配列でキー部分にカラム名、値部分にそのカラムの値を指定します。
{ 'colname1' => value1, 'colname2' => value2, 'wcol1' => value1, 'wcol2' => value2 ... }
$filterlistは、$updatemapのうちwhere句に入れるキー・値ペアのキーを指定します。
{ 'wcol1', 'wcol2', ... }

以下のようなSQLに変換されます。

 UPDATE tablename SET colname1 = value1, colname2 = value2,... 
   WHERE wcol1 = value1 AND wcol2 = value2 ...

上記以外の条件式(数値で代償比較演算子を使用したい。OR条件を付与したい等)を指定したい場合は、SQL述語を使用します。

$filterlistは省略できます。省略した場合は、{ 'ID' } が指定されたとみなされます。また$filterlistを {} と指定しますと、省略と異なり、$updatemapの全ての要素がフィルター(WHERE句に置く)とみなされます。{} はupdateでは通常使用しません。

他のDBライブラリの述語やクエリー変数を返す述語等、連想配列を返す述語の結果を用いて、本述語を呼び出すことが考えられます。
その場合、ある連想配列から特定のキーを持った連想配列を新しく作成したい場合があります。この場合、lsmap述語を使用します。
そのほか、キーの値を変更しながら新しい連想配列を作成したい場合は、remap述語を使用します。
searchの戻り値等、通常の配列から連想配列を作成する場合は、mkmap述語を使用します。

DBライブラリのサンプル

DBライブラリのサンプル

コード例(dbsample.p 32ビットWindowsで動作)
+db("Driver={Microsoft Access Driver (*.mdb)}; DBQ=sample.mdb");

# set table quote 
,platform('Unix'),prtn('This program cannot run under Unix.'), exit(1);

#insert / select / sql
,prtn('insert / select')
  ,$rec1 == {"ID"=>1, "col1" => "AAA", "col2" => 10, "col3" => "2010/05/27 17:40:30"}
  ,$rec2 == {"ID"=>2, "col1" => "BBB", "col2" => 20, "col3" => "2010/05/27 17:40:30"}
  ,db.insert( $rec1, "sample_table")
  ,db.insert( $rec2, "sample_table")
  ,db.select@({},'sample_table').prtn,next
  ,db.select@({ 'ID' => 3}, 'sample_table').prtn,next;
  ,db.sql@('select col1, col2 from sample_table where col2 >= ?', { 20 }).prtn.next
  ;
#update / save / select
,prtn('update / save')
  ,$ur1 == {"ID"=>1,  "col1" => "aaa", "col2" => 12, "col3" => "2011/05/27 17:40:30"}
  ,$ur2 == {"ID"=>2,  "col1" => "bbb", "col2" => 22, "col3" => "2011/06/27 17:40:30"}
  ,$ur3 == {"ID"=>4,  "col1" => "ddd", "col2" => 42, "col3" => "2011/07/27 17:40:30"}
  ,db.update( $ur1, "sample_table")
  ,db.save( $ur2, "sample_table")
  ,db.save( $ur3, "sample_table")
  ,db.select@({},'sample_table').prtn,next
  ;

#delete / select
,prtn('delete 2')
  ,db.delete({ "ID" => 2 },'sample_table')
  ,db.select@({},'sample_table').prtn,next
  ;

,prtn('delete all')
  ,db.delete({},'sample_table')
  ,db.select@({},'sample_table').prtn,next
  ;

実行例
D:\sample\lib>adp dbsample.p
insert / select
{ID => 1, col1 => AAA, col2 => 10, col3 => 2010-05-27 17:40:30, col4 => }
{ID => 2, col1 => BBB, col2 => 20, col3 => 2010-05-27 17:40:30, col4 => }
{col1 => BBB, col2 => 20}
update / save
{ID => 1, col1 => aaa, col2 => 12, col3 => 2011-05-27 17:40:30, col4 => }
{ID => 2, col1 => bbb, col2 => 22, col3 => 2011-06-27 17:40:30, col4 => }
{ID => 4, col1 => ddd, col2 => 42, col3 => 2011-07-27 17:40:30, col4 => }
delete 2
{ID => 1, col1 => aaa, col2 => 12, col3 => 2011-05-27 17:40:30, col4 => }
{ID => 4, col1 => ddd, col2 => 42, col3 => 2011-07-27 17:40:30, col4 => }
delete all

Powered by ADP.