2017-11-15 31 views
-3

몇 줄의 코드를 저장하기 위해 fetchrow_hashref 대신 DBI의 selectrow_hashref을 사용하려하지만 같은 행의 데이터를 계속해서 계속 반환합니다. 내가 fetchrow_hashref를 사용하는 경우Perl DBI의 selectrow_hashref를 통해 각 반복마다 새 행을 반환 할 수 있습니까?

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

은 다 잘하고, 각 반복 내가 새로운 데이터를 얻을.

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'는 one-off satations에 더 잘 사용됩니다. – 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