アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;

A 回答 (3件)

例えば、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";
    • good
    • 0

$sth->fetchrow_arrayを2回呼び出すと言うことは、データベースから


”2回読み出す”ことになりますが、それでよろしいですか?

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

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

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

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

よろしくお願いします。

お礼日時:2005/03/14 10:03

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



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

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