![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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;
}
No.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 …
休日中なので、DBIの環境が調べられませんが、ありがとうございます。
書き込んだあとに、「selectall_arrayrefとselectall_hashref」の存在にたどり着いたのですが、『最新版では動きません』と言う情報は、非常に助かりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAでのデータ型変換、も...
-
関数の戻り値に配列は設定できる?
-
流れ図・・・
-
Can't use string ("0") as an ...
-
テキストボックスの名前に変数...
-
VBA Dir関数でファイルをループ...
-
多次元配列から重複を削除
-
ハッシュ検索はなぜ速い
-
Excel VBA ユーザーフォームの...
-
UWSCの終了の仕方
-
VBA for文が止まらない
-
多次元連想配列の削除
-
DOSコマンドのループ内のTIMEコ...
-
VB2010でCSVファイルの読み込み
-
EXCEL VBA If~Else~構文の内容...
-
【VBA】全て空白のセルの列の非...
-
.htaccessがループしてる?それ...
-
For文を使った九九表の作成
-
DoEventsが必要な理由について
-
文字列を変数名として扱う方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBのReturnの使い方
-
ExcelVBAでのデータ型変換、も...
-
$#{スカラー変数}とは何を意味...
-
Perl実行時のメモリ不足について
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
perl 文字列検索後に指定フィー...
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
範囲指定したセルを1つずつ飛...
-
VBAのautofilter、criteriaの配...
-
文字列を変数名として扱う方法
-
Escキーを押すと、中断する時と...
-
ハッシュ検索はなぜ速い
-
DOSコマンドのループ内のTIMEコ...
-
GIFアニメをループさせたくない
-
Excel VBA ユーザーフォームの...
-
VBAで3秒だけ時間を止めたい
-
乱数の桁数指定、または範囲指定。
-
アクティブセルから、A列最終行...
おすすめ情報