- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 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(*)を使う。