- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Perl-DBI/SELECT へ行く。
SELECT
$sql = 'select num, str from t1 where num > ?'; $sth = $dbh->prepare($sql); $sth->execute(2); while ($row = $sth->fetchrow_hashref()){ print $row->{num},"\n"; print $row->{str},"\n"; } die $sth->errstr if $sth->err;
- fetchrow_xxx()が途中でエラーを起こした場合、返値がundefなためwhile()ループを抜ける。
- 全行走査できたのかエラーだったのか調べるためには、
- $sth->errを使うか、
- RaiseErrorで例外をキャッチする。
1行をハッシュで取得
$hash_ref = $dbh->selectrow_hashref( 'SELECT * FROM user WHERE id = ? AND passwd = ?', {}, ( $id, $passwd ) );
全行をハッシュの配列で取得
$arr_ref = $dbh->selectall_arrayref( 'SELECT * FROM user ORDER BY id', {Columns=>{}} );
必ず{Columns=>{}}を付ける。詳しくは、http://blog.scrapcode.net/article/598613.html
1行ずつ取得
@row_ary = $sth->fetchrow_array; $ary_ref = $sth->fetchrow_arrayref; # $sth->fetchと書いても同じ $hash_ref = $sth->fetchrow_hashref; # fetchrow_hashref('NAME_uc')とするとカラム名が大文字になる
まとめて取得
$ary_ref = $sth->fetchall_arrayref; $ary_ref = $sth->fetchall_arrayref([0]); # 各行の先頭のカラムだけ取り出す $ary_ref = $sth->fetchall_arrayref([-2,-1]); # 各行の一番後ろとその直前の列 $ary_ref = $sth->fetchall_arrayref({}); # 各行をハッシュリファレンスとして取り出す $ary_ref = $sth->fetchall_arrayref({ foo=>1, bar=>1 }); # 各行のfooとbarというカラムだけ
プライマリキーをハッシュのキーにして取得
$sth = $dbh->prepare("SELECT id, name FROM table"); $sth->execute; $hash_ref = $sth->fetchall_hashref('id'); print "Name for id 42 is $hash_ref->{42}->{name}\n";
$sth = $dbh->prepare("SELECT foo, bar, baz FROM table"); $sth->execute; $hash_ref = $sth->fetchall_hashref( [ qw(foo bar) ] ); print "For foo 42 and bar 38, baz is $hash_ref->{42}->{38}->{baz}\n";
prepare()とexecute()とfetchXXX()をまとめて行う
$ref = $dbh->selectrow_array($sql,undef,(3)); # (3)はプレースホルダに渡す値 $rows = $dbh->selectall_arrayref($sql, {Slice => {}}); $ref = $dbh->selectall_hashref($sql,'num',undef,(3));
高速なSELECT
fetchrow_arrayrefとbind_columnsを使う。
$sth->bind_columns(\($num, $str)); while ($row = $sth->fetchrow_arrayref){ print "$num,$str\n"; }
影響した行数
$sth->rowsはすべてfetchし終わった後しか使えない。よって、あらかじめ行数を得るにはSELECT COUNT(*)を使う。