• 追加された行はこの色です。
  • 削除された行はこの色です。
* SELECT [#ae945703]

 $sql = 'select num, str from t1 where num > ?';
 $sth = $dbh->prepare($sql);
 $sth->execute(2);
 $sth = $dbh->prepare('SELECT id, name, age FROM t1 WHERE age > ?');
 $sth->execute(15);
 while ($row = $sth->fetchrow_hashref()){
     print $row->{num},"\n";
     print $row->{str},"\n";
     print $row->{id},"\n";
     print $row->{name},"\n";
 }
 die $sth->errstr if $sth->err;
-fetchrow_xxx()が途中でエラーを起こした場合、返値がundefなためwhile()ループを抜ける。
-全行走査できたのかエラーだったのか調べるためには、
-$sth->errを使うか、
-RaiseErrorで例外をキャッチする。

*** 1行をハッシュで取得 [#c2963bd2]
 $hash_ref = $dbh->selectrow_hashref( 'SELECT * FROM user WHERE id = ? AND passwd = ?', {}, ( $id, $passwd ) );
** selectxxx_xxx系 [#wc674cf2]
(prepare()を経ずに)SQLを直接実行する。
*** 1行を取得 [#c2963bd2]
 $row = $dbh->selectrow_arrayref('SELECT * FROM t1'); # $rowは配列(のリファレンス)
 $row = $dbh->selectrow_hashref( 'SELECT * FROM t1'); # $rowはハッシュ(のリファレンス)

*** 全行をハッシュの配列で取得 [#w3f9898d]
 $arr_ref = $dbh->selectall_arrayref( 'SELECT * FROM user ORDER BY id', {Columns=>{}} );
必ず{Columns=>{}}を付ける。詳しくは、http://blog.scrapcode.net/article/598613.html
*** 全行を配列の配列(もしくはハッシュの配列)で取得 [#w3f9898d]
 $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列のみ)の配列

*** 1行ずつ取得 [#h9940962]
 @row_ary  = $sth->fetchrow_array; 
 $ary_ref  = $sth->fetchrow_arrayref; # $sth->fetchと書いても同じ
 $hash_ref = $sth->fetchrow_hashref;  # fetchrow_hashref('NAME_uc')とするとカラム名が大文字になる
*** まとめて取得 [#n71b4de7]
 $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というカラムだけ
*** 全行をハッシュのハッシュで取得 [#j2638e9c]
 $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'}
        };

*** プライマリキーをハッシュのキーにして取得 [#wa293720]
 $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";
 $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'}}
        };

 $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";
** fetchxxx_xxx系 [#d6acc21f]
prepare()とexecute()を実行した後に行う。

*** prepare()とexecute()とfetchXXX()をまとめて行う [#jd525776]
 $ref = $dbh->selectrow_array($sql,undef,(3));         # (3)はプレースホルダに渡す値
 $rows = $dbh->selectall_arrayref($sql, {Slice => {}});
 $ref = $dbh->selectall_hashref($sql,'num',undef,(3));
*** 1行を取得 [#qe945f62]
 @row = $sth->fetchrow_array();       # 配列
 $row = $sth->fetchrow_arrayref();     # 配列のリファレンス(上とほぼ同じ)
 $row = $sth->fetch();           # 配列のリファレンス(上と同じ)
 $row = $sth->fetchrow_hashref();      # ハッシュのリファレンス
 $row = $sth->fetchrow_hashref('NAME_uc'); # 上とほぼ同じだが、ハッシュのキー(カラム名)が大文字になる

*** 高速なSELECT [#v77e0889]
*** 全行を取得 [#pe489866]
 $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列のみ)の配列

** プレースホルダーに値を渡す [#r9e0243d]
selectxxx_xxx系でもfetchxxx_xxx系でも、引数の最後の方(( 1, 'taro')の部分)に値を並べていく。
 $row = $dbh->selectrow_hashref( 'SELECT * FROM t1 WHERE id = ? AND name = ?', {}, ( 1, 'taro' ) );

** 高速なSELECT [#v77e0889]
fetchrow_arrayrefとbind_columnsを使う。

 $sth->bind_columns(\($num, $str));
 while ($row = $sth->fetchrow_arrayref){
     print "$num,$str\n";
 }

*** 影響した行数 [#jacd6b3d]
** 影響した行数 [#jacd6b3d]
$sth->rowsはすべてfetchし終わった後しか使えない。よって、あらかじめ行数を得るにはSELECT COUNT(*)を使う。

** 値のエスケープ [#xf9b9469]
 $data = $dbh->quote("don't");
 $sql = "SELECT * FROM tbl WHERE name = $data";
http://search.cpan.org/perldoc?DBI#quote

** 参考 [#f5e07016]
http://search.cpan.org/perldoc?DBI


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS