@section データベース連携機能

リレーショナルデータベース(RDB)とJDBCにより連携する機能です。
RDBからのデータを取得するときにRDBの型をメタデータにより参照して、対応するSchemeの型に変換します。

変換の対応表は以下の通りです。

@multitable @columnfractions .18 .5
@item RDBの型 @tab Schemeのオブジェクト
@item BOOLEAN @tab #tまたは#f
@item CHAR @tab 文字列
@item DATE @tab SRFI-19形式の日付
@item DECIMAL @tab 正確な数(有理数)
@item DOUBLE @tab 不正確な数
@item FLOAT @tab 不正確な数
@item INTEGER @tab 正確な整数
@item NUMERIC @tab 正確な数(有理数)
@item REAL @tab 不正確な数
@item SMALLINT @tab 正確な整数
@item TIMESTAMP @tab SRFI-19形式の日付
@item TINYINT @tab 正確な整数
@item VARCHAR @tab 文字列
@end multitable

パラメータは原則として準備されたSQL(Prepared  SQL)を使用します。
Prepared  SQLを使用することにより(ドライバが適切に実装されていれば)SQLインジェクション攻撃を防ぐことができます。
Schemeオブジェクトをパラメータに渡すときも型変換が適用されます。型の対応は以下の通りです。

@multitable @columnfractions .3 .7
@item Schemeのオブジェクト @tab RDBの型
@item 文字列 @tab 文字列(String)
@item 短い整数 @tab 短い整数(int)
@item 長い整数 @tab 長い整数(BigInteger)
@item SRFI-19形式の日付 @tab 日付 (java.sql.Timestampまたはjava.sql.Date)
@item 不正確な数 @tab 浮動小数点型(doubleまたはfloat)
@item #tまたは#f @tab 論理型(boolean)
@end multitable

クエリの結果は結果バッグ(result-bag)に格納されます。
結果バッグからのデータ取得は通常のリストと同様に処理できます。
「The Little Schemer」(Daniel P. Friedman, Matthias Felleisen著 ISBN 978-0-262-56099-3)の「掟(Commandment)」の書き方にならえば、

@example
第一の掟 (result bag version)

結果バッグresbについて再帰するときには、次の2つの質問を問いかけよ:(end-result-bag? resb)とelse。
@end example

@example
第四の掟 (result bag version)

再帰するとき、少なくとも1つの引数はいつも変化する。
結果バッグresbについて再帰するときには、(next-result-bag resb)を使用せよ。
@end example

となるとおもいます。


@defun jdbc-use-db dbms-name
戻り値: 未定義@*
使用するDBMSの種類を宣言します。
dbms-nameにはDBMSの種類を表すシンボルを指定します。指定可能なシンボルは以下の通りです。
@multitable @columnfractions .25 .7
@item dbms-name @tab RDBMS
@item oracle @tab Oracle
@item mysql @tab MySQL
@item postgresql @tab PostgreSQL
@item sqlite @tab SQLite
@end multitable
@end defun

@defun jdbc-connect url
戻り値: JDBCコネクション@*
JDBCを使用してRDBMSに接続します。
urlは、JDBCで接続するときに指定するURLの文字列です。
@end defun

@defun jdbc-prepare connection SQL
戻り値: JDBCステートメント@*
JDBCを使用してSQLを解析し、準備されたステートメントを取得します。
@end defun

@defun jdbc-query statement param @dots{}
戻り値: JDBC結果バッグ@*
参照系のJDBCステートメントを実行します。
パラメータはプレースホルダ("?")の順序に従ってステートメントの後に指定します。
@end defun

@defun jdbc-update! statement param @dots{}
戻り値: 更新された件数@*
更新系またはDDLのJDBCステートメントを実行します。
パラメータはプレースホルダ("?")の順序に従ってステートメントの後に指定します。
@end defun

@defun jdbc-open? closable-object
戻り値: closable-objectが開いていれば#t@*
closable-objectが開いているかを調べます。
closable-objectには、JDBCコネクション、JDBCステートメント、JDBC結果バッグが含まれます。
@end defun

@defun jdbc-close closable-object
戻り値: 未定義@*
closable-objectを閉じます。
closable-objectには、JDBCコネクション、JDBCステートメント、JDBC結果バッグが含まれます。
@end defun

@defun get-result-bag-row result-bag
戻り値: 行@*
結果バッグの現在の位置から行オブジェクトを取得します。
この手続きは通常のリスト処理におけるcar手続きに相当します。
@end defun

@defun get-result-bag-row-list result-bag
戻り値: 行を表すリスト@*
結果バッグの現在の位置から行を表すリストを取得します。
リストの順序はクエリを実行するときのSQLによって決まります。
この手続きは通常のリスト処理におけるcar手続きに相当します。
@end defun

@defun end-result-bag? result-bag
戻り値: 結果バッグが行の終端を超えたら#t@*
結果バッグが行の終端を超えているかを調べます。
この手続きは通常のリスト処理におけるnull?手続きに相当します。
@end defun

@defun next-result-bag result-bag
戻り値: 結果バッグ@*
結果バッグの「カーソル」を次の行に進めます。
この手続きは通常のリスト処理におけるcdr手続きに相当します。
@end defun

@defun row-ref row-of-result-bag symbol-of-row-id
戻り値: 行の要素に対応するオブジェクト@*
結果バッグの行オブジェクトから行に対応するオブジェクトを取得します。
第1引数には結果バッグの行を、第2引数には行名を表すシンボルを指定します。
@end defun

