[Perl] => [DBI]


この日記のはてなブックマーク数 このエントリーを含むはてなブックマーク

ラージオブジェクトのデータを取得するには、ただ単にSELECTしただけではうまくいきません。以下のように、lo_open, lo_read, lo_closeを使用します。


#データベースに接続。
#この際AutoCommitは0(オフ)にする必要があります。1(オン)にすると、"lo_lseek: invalid large obj descriptor" というエラーがでます。


$dbh = DBI->connect("DBI:Pg:dbname=データベース名","ユーザ名","パスワード",{AutoCommit => 0});


#まずオブジェクトIDを取得します。
$sth = $dbh->prepare("SELECT data FROM dbname where \"id\" = 1");
$sth -> execute;
my($lobj_id) = $sth->fetchrow_array;
chomp $lobj_id;
$sth->finish();


#ラージオブジェクトをopen
$lobj_fd = $dbh->func($lobj_id, $dbh->{pg_INV_READ}, 'lo_open');


#ラージオブジェクトをread
do{
$lenth = $dbh->func($lobj_fd, $buffer, 1024, 'lo_read');
$data = $data . $buffer;
} while ($length > 0);


#ラージオブジェクトをclose
die "Couldn't lo_close $lobj_fd\n" if ($!dbh->func($lobj_fd, 'lo_close');

$dbh->disconnect();



関連記事
SQL::Abstract
DBD::Pgのインストール
doメソッド
カラム名の一覧を取得
該当するレコードの数を取得するには
fetchall_arrayref
fetchrow_hashref
ラージオブジェクトのインポート
ラージオブジェクトの削除
ラージオブジェクトの書き込み
ラージオブジェクトのデータを取得
DBI - database handle
広告