DBIラッパー
package DBIH use strict; use DBI; sub dbh { $__PACKAGE__::dbh ||= DBI->connect(hoge); return $__PACKAGE__::dbh } sub prepare { my ( $invocant, @sql ) = @_; my $dbh = $invocant->dbh; map { $__PACKAGE__::sql2sth{$sql} ||= $dbh->prepare($sql) } @sql; return wantarray ? @__PACKAGE__::sql2sth{@sql} : $__PACKAGE__::sql2sth{$sql[0]}; } END { my @sql = keys %__PACKAGE__::sql2sth; map { $__PACKAGE__::sql2sth{$_}->finish } @sql; $__PACKAGE__::dbh->disconnect; }
package名は自由に変更してください。
データベースの種類やパスワードとかはdbhルーチンの中にハードコーディング。
使い方は、下記の通り。
my $sth = DBIH->prepare("SELECT hoge FROM fuga");
要するに、同じSQL文を何度与えても、同じステートメントハンドルが戻ってくる。(ので若干効率化できる)
終了時に全てのステートメントハンドルを解放し、最後にデータベースハンドルも解放する。