2010-10-22 15 views
1

На самом деле я выполнил запрос postgres, предположим, что он возвратил 10 строк. Теперь у меня есть обработчик инструкции ($ sth).perl dbi: fetchrow_arrayref

print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 

Теперь, я принес в 5 строк из обработчика заявления ($ sth- .Теперь я хочу получить обратно $ ссылочный STH указатель на 1-й строки .....

Что делать ....?

Благодаря

ответ

4

Вы не можете это сделать. курсоры базы данных предназначены для чтения строка за строкой, как поток, без перемотки.

Вы пе чтобы скопировать данные в массив в памяти, если вы хотите прыгать.

Проще всего было бы сделать

my $all_rows = $sth->fetchall_arrayref; 

, который дает вам ссылку на массив, с одной записи для каждой строки, каждая строка в том же формате, как fetchrow_arrayref производства.

+0

Будет ли это работать? Мне сказали, что для arrayref каждый раз используется один и тот же массив. поэтому вы не можете сохранить ссылку на массив и использовать ее позже, поскольку данные позади нее будут перезаписаны. Но я пытаюсь это подтвердить. – Jonathon

+0

Просто проверил тест, и я могу проверить, по крайней мере, в некоторых случаях вы не можете просто сохранить ссылку. Поскольку это одна и та же ссылка каждый раз. В документации сказано следующее: «Обратите внимание, что для каждой выборки возвращается эта же ссылка на массив, поэтому не храните ссылку и не используйте ее после более поздней выборки. Кроме того, элементы массива также используются повторно для каждой строки, поэтому будьте осторожны, если хотите взять ссылку на элемент ». Не то, чтобы что-то не так с этим точным примером, просто сочетая его с оригинальным кодом плакатов. – Jonathon

+0

Да, если вы выберете одну строку, вы не захотите сохранить эту ссылку, поскольку она будет повторно использоваться при получении следующей. Однако «fetchall» должен быть безопасным. – Thilo

0

другой способ обработки результата вашего запроса в, вы можете петлю над ним:

while(my $res = $sth->fetchrow_arrayref()) {do something} 
1

В while цикле.

  1. Fetch row.
  2. Если это то, что вы хотите сохранить, скопируйте результаты в список сохранения.
  3. Обратитесь к списку сохранения, когда вы хотите ссылаться на предыдущую строку.
Смежные вопросы