こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

配列に入った変数を二度使いたい

perlでDBデータをセレクトし表示させるプログラムで
以下のように一回目のforループでは正常に表示されます。

二度目に表示させようとすると何もデータがなくなっているようです。
print でも、もちろんなにも表示しません。

配列名を変えてもだめでした。とこが原因なのかわかりません。
ステートメントハンドルとかが関係あるのでしょうか?

いろいろ調べたのですが、ちょっとわかりませんでした。
申し訳ないのですが、教えてください。

話をまとめるとDBからセレクトした同じ行のデータを2回表示させたいということです。
よろしくお願いします。


my $db = DBI->connect("DBI:Pg:dbname=$UDBNAME",$USERNAME,$USERPASS);
my $sth=$db->prepare(" select * from server where no = $no ");
$sth->execute;

#一回目

for ((my $count)=0; $count<$num_rows;$count++){
my @ar=$sth->fetchrow_array;

#二回目

for ((my $count)=0; $count<$num_rows;$count++){
my @ar=$sth->fetchrow_array;

投稿日時 - 2005-03-11 18:24:23

QNo.1263465

困ってます

質問者が選んだベストアンサー

例えば、2要素をキーとする連想配列に貯めるとすると..
(未検証ですが)

my $db = DBI->connect("DBI:Pg:dbname=$UDBNAME",$USERNAME,$USERPASS);
my $sth=$db->prepare(" select * from server where no = $no ");
$sth->execute;

while(@ar=$sth->fetchrow_array)
{
if($count>=$num_rows){last;}
for(0 .. $#ar){$X{$count,$_}=$ar[$_];}
$count++;
}

print "例えば、3件目の第2フィールドは、",$X{2,1},"\n";

投稿日時 - 2005-03-15 23:48:02

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

$sth->fetchrow_arrayを2回呼び出すと言うことは、データベースから
”2回読み出す”ことになりますが、それでよろしいですか?

普通は、データベースから読み出す行為は、処理時間がかかるので行いません。

もし、その辺の課題を理解した上で、2回読み出したいのであれば、
$sth->execute;
を、もう一度処理してください。その後、fetchrow_arrayが動作できます。

一般的には、効率を優先し、自分の配列に一度蓄えた後、複数回利用するのが
多いと思います。

投稿日時 - 2005-03-11 19:45:10

お礼

ご回答ありがとうございます。
もしよろしければ
一般的には、効率を優先し、自分の配列に一度蓄えた後、複数回利用するのが
多いと思います。 のサンプルを教えていただけませんか?

よろしくお願いします。

投稿日時 - 2005-03-14 10:03:58

ANo.1

DBから直接処理した配列は一回使用すると消えてしまうみたいですねー。

もう一回Selectするか、
一回目のforの時に別の配列に入れるしかないのかもしれないです。

投稿日時 - 2005-03-11 19:37:16

あなたにオススメの質問