- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Perl-DBI/SELECT へ行く。
SELECT
$sth = $dbh->prepare('SELECT id, name, age FROM t1 WHERE age > ?'); $sth->execute(15); while ($row = $sth->fetchrow_hashref()){ print $row->{id},"\n"; print $row->{name},"\n"; } die $sth->errstr if $sth->err;
- fetchrow_xxx()が途中でエラーを起こした場合、返値がundefなためwhile()ループを抜ける。
- 全行走査できたのかエラーだったのか調べるためには、
- $sth->errを使うか、
- RaiseErrorで例外をキャッチする。
selectxxx_xxx系
(prepare()を経ずに)SQLを直接実行する。
1行を取得
$row = $dbh->selectrow_arrayref('SELECT * FROM t1'); # $rowは配列(のリファレンス) $row = $dbh->selectrow_hashref('SELECT * FROM t1'); # $rowはハッシュ(のリファレンス)
全行を配列の配列(もしくはハッシュの配列)で取得
$rows = $dbh->selectall_arrayref("SELECT * FROM t1"); # 配列の配列 $rows = $dbh->selectall_arrayref("SELECT * FROM t1",{Slice=>[]}); # 配列の配列(上と同じ) $rows = $dbh->selectall_arrayref("SELECT * FROM t1",{Slice=>{}}); # ハッシュの配列 $rows = $dbh->selectall_arrayref("SELECT * FROM t1",{Columns=>{}}); # ハッシュの配列(上と同じ) $rows = $dbh->selectall_arrayref("SELECT * FROM t1",{Slice=>[0,1]}); # 配列(1カラム目と2カラム目のみ)の配列 $rows = $dbh->selectall_arrayref("SELECT * FROM t1",{Columns=>[1,2]}); # 配列(1カラム目と2カラム目のみ)の配列(上と同じだがColumnsでは1カラム目の添え字が1になる) $rows = $dbh->selectall_arrayref("SELECT * FROM t1",{Columns=>{id=>undef,name=>undef}}); # ハッシュ(id列とname列のみ)の配列
全行をハッシュのハッシュで取得
$rows = $dbh->selectall_hashref("SELECT * FROM t1",1); # 1は1カラム目(ここではid列)をハッシュのキーに指定するという意味 $rows = { '1' => {'name' => 'taro','id' => '1','age' => '20'}, '3' => {'name' => 'hanako','id' => '3','age' => '18'}, '2' => {'name' => 'jiro','id' => '2','age' => '14'} };
$rows = $dbh->selectall_hashref("SELECT * FROM t1",['id','name']); $rows = { '1' => {'taro' => {'name' => 'taro','id' => '1','age' => '20'}}, '3' => {'hanako' => {'name' => 'hanako','id' => '3','age' => '18'}}, '2' => {'jiro' => {'name' => 'jiro','id' => '2','age' => '14'}} };
fetchxxx_xxx系
prepare()とexecute()を実行した後に行う。
1行を取得
@row = $sth->fetchrow_array(); # 配列 $row = $sth->fetchrow_arrayref(); # 配列のリファレンス(上とほぼ同じ) $row = $sth->fetch(); # 配列のリファレンス(上と同じ) $row = $sth->fetchrow_hashref(); # ハッシュのリファレンス $row = $sth->fetchrow_hashref('NAME_uc'); # 上とほぼ同じだが、ハッシュのキー(カラム名)が大文字になる
全行を取得
$rows = $sth->fetchall_arrayref(); # 配列の配列 $rows = $sth->fetchall_arrayref([0]); # 配列(1カラム目のみ)の配列 $rows = $sth->fetchall_arrayref([-2,-1]); # 配列(最後のカラム"-1"とその前のカラム"-2"のみ)の配列 $rows = $sth->fetchall_arrayref({}); # ハッシュの配列 $rows = $sth->fetchall_arrayref({id=>undef,name=>undef}); # ハッシュ(id列とname列のみ)の配列
プレースホルダーに値を渡す
selectxxx_xxx系でもfetchxxx_xxx系でも、引数の最後の方(( 1, 'taro')の部分)に値を並べていく。
$row = $dbh->selectrow_hashref( 'SELECT * FROM t1 WHERE id = ? AND name = ?', {}, ( 1, 'taro' ) );
高速なSELECT
fetchrow_arrayrefとbind_columnsを使う。
$sth->bind_columns(\($num, $str)); while ($row = $sth->fetchrow_arrayref){ print "$num,$str\n"; }
影響した行数
$sth->rowsはすべてfetchし終わった後しか使えない。よって、あらかじめ行数を得るにはSELECT COUNT(*)を使う。
値のエスケープ
$data = $dbh->quote("don't"); $sql = "SELECT * FROM tbl WHERE name = $data";
http://search.cpan.org/perldoc?DBI#quote