2017-11-15 14 views
-3

2行のコードを節約するためにfetchrow_hashrefの代わりにDBIのselectrow_hashrefを使用しようとしていますが、同じ行のデータを何度も何度も返しています。Perl DBIのselectrow_hashrefをどのようにして各行を新しい行に戻すことができますか?

my $select="SELECT * FROM table"; 
while (my ($user_ref) = $dbh->selectrow_hashref()) { 
    # $user_ref is the same each time! 
} 

私はfetchrow_hashrefを使用し、すべてが正常であり、各反復が、私は新しいデータを取得します。

my $select="SELECT * FROM table"; 
my $sth = $dbh->prepare($select) || die "prepare: $select: $DBI::errstr"; 
$sth->execute() || die "execute: $select: $DBI::errstr"; 
while (my ($user_ref) = $sth->fetchrow_hashref()) { 
    # works great, new data in $user_ref each iteration 
} 

私が間違っていることを教えてください。 selectrow_hashrefは、単一レコードを取得することのみを目的としていますか?そのようには見えませんin the doc

+7

あなたのリンクからドキュメントに、「これは、ステートメントからのデータの最初の行を返します。」 –

+2

さらに、私は、繰り返し呼び出されるすべてのステートメントに対して 'prepare'メソッドの使用を避けることはできません。 'selectrow'は一回限りのサテライトの方が使いやすいです。 – tjd

答えて

2

selectrow_hashrefは、単一のレコードを取得することのみを目的としていますか?

はい。

このようには思われません。in the doc

まあ、そのドキュメントは言う:

それは声明からのデータの最初の行を返します。

私には明らかです。

代わりにselectall_hashrefをお探しですか?

更新:実は、私はあなたがselectall_arrayをしたいと思う:

my $select='SELECT * FROM table'; 
foreach my $user_ref ($dbh->selectall_array($select, { Slice => {} })) { 
    # $user_ref is a hash ref 
    say $user_ref->{some_column}; 
} 
+0

私は、これらのDBI呼び出しのいずれかが、シングルレコードモードまたは「while」のマルチレコードモードで使用できると考えることに惑わされました。両方のモードで長年にわたって 'fetchrow_array'のようなものを使用しました。私は間違った前提に私を導いた "準備する"に関連する内部を知らないと思う。大いに助けてください! 'selectall_array'は私の新しいジャムになります。 – Marcus

関連する問題