「これはヤバかったな」という遅刻エピソード

Perl・DBIで、select文発行のサブルーチンを作成していますが、未熟なため、完成できません。

呼び出し側では、下の記述のように、サブルーチンの引数として、SQL文を渡し(SELECT系)、戻り値として、SELECTされた結果を取得したい(配列もしくは、ハッシュで)と思っております。

もし、参考にできる、サイト・
サンプルサイト等のご紹介でも、結構ですので、ご教授くださればと思います。(処理の流れ等の箇条書きでもかまいません。)

--------------------------------------------
# 呼び出し側(メインルーチン)

$name;#テンプレート置換変数 
$age;#テンプレート置換変数

my $sql =<<"EOQ";# この抽出select文はその都度変わる。
select NAME,AGE
from EMP
EOQ

my @row = &do_select($sql);

$name= $row[0];
$age = $row[1];
もしくは、
$name = $hash_ref->{NAME};
$age = $hash_ref->{AGE};

のような記述で代入。


# テンプレートを読み込んで、置換処理で代入 ※幾分省略しています。
<table>
for(){# SELECT分の結果の行数分繰り返し処理。

<tr>
 <td>$name</td>
 <td>$age</td>
</tr>

}

</table>

my $dbh = DBI->connect($dbhost, $dbuser, $dbpass) || die $dbh::errorstr;

##### select発行サブルーチン #######

sub do_select{

my $sth;
my $rv;

my @row;# 戻り値(フィールドが入る)
my %dbhash;# 戻り値はこちらかな?

my $sql = shift(@_);# select文

$sth = $dbh->prepare("$sql");
$rv = $sth->execute || die $sth->errstr;


while($hash_ref = $sth->fetchrow_hashref){
     #print "$hash_ref->{TITLE}<br>";

# ここに、何かの処理が入る

}

return @row;
}

A 回答 (1件)

selectall_arrayrefとselectall_hashrefがあります。


$\ = "\n";
my $sql = 'select * from emp where age = ?';
my $dbh = DBI->connect($dbhost, $dbuser, $dbpass) || die $dbh::errorstr;
my $aref = $dbh->selectall_arrayref ($sql,undef,1);
foreach (@{$aref}) {
print 'name:',$_->[0];
print 'age:',$_->[1];
}
my $href = $dbh->selectall_hashref ($sql,undef,1);
foreach (@{$href}) {
print 'name:',$_->{'name'};
print 'age:',$_->{'age'};
}

当然(?)ですが、selectall_hashrefの方が遅いです。
あと、非常に重要な注意点として、selectall_hashrefは
DBIのバージョンによって挙動が変わります。
(上のselectall_hashrefは最新版では動きません)
もし、新しいバージョンのDBIを使う場合、
以下のようなコードなら同じような動作をさせることが出来ます。

while (my $aref = $sth->fetchrow_arrayref ()) {
(@tmp{@{$sth->{'NAME_lc'}}}) = @{$aref};
push (@href,\%tmp);
}

参考URL:http://member.nifty.ne.jp/hippo2000/perltips/dbi …
    • good
    • 0
この回答へのお礼

休日中なので、DBIの環境が調べられませんが、ありがとうございます。
書き込んだあとに、「selectall_arrayrefとselectall_hashref」の存在にたどり着いたのですが、『最新版では動きません』と言う情報は、非常に助かりました。
ありがとうございます。

お礼日時:2004/04/17 10:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!