create a new page, using TOP as a template.
Front page
Backup
List of pages
Search
Recent changes
Help
Login
Start:
--[[プログラミングガイド]]~
*Firebird用DBI/DBDのリファレンス [#u80a5b56]
Perlモジュールの DBD::InterBase は、
Firebird & InterBase RDBMS サーバー用 DBI
ドライバに関するリファレンスと使い方のガイドです。
本ドキュメントは、Version 0.43 の "DBD/InterBas...
を概ね基にしていますが、記述や内容を大量に追加・改変して...
そのため、間違いなども多々あるかもしれません。~
''更に詳細が知りたい場合や疑わしいときは、モジュール本...
もしも明確な間違いを発見した場合は指摘をお願いします。~
&br;
ここではモジュールの取得やセットアップなどに関しては触...
のことは、[[Perl+DBI/DBDでFirebirdをアクセス]]を読んでく...
#contents
-Tips
--[[実質的なテーブルロック処理>#tips_tablelock]]
*基本的な使い方 [#y9e79515]
DBIモジュールから使います。基本的には次のように使用しま...
use DBI;
$dbh = DBI->connect("dbi:InterBase:db=$dbname", "sysdba"...
#-------- ここにクエリなどの処理が入る --------
$dbh->disconnect();
$dbnameはデータベース名が入っているものとします。~
基本的にはこのような感じなのですが、SELECTなどで行を取...
場合で多少途中の処理が違います。
&aname(noselect);
**取得するデータが無い場合 [#jfb443c1]
SQLを実行して成功・失敗などの結果を受取るだけですので、...
になります。
# モジュールの読み込み
use DBI;
# 接続(兼DBDのセットアップ)
$dbh = DBI->connect("dbi:InterBase:db=$dbname", "sysdba"...
# SQL実行準備
$sth = $dbh->prepare($sql_statement);
# 実行
$res = $sth->execute;
# 切断
$dbh->disconnect();
$sql_statement は実行する SQL 文が入っているものとしま...
行終端文字は不要です。~
$dbh はデータベースハンドル、$sth はステートメントハン...
実行結果が格納されます。
どの返り値も、失敗時には値が FALSE となります。実際の使...
などのために使用します。
**取得するデータがある場合(SELECT等) [#u30ff1a0]
基本的にはデータが無い場合と同じですが、データを取得す...
必要となります。内容が重複している部分(変数等)に関する説...
上述の[[取得するデータが無い場合>#noselect]]も併読してく...
基本処理は、次のような形になります。
# モジュールの読み込み
use DBI;
# 接続(兼DBDのセットアップ)
$dbh = DBI->connect("dbi:InterBase:db=$dbname", "sysdba"...
# SQL実行準備
$sth = $dbh->prepare($sql_statement);
# 実行
$res = $sth->execute();
# 行取得ループ
while ($result = $sth->fetch()) {
print "$result\n";
}
# ステートメントハンドルクローズ(すぐに切断する場合は不...
$res2 = $sth->finish();
# 切断
$dbh->disconnect();
$resultには、取得したレコードが格納されます。取得するデ...
undefが返ります。
*リファレンス [#y8609d72]
DBIのクラスメンバに関するリファレンスです。DBD::Int...
内容になってますので、他 DBD の場合にはまったく同じ動きに...
ので注意して下さい。
**DBIのクラスメソッド [#pbc3d4fd]
DBI->で使用するメソッドです。
***connect [#e7f2d4c9]
データベースに接続します。~
$dbh = DBI->connect($data_source, $username, $password)
or die $DBI::errstr;
$dbh = DBI->connect($data_source, $username, $password,...
or die $DBI::errstr;
%attr パラメータで、[[AutoCommit>#AutoCommit]],[[PrintE...
のデフォルト値を変更することができます。~
$dbh = DBI->connect($data_source, $user, $pass, {
RaiseError => 1,
AutoCommit => 0
});
$data_sourceパラメータの中で接続属性の値を定義すること...
dbi:DriverName(PrintError=>0,Taint=>1):...
この方法で指定された値は、%attrパラメータで指定された値...
※IB/FBでの補足事項
FB/IBに接続する場合に指定する接続パラメータは次のように...
必須項目はデータベース名のみです。大抵はデータベース名と...
程度での使用が多いでしょう。~
|パラメータ|説明|必須項目|h
|database&br;又はdbname&br;又はdb|データベース名|○|
|host|ホスト名||
|port|ポート番号||
|ib_dialect|Dialect数||
|ib_role|ロール名||
|ib_charset|キャラクタセットの指定||
|ib_cache|キャッシュバッファサイズ||
実際の指定は、InterBase用DBD使用の指定と、独自...
を同時に行います。同時の接続パラメータが複数ある場合は、...
セミコロンで区切ります。~
例えば、次のような形になります。
$dbh = DBI->connect("dbi:InterBase:dbname=$dbname","sysd...
マルチラインでの指定も可能です。
$dsn =<< "DSN";
dbi:InterBase:dbname=$dbname;
host=$host;
port=$port;
ib_dialect=$dialect;
ib_role=$role;
ib_charset=$charset;
ib_cache=$cache
DSN
リモートホストに接続する場合の接続パラメータは、例えば...
ここではデータベースパラメータに別名の"db"を使用しています。
$dsn = "dbi:InterBase:db=C:/temp/test.fdb;host=server.in...
ポート番号はhostパラメータで同時に指定することも出来ます。
$dsn = 'dbi:InterBase:db=/data/test.fdb;host=localhost/3...
***connect_cached [#s1e53684]
基本的にはconnect()と同じですが、パラメータの値がキャッ...
同じパラメータが指定された場合には同じハンドルを設定しま...
''Apache::DBIで提供される永続的な接続とは多くの点で異な...
***available_drivers [#g7744351]
有効なドライバ群を取得します。(DBIに実装)
@driver_names = DBI->available_drivers;
***data_sources [#dd3cda8f]
DBD::InterBaseでは未実装です。
**DBIの動的アトリビュート [#t506915b]
***$DBI::err [#d6d48279]
[[err>#err]]参照。
***$DBI::errstr [#q931f133]
[[errstr>#errstr]]参照。
***$DBI::rows [#efa3f146]
[[rows>#rows]]参照。
***$DBI::state [#y0875414]
エラーコードを標準の SQLSTATE5 文字形式で返します。
DBD::InterBaseでは未実装です。
[[state>#state]]と同じです。
***$DBI::lasth [#c173d52b]
最後のDBIメソッド呼び出しに使われたDBIオブジェクト・ハ...
最後のDBIメソッド呼び出しが破棄の場合う、もしも存在する...
ハンドルの親のハンドルを返します。
**全ハンドル共通のクラスメソッド [#j5b0f8bf]
全てのハンドルで使用できるメソッドです。
&aname(err);
***[[err>#err]] [#rcffd175]
エラーの取得
$rv = $h->err;
&aname(errstr);
***[[errstr>#errstr]] [#vea36cce]
エラーの取得(文字列)
$str = $h->errstr;
&aname(state);
***[[state>#state]] [#n3d71268]
DBD::InterBaseでは未実装です。
***trace [#be70bd1b]
トレースの指定。DBI本体の機能です。
$h->trace($trace_level, $trace_filename);
***trace_msg [#rff8545b]
トレースメッセージ。DBI本体の機能です。
$h->trace_msg($message_text);
***func [#pa7765fe]
DBDの機能呼び出し。DBD:InterBaseではトランザク...
詳細は、[[トランザクション>#tran]]を参照して下さい。
**全ハンドル共通のアトリビュート [#jf59be1c]
***Warn [#v89d0a0d]
論理型です。DBI本体の機能です。
***Active [#d6a05659]
読込み専用の論理型です。~
アクティブ状態であることを示します。データベースハンド...
データベースに接続中であることを示します。
***Kids [#yb738889]
読込み専用の論理型です。DBI本体の機能です。~
「子」のハンドル数を示します。例えば、データーベースハ...
ステートメントハンドルの数です。
***[[ActiveKids>#ActiveKids]] [#mf563f8c]
読込み専用の論理型です。DBI本体の機能です。~
アクティブになっているデータベースハンドルやステートメ...
の数です。
***[[CachedKids>#CacheKids]] [#kefa6341]
ハッシュで、DBI本体の機能です。~
「子」のハンドルに関するキャッシュです。例えば、ステー...
のprepareに関するキャッシュなどです。
***[[CompatMode>#CompatMode]] [#l5440457]
読込み専用の論理型です。~
DBD:InterBaseでは意味がありません。
***[[InactiveDestroy>#InactiveDestroy]] [#ea34ad63]
論理型で、DBI本体の機能です。~
新プロセスでハンドルを破棄しないように設定します。
&aname(PrintError);
***[[PrintError>#PrintError]] [#lb0ffe39]
論理型で、DBI本体の機能です。~
エラーを詳細に報告するかを設定します。デフォルトはTRUE...
&aname(RaiseError);
***[[RaiseError>#RaiseError]] [#f3f89e39]
論理型で、DBI本体の機能です。~
エラーを例外で発生させるかを設定します。デフォルトはFAL...
&aname(ChopBlanks);
***[[ChopBlanks>#ChopBlanks]] [#lf65ae46]
論理型で、DBI本体の機能です。~
CHARなどの固定幅項目のスペースに対するトリミング動作を...
デフォルトはFALSEです。
&aname(LongReadLen);
***[[LongReadLen>#LongReadLen]] [#w793db67]
整数型で、DBI本体の機能です。~
BLOBでの取り扱い最大長を制御します。デフォルトは80です。
これに0を設定すると、BLOBのデータが取得できません。
&aname(LongTruncOk);
***[[LongTruncOk>#LongTruncOk]] [#l6188ce4]
論理型で、DBI本体の機能です。~
[[LongReadLen>#LongReadLen]]で設定した値よりも大きい BL...
します。FALSEにすると、設定値よりも大きいBLOBを取得すると...
デフォルトはFALSEです。
&aname(Taint);
***Taint [#b249d7cc]
論理型で、DBI本体の機能です。~
Taintモードに設定します。
**データベースハンドルのメソッド [#a2de59bc]
DBI->connectで取得したデータベースハンドルで使用するメ...
***selectrow_array [#d1963a4f]
prepare, execute ,fetchrow_arrayの3メソッドの処理を一度...
@row_ary = $dbh->selectrow_array($statement);
@row_ary = $dbh->selectrow_array($statement, %attr);
@row_ary = $dbh->selectrow_array($statement, %attr, @bi...
***selectall_arrayref [#r502d9b4]
prepare, execute ,fetchall_arrayrefの3メソッドの処理を...
取り出されたデータ各行の配列へのリファレンスが入った配...
$ary_ref = $dbh->selectall_arrayref($statement);
$ary_ref = $dbh->selectall_arrayref($statement, %attr);
$ary_ref = $dbh->selectall_arrayref($statement, %attr, ...
***selectcol_arrayref [#adb3ab73]
prepare, executeを行い、全ての行の特定のカラムを取り出...
各行の最初のカラムの値が入った配列へのリファレンスを返...
$ary_ref = $dbh->selectcol_arrayref($statement);
$ary_ref = $dbh->selectcol_arrayref($statement, %attr);
$ary_ref = $dbh->selectcol_arrayref($statement, %attr, ...
***prepare [#xb004539]
SQL文実行の準備を行います。
$sth = $dbh->prepare($statement)
$sth = $dbh->prepare($statement, %attr);
[[AutoCommit>#AutoCommit]]がTRUEになっている場合、SQL実...
を開始し、次の execute() または最後の fetch() を実行する...
コミットされます。SELECT文の場合は、最後のfetch()またはfi...
ときにコミットされます。
***prepare_cached [#m6514c8b]
キャッシングが行われる以外はprepareと同様です。DBI本体...
アプリケーションによっては問題を起こすことがありますの...
***do [#n7b27aff]
1ステートメントをprepareし、executeします。
成功ならば影響を受けた行数を、エラーであればundefを返しま...
行数が不明の場合は-1を返します。
$rc = $dbh->do($statement);
$rc = $dbh->do($statement, %attr);
$rv = $dbh->do($statement, %attr, @bind_values);
SELECT文で使用した場合は結果が受取れません。
***commit [#ece03440]
コミットを行います。[[トランザクション>#tran]]を参照し...
$rc = $dbh->commit;
***rollback [#q1b977f4]
ロールバックを行います。[[トランザクション>#tran]]を参...
$rc = $dbh->roolback;
***disconnect [#ndc0c594]
データベースハンドルをデータベースから切断します
$rc = $dbh->disconnect;
***ping [#fc70a29d]
データベースハンドルが有効か検証します。
$rc = $dbh->ping;
***table_info [#efd3470c]
テーブルの情報を取得するためのステータスハンドルを取得...
$sth = $dbh->table_info;
***tables [#m9902d57]
テーブルの名前のリストを返します。
@names = $dbh->tables;
***type_info_all [#b0e97452]
使用できるデータ型の情報を返します。
$type_info_all = $dbh->type_info_all;
***type_info [#y6b6e47c]
データ型の情報を返します。DBI本体の機能です。????~
@type_info = $dbh->type_info($data_type);
***quote [#ya8c6200]
クォーテーション文字を変更します。DBI本体の機能です。~
$sql = $dbh->quote($value, $data_type);
**データベースハンドルのアトリビュート [#tf2a792e]
DBI->connectで取得したデータベースハンドルで使用するア...
&aname(AutoCommit);
***[[AutoCommit>#AutoCommit]] [#r6f2cadd]
論理型です。~
InterBaseの場合、ON(TRUE)ならば暗黙的なトラン...
デフォルトは ON です。詳しくは[[トランザクション>#tran]]...
***Driver [#f5cc58bb]
親ドライバのハンドルを保持します。
***Name [#ke97e388]
DBD::InterBaseでは未実装です。
&aname(RowCahceSize);
***[[RowCacheSize>#RowCacheSize]] [#zde9ba76]
DBIには実装されていますが、DBD::InterBaseでは...
***ib_softcommit [#pa7ae669]
論理型です。''DBD::InterBase独自の機能です。''~
ソフトコミット機能を有効にします。トランザクションを完...
されたレコードを更新し、参照などでロックされているアクセ...
デフォルトではFALSEになっています。
これにより、トランザクションで待ちに入っているアプリケ...
実行できる場合があります。[[AutoCommit>#AutoCommit]] がTR...
特に有用です。
値を現在の設定値より変更すると、現在のトランザクション...
ハードコミットされます。
**ステートメントハンドルのメソッド [#aee05813]
***bind_param [#t67390bf]
変数を、prepareされたSQL文に埋め込まれたプレースホルダ...
プレースホルダは疑問符(?)により示されます。BLOB使用時には...
を使用します。prepare後に使用します。
$rc = $sth->bind_param($p_num, $bind_value);
$rv = $sth->bind_param($p_num, $bind_value, %attr);
$rv = $sth->bind_param($p_num, $bind_value, $bind_type);
3番目の引数で渡される SQL データタイプは、DBD::Inte...
では無視されます。
***bind_param_inout [#rbd32451]
DBD::InterBaseでは未実装です。
***execute [#w6099e42]
repareで準備されたSQL文を実行します。
$rv = $sth->execute;
$rv = $sth->execute(@bind_values)
***fetchrow_arrayref [#qaee0046]
次の行を取り出し、フィールドの値をもった配列へのリファ...
NULLフィールドはundefとなります。fetchという別名も使用で...
無いかエラーの場合、undefを返します。
$ary_ref = $sth->fetchrow_arrayref;
$ary_ref = $sth->fetch;
***fetchrow_array [#ldfba8a6]
fetchrow_arrayrefと同じですが、配列そのものを返します。
@ary = $sth->fetchrow_array;
***fetchrow_hashref [#a19ed8a3]
fetchrow_arrayrefと同じですが、結果をハッシュで返します。
$hash_ref = $sth->fetchrow_hashref;
$hash_ref = $sth->fetchrow_hashref($name);
***fetchall_arrayref [#t41766ce]
DBI本体の機能です。~
すべてデータを取り出します。行ごとの配列へのリファレン...
へのリファレンスを返します。
$tbl_ary_ref = $sth->fetchall_arrayref;
***finish [#uefbcafa]
もう一度executeされるまで、このステートメント・ハンドル...
取り出しは行われないことを示します。
$rc = $sth->finish;
&aname(rows);
***[[rows>#rows]] [#m4fc3646]
最後のコマンドにより影響を受けた行数を返します。行数が...
の場合は、-1になります。
$rv = $sth->rows;
SELECT文の場合は、今までの処理で取得した行数が格納され...
***bind_col [#l1883919]
SELECT文による取得列(フィールド)の指定された項目に、 Pe...
付けます。bind_columnsも参照して下さい。番号は1から数えま...
結果が変数に直接コピーされるため、処理高速化のために非常...
$rc = $sth->bind_col($column_number, \$var_to_bind, %at...
***bind_columns [#c6c3cf35]
SELECT文による取得列(フィールド)に Perl の変数を関連付...
結果が変数に直接コピーされるため、処理高速化のために非常...
変数の数とSQLで取り出す列の数が一致していないと、dieとな...
$rc = $sth->bind_columns(%attr, @list_of_refs_to_vars_t...
***dump_results [#f703c8a5]
DBI本体の機能です。~
結果をダンプ出力します。デバッグ時などの簡易テスト用です。
$rows = $sth->dump_results($maxlen, $lsep, $fsep, $fh);
**ステートメントハンドルのアトリビュート [#afaab2e9]
***NUM_OF_FIELDS [#zbcb3d1b]
整数型で読込み専用です。DBI本体の機能です。~
準備されたSQL文の列数(カラム数)を示します。SELECT文以...
***NUM_OF_PARAMS [#r450cd0c]
整数型で読込み専用です。DBI本体の機能です。~
準備されたSQL文のプレースホルダ('?')数を示します。
***NAME [#xb13fcd7]
配列へのリファレンスで読込み専用です。~
各列に対応するフィールド名の配列へのリファレンスを返し...
(大文字/小文字)は実装に依存します。FBでは大文字固定かな?
***NAME_lc [#x9e56230]
配列へのリファレンスで読込み専用です。DBI本体の機能です。~
各列に対応するフィールド名の配列へのリファレンスを返し...
表現はかならず小文字になります。
***NAME_uc [#v5077c90]
配列へのリファレンスで読込み専用です。DBI本体の機能です。~
各列に対応するフィールド名の配列へのリファレンスを返し...
表現はかならず大文字になります。
***TYPE [#x6486a73]
配列へのリファレンスで読込み専用です。~
各列に対応した、整数値の配列へのリファレンスを返します。
値は対応する列のデータ型を示します。 データ型は、国際標準...
IB/FB特有のデータタイプとなります。
***PRECISION [#y4c691c4]
配列へのリファレンスで読込み専用です。~
各列の数値が格納されます。数値以外の列は、通常は最大長...
が格納されます。
***SCALE [#m272d692]
配列へのリファレンスで読込み専用です。~
各列に対応した整数値が格納されます。NULL(undef)のい場合...
が適用されないことを示します。
***NULLABLE [#b41c61b2]
配列へのリファレンスで読込み専用です。~
各列にNULLを設定出来るかを示します。(0:不可,1:可,2:不明)
&aname(CursorName);
***[[CursorName>#CursorName]] [#n239c543]
文字列で読込み専用です。~
カーソル名が、可能な限りにおいて格納されます。
***Statement [#jaedbf24]
文字列で読込み専用です。~
prepare()で渡された文を保持します。
&aname(RowCache);
***[[RowCache>#RowCache]] [#na07b97a]
整数型で読込み専用です。DBI本体の機能です。~
DBD::InterBaseでは未実装です。
*ドライバ特有の事項 [#w027133f]
&aname(tran);
**トランザクション [#o8873b82]
トランザクションの動作は、[[AutoCommit>#AutoCommit]]の...
[[AutoCommit>#AutoCommit]]の値はデフォルトでは TRUE と...
に反映されます。明示的に呼び出したcommit()やrollback()は...
&br;
[[AutoCommit>#AutoCommit]]をFALSEに設定すると、ただちに...
開始されます。そこで rollback()を呼び出せば、トランザクシ...
ロールバックされます。また、disconnet()を呼び出した場合も...
されます。
InterBase/Firebirdはトランザクションに対して非...
を行うことが出来ます。制御できる項目は、アクセスモード、...
レベル、ロックレゾリューション、テーブル予約などです。
具体的には、データベースハンドルのメソッドである、ib_se...
を使用します。~
&br;
connect()が成功したとき、トランザクションのデフォルトの...
次のようになっています。
アクセスモード: read/write
アイソレーションレベル: concurrency(一致)
ロックレゾリューション: wait
これを必要に応じ、ib_set_tx_param()で変更します。~
***[[AutoCommit>#AutoCommit]]をオフにしたときのトランザク...
詳細は DBI のドキュメントを参照してもらうとして、ここで...
&br;
[[AutoCommit>#AutoCommit]]がFALSEになっている場合、トラ...
行われますが、コミットの処理は明示的に行う必要があります。~
&br;
お勧めの方法は、アトリビュートの"[[RaiseError>#RaiseErr...
併用し、例外処理により処理を行う方法です。
[[RaiseError>#RaiseError]]が TRUE になっているときに該当...
対する処理でエラーが発生すると、例外が発生してDBIが"die"...
それを"eval{}"で捕まえようという発想です。~
evel{} を使用するのは、eval "..." よりも通常は処理が軽...
&br;
例: (接続等の処理は省いて書いてあります。)
# 次の2項を事前に設定しておく
$dbh->{RaiseError} = 1; #エラーを例外化
$dbh->{AutoCommit} = 0; #自動コミットオフ
eval {
#---- ここでINSER/UPDATEなどの処理が入る ----
$dbh->commit; # ここまで来たらコミット
};
if ($@) {
warn "トランザクション中に例外発生 $@";
$dbh->rollback; # ロールバック
# ロールバック時の、その他の処理
} else {
# コミット時の、その他の処理
}
この方法ならば、トランザクション中に不測の事態が発生し...
エラーをハンドリングできます。また、DBIのエラーチェックが...
ので、バグが発生しにくくなる利点もあります。~
&br;
[[RaiseError>#RaiseError]]を設定しない場合には、DBI呼び...
エラーのチェックをする必要があります。例えば次のように行...
$dbh->method(@args) or die $h->errstr;
***ib_set_tx_param [#ya35c993]
データベースハンドルのfunc()メソッドを使用して、次のよ...
呼び出します。
$dbh->func(
-access_mode => 'read_write',
-isolation_level => 'read_committed',
-lock_resolution => 'wait',
'ib_set_tx_param'
);
アクセスモード(-access_mode)には次のものが設定できます。
&br;
・read_write
&br;
読書きがロックされます。
&br;
・read_only
&br;
読込みは許可されます。
&br;
ロックレゾリューション(-lock_resolution)には次のものが設...
&br;
・wait
&br;
衝突した場合、処理が待たされます。
&br;
・no_wait
&br;
処理は待たされずにエラーとなります。
アイソレーションレベルには次のものが設定できます。
&br;
・snapshot
&br;
トランザクション開始以降に他で変更された項目は変更後の...
&br;
・read_committed
&br;
他トランザクションでコミットされた瞬間に最新の変更内容...
最新版候補のレコードとの矛盾を生じ無ければ変更も出来ます。
いずれにせよ、コミット前の変更は見えません。
&br;
read_comittedを設定した場合は、さらに次の項目のどれかが...
&br;
・record_version
&br;
たとえ更に新しいバージョンの行が存在していても、常に最...
行のみが見えます。
&br;
・no_record_version
&br;
未指定時のデフォルトです。常に行の最新バージョンのみが...
WAITと同時に指定された場合、列の処理が衝突した場合にはト...
完了するまで処理が待たされます。~
例えば次のようにして指定します。
$dbh->func(
-isolation_level => ['read_committed', 'record_versio...
'ib_set_tx_param'
);
テーブル予約は、Version0.30以降でサポートされました。~
トランザクションの開始でテーブル予約を行う時には、希望...
レベルを指定できます。予約を行うことにより、デッドロック...
縮小出来るかもしれません。予約するテーブルの名前は、-rese...
します。
例えば、次のように指定を行います。
$dbh->func(
-access_mode => 'read_write',
-isolation_level => 'read_committed',
-lock_resolution => 'wait',
-reserving =>
{
foo_table => {
lock => 'read',
},
bar_table => {
lock => 'read',
access => 'protected',
},
},
'ib_set_tx_param'
);
予約時のオプションは、次のものが設定できます。~
・access (オプション指定項目です)~
sharedもしくはprotectedを指定します。~
・lock (必須指定項目)~
readもしくはwriteを設定します。~
&br;
&aname(tips_tablelock);
※Tips※
SNAPSHOT,WAITの設定とテーブル予約(read/protced)を
併用すると、テーブルレベルの排他ロック(WAIT)と同じ
効果が得られます。テーブル予約付きトランザクション
開始の時点で予約の衝突が起こるためなんでしょうね。
&br;
[[AutoCommit>#AutoCommit]]が TRUE の場合でも、ib_set_tx...
出来ます。現在のトランザクションが完了して、新たに始まる...
から設定したパラメータが有効になります。~
パラメータなしで呼び出した場合、デフォルトの設定値にリ...
**その他のFB/IB独自機能に対する拡張 [#u790a62d]
***ib_database_info [#xf6085b4]
現在接続中のデータベース情報を検索します。
$hash_ref = $dbh->func(@info, 'ib_database_info');
$hash_ref = $dbh->func([@info], 'ib_database_info');
***ib_plan [#ec656739]
SQL文からクエリプランを検索します。
$plan = $sth->func('ib_plan');
例えば、次のようにして使用します。
my $sth = $dbh->prepare('SELECT * FROM foo');
print $sth->func('ib_plan'); # PLAN (FOO NATURAL)
**日時の表現について [#yb0a4067]
DBD::InterBaseでは、日時用のデータ型として、DA...
をサポートしています。~
デフォルト動作では、クエリ実行の結果に対してTIMESTAMPは...
TIMEは"%X"を変換規則として ANSI C の strftime() 関数に渡...
変換を行います。~
変換規則を変更したい場合は、アトリビュート ib_timestamp...
ib_dateformat,ib_timeformatを設定することにより実現できま...
・データベースハンドルレベル($dbh)での設定~
デフォルト設定を変更する例です。
$dbh->{ib_timestampformat} = '%m-%d-%Y %H:%M';
$dbh->{ib_dateformat} = '%m-%d-%Y';
$dbh->{ib_timeformat} = '%H:%M';
&br;
・ステートメントハンドルレベル($sth)での設定~
今回の prepare で、一時的に設定する例です。
$attr = {
ib_timestampformat => '%m-%d-%Y %H:%M',
ib_dateformat => '%m-%d-%Y',
ib_timeformat => '%H:%M',
};
# then, pass it to prepare() method.
$sth = $dbh->prepare($sql, $attr);
&br;
strftime()は地域設定の影響を受けますので、事前に適切な...
もし、あなたのアプリケーションが複数の地域での使用が想...
2つの特別なフォーマットの採用を考えてもいいかもしれませ...
'TM'は、Perlのlocaltime()と同じ9個の要素を返します。'I...
に依存した、次のような形式の値を返します。~
|データ型|sprintf()でのフォーマット指定|h
|TIMESTAMP|"%04d-%02d-%02d %02d:%02d:%02d.%04d"|
|DATE|"%04d-%02d-%02d"|
|TIME|"%02d:%02d:%02d.%04d"|
$dbh-E<gt>{ib_time_all}を設定することにより、3つのデー...
の設定を一括して行うことが出来ます。例えば、すべてを'TM'...
には次のようなります。
$dbh->{ib_time_all} = 'TM';
**イベントアラータに関する追加機能 [#tb752edd]
***ib_init_event [#zdf90c51]
イベント名を指定してイベントハンドルを初期化します。
$evh = $dbh->func(@event_names, 'ib_init_event');
***ib_wait_event [#y467d1a7]
指定したイベントハンドルに対して同期を行います。
$dbh->func($evh, 'ib_wait_event');
***ib_register_callback [#r23e8353]
非同期待ち用コールバックを登録します。
$dbh->func($evh, sub { print "callback..\n" }, 'ib_regis...
***ib_reinit_event [#te2dfd97]
指定したイベントハンドルを再初期化します。
$dbh->func($evh, 'ib_reinit_event');
**DBD::InterBaseで使用できないSQLとその対処法 [#...
***SET TRANSACTION [#cf4c8b53]
$dbh->func(..., 'set_tx_param') を使用してください。~
詳しくは、[[トランザクション>#tran]]や[[set_tx_param>#s...
を参照して下さい。
***DESCRIBE [#i87078a5]
カラム名の取得は、$sth->{NAME}アトリビュートによって代...
***EXECUTE IMMEDIATE [#v23bea8c]
do()を使用してください。
***CLOSE, OPEN, DECLARE CURSOR [#e78a4ee3]
"$sth->{[[CursorName>#CursorName]]}" の実行により、"SEL...
同じ効果が得られます。~
カーソルのクローズは、最後の fetch() 呼び出しまたは $st...
行われます。
***PREPARE, EXECUTE, FETCH [#hf800f7a]
prepare(), execute(), fetch() メソッドで同様なことが出...
**概知のバグや制限事項 [#nb71ab0d]
-概知のバグは今のところありません。しかし、これはバグが無...
保証するものではありません。
-FB/IB独自機能である配列の格納はサポートしていません。
-BLOBのブロック読書きは今のところはまだサポートされません...
サイズは、安全重視のプログラムならば、概ね 1MB 程度と思っ...
----
End:
--[[プログラミングガイド]]~
*Firebird用DBI/DBDのリファレンス [#u80a5b56]
Perlモジュールの DBD::InterBase は、
Firebird & InterBase RDBMS サーバー用 DBI
ドライバに関するリファレンスと使い方のガイドです。
本ドキュメントは、Version 0.43 の "DBD/InterBas...
を概ね基にしていますが、記述や内容を大量に追加・改変して...
そのため、間違いなども多々あるかもしれません。~
''更に詳細が知りたい場合や疑わしいときは、モジュール本...
もしも明確な間違いを発見した場合は指摘をお願いします。~
&br;
ここではモジュールの取得やセットアップなどに関しては触...
のことは、[[Perl+DBI/DBDでFirebirdをアクセス]]を読んでく...
#contents
-Tips
--[[実質的なテーブルロック処理>#tips_tablelock]]
*基本的な使い方 [#y9e79515]
DBIモジュールから使います。基本的には次のように使用しま...
use DBI;
$dbh = DBI->connect("dbi:InterBase:db=$dbname", "sysdba"...
#-------- ここにクエリなどの処理が入る --------
$dbh->disconnect();
$dbnameはデータベース名が入っているものとします。~
基本的にはこのような感じなのですが、SELECTなどで行を取...
場合で多少途中の処理が違います。
&aname(noselect);
**取得するデータが無い場合 [#jfb443c1]
SQLを実行して成功・失敗などの結果を受取るだけですので、...
になります。
# モジュールの読み込み
use DBI;
# 接続(兼DBDのセットアップ)
$dbh = DBI->connect("dbi:InterBase:db=$dbname", "sysdba"...
# SQL実行準備
$sth = $dbh->prepare($sql_statement);
# 実行
$res = $sth->execute;
# 切断
$dbh->disconnect();
$sql_statement は実行する SQL 文が入っているものとしま...
行終端文字は不要です。~
$dbh はデータベースハンドル、$sth はステートメントハン...
実行結果が格納されます。
どの返り値も、失敗時には値が FALSE となります。実際の使...
などのために使用します。
**取得するデータがある場合(SELECT等) [#u30ff1a0]
基本的にはデータが無い場合と同じですが、データを取得す...
必要となります。内容が重複している部分(変数等)に関する説...
上述の[[取得するデータが無い場合>#noselect]]も併読してく...
基本処理は、次のような形になります。
# モジュールの読み込み
use DBI;
# 接続(兼DBDのセットアップ)
$dbh = DBI->connect("dbi:InterBase:db=$dbname", "sysdba"...
# SQL実行準備
$sth = $dbh->prepare($sql_statement);
# 実行
$res = $sth->execute();
# 行取得ループ
while ($result = $sth->fetch()) {
print "$result\n";
}
# ステートメントハンドルクローズ(すぐに切断する場合は不...
$res2 = $sth->finish();
# 切断
$dbh->disconnect();
$resultには、取得したレコードが格納されます。取得するデ...
undefが返ります。
*リファレンス [#y8609d72]
DBIのクラスメンバに関するリファレンスです。DBD::Int...
内容になってますので、他 DBD の場合にはまったく同じ動きに...
ので注意して下さい。
**DBIのクラスメソッド [#pbc3d4fd]
DBI->で使用するメソッドです。
***connect [#e7f2d4c9]
データベースに接続します。~
$dbh = DBI->connect($data_source, $username, $password)
or die $DBI::errstr;
$dbh = DBI->connect($data_source, $username, $password,...
or die $DBI::errstr;
%attr パラメータで、[[AutoCommit>#AutoCommit]],[[PrintE...
のデフォルト値を変更することができます。~
$dbh = DBI->connect($data_source, $user, $pass, {
RaiseError => 1,
AutoCommit => 0
});
$data_sourceパラメータの中で接続属性の値を定義すること...
dbi:DriverName(PrintError=>0,Taint=>1):...
この方法で指定された値は、%attrパラメータで指定された値...
※IB/FBでの補足事項
FB/IBに接続する場合に指定する接続パラメータは次のように...
必須項目はデータベース名のみです。大抵はデータベース名と...
程度での使用が多いでしょう。~
|パラメータ|説明|必須項目|h
|database&br;又はdbname&br;又はdb|データベース名|○|
|host|ホスト名||
|port|ポート番号||
|ib_dialect|Dialect数||
|ib_role|ロール名||
|ib_charset|キャラクタセットの指定||
|ib_cache|キャッシュバッファサイズ||
実際の指定は、InterBase用DBD使用の指定と、独自...
を同時に行います。同時の接続パラメータが複数ある場合は、...
セミコロンで区切ります。~
例えば、次のような形になります。
$dbh = DBI->connect("dbi:InterBase:dbname=$dbname","sysd...
マルチラインでの指定も可能です。
$dsn =<< "DSN";
dbi:InterBase:dbname=$dbname;
host=$host;
port=$port;
ib_dialect=$dialect;
ib_role=$role;
ib_charset=$charset;
ib_cache=$cache
DSN
リモートホストに接続する場合の接続パラメータは、例えば...
ここではデータベースパラメータに別名の"db"を使用しています。
$dsn = "dbi:InterBase:db=C:/temp/test.fdb;host=server.in...
ポート番号はhostパラメータで同時に指定することも出来ます。
$dsn = 'dbi:InterBase:db=/data/test.fdb;host=localhost/3...
***connect_cached [#s1e53684]
基本的にはconnect()と同じですが、パラメータの値がキャッ...
同じパラメータが指定された場合には同じハンドルを設定しま...
''Apache::DBIで提供される永続的な接続とは多くの点で異な...
***available_drivers [#g7744351]
有効なドライバ群を取得します。(DBIに実装)
@driver_names = DBI->available_drivers;
***data_sources [#dd3cda8f]
DBD::InterBaseでは未実装です。
**DBIの動的アトリビュート [#t506915b]
***$DBI::err [#d6d48279]
[[err>#err]]参照。
***$DBI::errstr [#q931f133]
[[errstr>#errstr]]参照。
***$DBI::rows [#efa3f146]
[[rows>#rows]]参照。
***$DBI::state [#y0875414]
エラーコードを標準の SQLSTATE5 文字形式で返します。
DBD::InterBaseでは未実装です。
[[state>#state]]と同じです。
***$DBI::lasth [#c173d52b]
最後のDBIメソッド呼び出しに使われたDBIオブジェクト・ハ...
最後のDBIメソッド呼び出しが破棄の場合う、もしも存在する...
ハンドルの親のハンドルを返します。
**全ハンドル共通のクラスメソッド [#j5b0f8bf]
全てのハンドルで使用できるメソッドです。
&aname(err);
***[[err>#err]] [#rcffd175]
エラーの取得
$rv = $h->err;
&aname(errstr);
***[[errstr>#errstr]] [#vea36cce]
エラーの取得(文字列)
$str = $h->errstr;
&aname(state);
***[[state>#state]] [#n3d71268]
DBD::InterBaseでは未実装です。
***trace [#be70bd1b]
トレースの指定。DBI本体の機能です。
$h->trace($trace_level, $trace_filename);
***trace_msg [#rff8545b]
トレースメッセージ。DBI本体の機能です。
$h->trace_msg($message_text);
***func [#pa7765fe]
DBDの機能呼び出し。DBD:InterBaseではトランザク...
詳細は、[[トランザクション>#tran]]を参照して下さい。
**全ハンドル共通のアトリビュート [#jf59be1c]
***Warn [#v89d0a0d]
論理型です。DBI本体の機能です。
***Active [#d6a05659]
読込み専用の論理型です。~
アクティブ状態であることを示します。データベースハンド...
データベースに接続中であることを示します。
***Kids [#yb738889]
読込み専用の論理型です。DBI本体の機能です。~
「子」のハンドル数を示します。例えば、データーベースハ...
ステートメントハンドルの数です。
***[[ActiveKids>#ActiveKids]] [#mf563f8c]
読込み専用の論理型です。DBI本体の機能です。~
アクティブになっているデータベースハンドルやステートメ...
の数です。
***[[CachedKids>#CacheKids]] [#kefa6341]
ハッシュで、DBI本体の機能です。~
「子」のハンドルに関するキャッシュです。例えば、ステー...
のprepareに関するキャッシュなどです。
***[[CompatMode>#CompatMode]] [#l5440457]
読込み専用の論理型です。~
DBD:InterBaseでは意味がありません。
***[[InactiveDestroy>#InactiveDestroy]] [#ea34ad63]
論理型で、DBI本体の機能です。~
新プロセスでハンドルを破棄しないように設定します。
&aname(PrintError);
***[[PrintError>#PrintError]] [#lb0ffe39]
論理型で、DBI本体の機能です。~
エラーを詳細に報告するかを設定します。デフォルトはTRUE...
&aname(RaiseError);
***[[RaiseError>#RaiseError]] [#f3f89e39]
論理型で、DBI本体の機能です。~
エラーを例外で発生させるかを設定します。デフォルトはFAL...
&aname(ChopBlanks);
***[[ChopBlanks>#ChopBlanks]] [#lf65ae46]
論理型で、DBI本体の機能です。~
CHARなどの固定幅項目のスペースに対するトリミング動作を...
デフォルトはFALSEです。
&aname(LongReadLen);
***[[LongReadLen>#LongReadLen]] [#w793db67]
整数型で、DBI本体の機能です。~
BLOBでの取り扱い最大長を制御します。デフォルトは80です。
これに0を設定すると、BLOBのデータが取得できません。
&aname(LongTruncOk);
***[[LongTruncOk>#LongTruncOk]] [#l6188ce4]
論理型で、DBI本体の機能です。~
[[LongReadLen>#LongReadLen]]で設定した値よりも大きい BL...
します。FALSEにすると、設定値よりも大きいBLOBを取得すると...
デフォルトはFALSEです。
&aname(Taint);
***Taint [#b249d7cc]
論理型で、DBI本体の機能です。~
Taintモードに設定します。
**データベースハンドルのメソッド [#a2de59bc]
DBI->connectで取得したデータベースハンドルで使用するメ...
***selectrow_array [#d1963a4f]
prepare, execute ,fetchrow_arrayの3メソッドの処理を一度...
@row_ary = $dbh->selectrow_array($statement);
@row_ary = $dbh->selectrow_array($statement, %attr);
@row_ary = $dbh->selectrow_array($statement, %attr, @bi...
***selectall_arrayref [#r502d9b4]
prepare, execute ,fetchall_arrayrefの3メソッドの処理を...
取り出されたデータ各行の配列へのリファレンスが入った配...
$ary_ref = $dbh->selectall_arrayref($statement);
$ary_ref = $dbh->selectall_arrayref($statement, %attr);
$ary_ref = $dbh->selectall_arrayref($statement, %attr, ...
***selectcol_arrayref [#adb3ab73]
prepare, executeを行い、全ての行の特定のカラムを取り出...
各行の最初のカラムの値が入った配列へのリファレンスを返...
$ary_ref = $dbh->selectcol_arrayref($statement);
$ary_ref = $dbh->selectcol_arrayref($statement, %attr);
$ary_ref = $dbh->selectcol_arrayref($statement, %attr, ...
***prepare [#xb004539]
SQL文実行の準備を行います。
$sth = $dbh->prepare($statement)
$sth = $dbh->prepare($statement, %attr);
[[AutoCommit>#AutoCommit]]がTRUEになっている場合、SQL実...
を開始し、次の execute() または最後の fetch() を実行する...
コミットされます。SELECT文の場合は、最後のfetch()またはfi...
ときにコミットされます。
***prepare_cached [#m6514c8b]
キャッシングが行われる以外はprepareと同様です。DBI本体...
アプリケーションによっては問題を起こすことがありますの...
***do [#n7b27aff]
1ステートメントをprepareし、executeします。
成功ならば影響を受けた行数を、エラーであればundefを返しま...
行数が不明の場合は-1を返します。
$rc = $dbh->do($statement);
$rc = $dbh->do($statement, %attr);
$rv = $dbh->do($statement, %attr, @bind_values);
SELECT文で使用した場合は結果が受取れません。
***commit [#ece03440]
コミットを行います。[[トランザクション>#tran]]を参照し...
$rc = $dbh->commit;
***rollback [#q1b977f4]
ロールバックを行います。[[トランザクション>#tran]]を参...
$rc = $dbh->roolback;
***disconnect [#ndc0c594]
データベースハンドルをデータベースから切断します
$rc = $dbh->disconnect;
***ping [#fc70a29d]
データベースハンドルが有効か検証します。
$rc = $dbh->ping;
***table_info [#efd3470c]
テーブルの情報を取得するためのステータスハンドルを取得...
$sth = $dbh->table_info;
***tables [#m9902d57]
テーブルの名前のリストを返します。
@names = $dbh->tables;
***type_info_all [#b0e97452]
使用できるデータ型の情報を返します。
$type_info_all = $dbh->type_info_all;
***type_info [#y6b6e47c]
データ型の情報を返します。DBI本体の機能です。????~
@type_info = $dbh->type_info($data_type);
***quote [#ya8c6200]
クォーテーション文字を変更します。DBI本体の機能です。~
$sql = $dbh->quote($value, $data_type);
**データベースハンドルのアトリビュート [#tf2a792e]
DBI->connectで取得したデータベースハンドルで使用するア...
&aname(AutoCommit);
***[[AutoCommit>#AutoCommit]] [#r6f2cadd]
論理型です。~
InterBaseの場合、ON(TRUE)ならば暗黙的なトラン...
デフォルトは ON です。詳しくは[[トランザクション>#tran]]...
***Driver [#f5cc58bb]
親ドライバのハンドルを保持します。
***Name [#ke97e388]
DBD::InterBaseでは未実装です。
&aname(RowCahceSize);
***[[RowCacheSize>#RowCacheSize]] [#zde9ba76]
DBIには実装されていますが、DBD::InterBaseでは...
***ib_softcommit [#pa7ae669]
論理型です。''DBD::InterBase独自の機能です。''~
ソフトコミット機能を有効にします。トランザクションを完...
されたレコードを更新し、参照などでロックされているアクセ...
デフォルトではFALSEになっています。
これにより、トランザクションで待ちに入っているアプリケ...
実行できる場合があります。[[AutoCommit>#AutoCommit]] がTR...
特に有用です。
値を現在の設定値より変更すると、現在のトランザクション...
ハードコミットされます。
**ステートメントハンドルのメソッド [#aee05813]
***bind_param [#t67390bf]
変数を、prepareされたSQL文に埋め込まれたプレースホルダ...
プレースホルダは疑問符(?)により示されます。BLOB使用時には...
を使用します。prepare後に使用します。
$rc = $sth->bind_param($p_num, $bind_value);
$rv = $sth->bind_param($p_num, $bind_value, %attr);
$rv = $sth->bind_param($p_num, $bind_value, $bind_type);
3番目の引数で渡される SQL データタイプは、DBD::Inte...
では無視されます。
***bind_param_inout [#rbd32451]
DBD::InterBaseでは未実装です。
***execute [#w6099e42]
repareで準備されたSQL文を実行します。
$rv = $sth->execute;
$rv = $sth->execute(@bind_values)
***fetchrow_arrayref [#qaee0046]
次の行を取り出し、フィールドの値をもった配列へのリファ...
NULLフィールドはundefとなります。fetchという別名も使用で...
無いかエラーの場合、undefを返します。
$ary_ref = $sth->fetchrow_arrayref;
$ary_ref = $sth->fetch;
***fetchrow_array [#ldfba8a6]
fetchrow_arrayrefと同じですが、配列そのものを返します。
@ary = $sth->fetchrow_array;
***fetchrow_hashref [#a19ed8a3]
fetchrow_arrayrefと同じですが、結果をハッシュで返します。
$hash_ref = $sth->fetchrow_hashref;
$hash_ref = $sth->fetchrow_hashref($name);
***fetchall_arrayref [#t41766ce]
DBI本体の機能です。~
すべてデータを取り出します。行ごとの配列へのリファレン...
へのリファレンスを返します。
$tbl_ary_ref = $sth->fetchall_arrayref;
***finish [#uefbcafa]
もう一度executeされるまで、このステートメント・ハンドル...
取り出しは行われないことを示します。
$rc = $sth->finish;
&aname(rows);
***[[rows>#rows]] [#m4fc3646]
最後のコマンドにより影響を受けた行数を返します。行数が...
の場合は、-1になります。
$rv = $sth->rows;
SELECT文の場合は、今までの処理で取得した行数が格納され...
***bind_col [#l1883919]
SELECT文による取得列(フィールド)の指定された項目に、 Pe...
付けます。bind_columnsも参照して下さい。番号は1から数えま...
結果が変数に直接コピーされるため、処理高速化のために非常...
$rc = $sth->bind_col($column_number, \$var_to_bind, %at...
***bind_columns [#c6c3cf35]
SELECT文による取得列(フィールド)に Perl の変数を関連付...
結果が変数に直接コピーされるため、処理高速化のために非常...
変数の数とSQLで取り出す列の数が一致していないと、dieとな...
$rc = $sth->bind_columns(%attr, @list_of_refs_to_vars_t...
***dump_results [#f703c8a5]
DBI本体の機能です。~
結果をダンプ出力します。デバッグ時などの簡易テスト用です。
$rows = $sth->dump_results($maxlen, $lsep, $fsep, $fh);
**ステートメントハンドルのアトリビュート [#afaab2e9]
***NUM_OF_FIELDS [#zbcb3d1b]
整数型で読込み専用です。DBI本体の機能です。~
準備されたSQL文の列数(カラム数)を示します。SELECT文以...
***NUM_OF_PARAMS [#r450cd0c]
整数型で読込み専用です。DBI本体の機能です。~
準備されたSQL文のプレースホルダ('?')数を示します。
***NAME [#xb13fcd7]
配列へのリファレンスで読込み専用です。~
各列に対応するフィールド名の配列へのリファレンスを返し...
(大文字/小文字)は実装に依存します。FBでは大文字固定かな?
***NAME_lc [#x9e56230]
配列へのリファレンスで読込み専用です。DBI本体の機能です。~
各列に対応するフィールド名の配列へのリファレンスを返し...
表現はかならず小文字になります。
***NAME_uc [#v5077c90]
配列へのリファレンスで読込み専用です。DBI本体の機能です。~
各列に対応するフィールド名の配列へのリファレンスを返し...
表現はかならず大文字になります。
***TYPE [#x6486a73]
配列へのリファレンスで読込み専用です。~
各列に対応した、整数値の配列へのリファレンスを返します。
値は対応する列のデータ型を示します。 データ型は、国際標準...
IB/FB特有のデータタイプとなります。
***PRECISION [#y4c691c4]
配列へのリファレンスで読込み専用です。~
各列の数値が格納されます。数値以外の列は、通常は最大長...
が格納されます。
***SCALE [#m272d692]
配列へのリファレンスで読込み専用です。~
各列に対応した整数値が格納されます。NULL(undef)のい場合...
が適用されないことを示します。
***NULLABLE [#b41c61b2]
配列へのリファレンスで読込み専用です。~
各列にNULLを設定出来るかを示します。(0:不可,1:可,2:不明)
&aname(CursorName);
***[[CursorName>#CursorName]] [#n239c543]
文字列で読込み専用です。~
カーソル名が、可能な限りにおいて格納されます。
***Statement [#jaedbf24]
文字列で読込み専用です。~
prepare()で渡された文を保持します。
&aname(RowCache);
***[[RowCache>#RowCache]] [#na07b97a]
整数型で読込み専用です。DBI本体の機能です。~
DBD::InterBaseでは未実装です。
*ドライバ特有の事項 [#w027133f]
&aname(tran);
**トランザクション [#o8873b82]
トランザクションの動作は、[[AutoCommit>#AutoCommit]]の...
[[AutoCommit>#AutoCommit]]の値はデフォルトでは TRUE と...
に反映されます。明示的に呼び出したcommit()やrollback()は...
&br;
[[AutoCommit>#AutoCommit]]をFALSEに設定すると、ただちに...
開始されます。そこで rollback()を呼び出せば、トランザクシ...
ロールバックされます。また、disconnet()を呼び出した場合も...
されます。
InterBase/Firebirdはトランザクションに対して非...
を行うことが出来ます。制御できる項目は、アクセスモード、...
レベル、ロックレゾリューション、テーブル予約などです。
具体的には、データベースハンドルのメソッドである、ib_se...
を使用します。~
&br;
connect()が成功したとき、トランザクションのデフォルトの...
次のようになっています。
アクセスモード: read/write
アイソレーションレベル: concurrency(一致)
ロックレゾリューション: wait
これを必要に応じ、ib_set_tx_param()で変更します。~
***[[AutoCommit>#AutoCommit]]をオフにしたときのトランザク...
詳細は DBI のドキュメントを参照してもらうとして、ここで...
&br;
[[AutoCommit>#AutoCommit]]がFALSEになっている場合、トラ...
行われますが、コミットの処理は明示的に行う必要があります。~
&br;
お勧めの方法は、アトリビュートの"[[RaiseError>#RaiseErr...
併用し、例外処理により処理を行う方法です。
[[RaiseError>#RaiseError]]が TRUE になっているときに該当...
対する処理でエラーが発生すると、例外が発生してDBIが"die"...
それを"eval{}"で捕まえようという発想です。~
evel{} を使用するのは、eval "..." よりも通常は処理が軽...
&br;
例: (接続等の処理は省いて書いてあります。)
# 次の2項を事前に設定しておく
$dbh->{RaiseError} = 1; #エラーを例外化
$dbh->{AutoCommit} = 0; #自動コミットオフ
eval {
#---- ここでINSER/UPDATEなどの処理が入る ----
$dbh->commit; # ここまで来たらコミット
};
if ($@) {
warn "トランザクション中に例外発生 $@";
$dbh->rollback; # ロールバック
# ロールバック時の、その他の処理
} else {
# コミット時の、その他の処理
}
この方法ならば、トランザクション中に不測の事態が発生し...
エラーをハンドリングできます。また、DBIのエラーチェックが...
ので、バグが発生しにくくなる利点もあります。~
&br;
[[RaiseError>#RaiseError]]を設定しない場合には、DBI呼び...
エラーのチェックをする必要があります。例えば次のように行...
$dbh->method(@args) or die $h->errstr;
***ib_set_tx_param [#ya35c993]
データベースハンドルのfunc()メソッドを使用して、次のよ...
呼び出します。
$dbh->func(
-access_mode => 'read_write',
-isolation_level => 'read_committed',
-lock_resolution => 'wait',
'ib_set_tx_param'
);
アクセスモード(-access_mode)には次のものが設定できます。
&br;
・read_write
&br;
読書きがロックされます。
&br;
・read_only
&br;
読込みは許可されます。
&br;
ロックレゾリューション(-lock_resolution)には次のものが設...
&br;
・wait
&br;
衝突した場合、処理が待たされます。
&br;
・no_wait
&br;
処理は待たされずにエラーとなります。
アイソレーションレベルには次のものが設定できます。
&br;
・snapshot
&br;
トランザクション開始以降に他で変更された項目は変更後の...
&br;
・read_committed
&br;
他トランザクションでコミットされた瞬間に最新の変更内容...
最新版候補のレコードとの矛盾を生じ無ければ変更も出来ます。
いずれにせよ、コミット前の変更は見えません。
&br;
read_comittedを設定した場合は、さらに次の項目のどれかが...
&br;
・record_version
&br;
たとえ更に新しいバージョンの行が存在していても、常に最...
行のみが見えます。
&br;
・no_record_version
&br;
未指定時のデフォルトです。常に行の最新バージョンのみが...
WAITと同時に指定された場合、列の処理が衝突した場合にはト...
完了するまで処理が待たされます。~
例えば次のようにして指定します。
$dbh->func(
-isolation_level => ['read_committed', 'record_versio...
'ib_set_tx_param'
);
テーブル予約は、Version0.30以降でサポートされました。~
トランザクションの開始でテーブル予約を行う時には、希望...
レベルを指定できます。予約を行うことにより、デッドロック...
縮小出来るかもしれません。予約するテーブルの名前は、-rese...
します。
例えば、次のように指定を行います。
$dbh->func(
-access_mode => 'read_write',
-isolation_level => 'read_committed',
-lock_resolution => 'wait',
-reserving =>
{
foo_table => {
lock => 'read',
},
bar_table => {
lock => 'read',
access => 'protected',
},
},
'ib_set_tx_param'
);
予約時のオプションは、次のものが設定できます。~
・access (オプション指定項目です)~
sharedもしくはprotectedを指定します。~
・lock (必須指定項目)~
readもしくはwriteを設定します。~
&br;
&aname(tips_tablelock);
※Tips※
SNAPSHOT,WAITの設定とテーブル予約(read/protced)を
併用すると、テーブルレベルの排他ロック(WAIT)と同じ
効果が得られます。テーブル予約付きトランザクション
開始の時点で予約の衝突が起こるためなんでしょうね。
&br;
[[AutoCommit>#AutoCommit]]が TRUE の場合でも、ib_set_tx...
出来ます。現在のトランザクションが完了して、新たに始まる...
から設定したパラメータが有効になります。~
パラメータなしで呼び出した場合、デフォルトの設定値にリ...
**その他のFB/IB独自機能に対する拡張 [#u790a62d]
***ib_database_info [#xf6085b4]
現在接続中のデータベース情報を検索します。
$hash_ref = $dbh->func(@info, 'ib_database_info');
$hash_ref = $dbh->func([@info], 'ib_database_info');
***ib_plan [#ec656739]
SQL文からクエリプランを検索します。
$plan = $sth->func('ib_plan');
例えば、次のようにして使用します。
my $sth = $dbh->prepare('SELECT * FROM foo');
print $sth->func('ib_plan'); # PLAN (FOO NATURAL)
**日時の表現について [#yb0a4067]
DBD::InterBaseでは、日時用のデータ型として、DA...
をサポートしています。~
デフォルト動作では、クエリ実行の結果に対してTIMESTAMPは...
TIMEは"%X"を変換規則として ANSI C の strftime() 関数に渡...
変換を行います。~
変換規則を変更したい場合は、アトリビュート ib_timestamp...
ib_dateformat,ib_timeformatを設定することにより実現できま...
・データベースハンドルレベル($dbh)での設定~
デフォルト設定を変更する例です。
$dbh->{ib_timestampformat} = '%m-%d-%Y %H:%M';
$dbh->{ib_dateformat} = '%m-%d-%Y';
$dbh->{ib_timeformat} = '%H:%M';
&br;
・ステートメントハンドルレベル($sth)での設定~
今回の prepare で、一時的に設定する例です。
$attr = {
ib_timestampformat => '%m-%d-%Y %H:%M',
ib_dateformat => '%m-%d-%Y',
ib_timeformat => '%H:%M',
};
# then, pass it to prepare() method.
$sth = $dbh->prepare($sql, $attr);
&br;
strftime()は地域設定の影響を受けますので、事前に適切な...
もし、あなたのアプリケーションが複数の地域での使用が想...
2つの特別なフォーマットの採用を考えてもいいかもしれませ...
'TM'は、Perlのlocaltime()と同じ9個の要素を返します。'I...
に依存した、次のような形式の値を返します。~
|データ型|sprintf()でのフォーマット指定|h
|TIMESTAMP|"%04d-%02d-%02d %02d:%02d:%02d.%04d"|
|DATE|"%04d-%02d-%02d"|
|TIME|"%02d:%02d:%02d.%04d"|
$dbh-E<gt>{ib_time_all}を設定することにより、3つのデー...
の設定を一括して行うことが出来ます。例えば、すべてを'TM'...
には次のようなります。
$dbh->{ib_time_all} = 'TM';
**イベントアラータに関する追加機能 [#tb752edd]
***ib_init_event [#zdf90c51]
イベント名を指定してイベントハンドルを初期化します。
$evh = $dbh->func(@event_names, 'ib_init_event');
***ib_wait_event [#y467d1a7]
指定したイベントハンドルに対して同期を行います。
$dbh->func($evh, 'ib_wait_event');
***ib_register_callback [#r23e8353]
非同期待ち用コールバックを登録します。
$dbh->func($evh, sub { print "callback..\n" }, 'ib_regis...
***ib_reinit_event [#te2dfd97]
指定したイベントハンドルを再初期化します。
$dbh->func($evh, 'ib_reinit_event');
**DBD::InterBaseで使用できないSQLとその対処法 [#...
***SET TRANSACTION [#cf4c8b53]
$dbh->func(..., 'set_tx_param') を使用してください。~
詳しくは、[[トランザクション>#tran]]や[[set_tx_param>#s...
を参照して下さい。
***DESCRIBE [#i87078a5]
カラム名の取得は、$sth->{NAME}アトリビュートによって代...
***EXECUTE IMMEDIATE [#v23bea8c]
do()を使用してください。
***CLOSE, OPEN, DECLARE CURSOR [#e78a4ee3]
"$sth->{[[CursorName>#CursorName]]}" の実行により、"SEL...
同じ効果が得られます。~
カーソルのクローズは、最後の fetch() 呼び出しまたは $st...
行われます。
***PREPARE, EXECUTE, FETCH [#hf800f7a]
prepare(), execute(), fetch() メソッドで同様なことが出...
**概知のバグや制限事項 [#nb71ab0d]
-概知のバグは今のところありません。しかし、これはバグが無...
保証するものではありません。
-FB/IB独自機能である配列の格納はサポートしていません。
-BLOBのブロック読書きは今のところはまだサポートされません...
サイズは、安全重視のプログラムならば、概ね 1MB 程度と思っ...
----
Page:
New
Rename
Front page
List of pages
Search
Recent changes
Backup
Help
RSS of recent changes