Xpoint
   [напомнить пароль]

Несколько циклов по курсору

Метки: [без меток]
2007-10-18 11:42:50 [обр] Anton(0/1)[досье]
Как можно и вожно ли вообще в Perl (DBI)
несколько раз пройтись по возвращёному курсору?
use DBI;
$dbh =  DBI->connect('dbi:Oracle:SERP', 'user', 'password') or die "Error $!";
$stm = $dbh->prepare("select * from table") ;
$stm->execute();
#Первый цикл 
while(my @row = $stm->fetchrow_array()){
   print "@row\n";
}
#Второй цикл
while(my @row = $stm->fetchrow_array()){
   print "@row\n";
}
спустя 18 минут [обр] Роман Чемисов(56/327)[досье]
Anton[досье]
Может быть это: Binding Cursors.
спустя 1 час 14 минут [обр] Thirteensmay(15/157)[досье]
это не эффективно, поэтому imho средствами DBI нет, можно сохранить результирующий набор отдельно тогда проблем нет.
спустя 12 минут [обр] Anton(0/1)[досье]

Thirteensmay[досье]

это не эффективно, поэтому imho средствами DBI нет, можно сохранить результирующий набор отдельно тогда проблем нет.

Thirteensmay вы хотите сказать что после очередного цикла текущая запись удаляется?
Если да то есть ли какой нибудь годовый метод для сохранения курсора например в хеше?

спустя 20 минут [обр] Thirteensmay(15/157)[досье]
Где то читал что набор освобождается после извлечения последней записи. Конечно есть такой готовый метод - цикл простейший ;) Я например писал простенькую надстройку над DBI (модуль) о трех килобайтах, в нем 2 режима: обычный как в DBI и "расширенный" (с сохранением результата во внутренний массив) процедуры этого модуля ессно имеют доступ к своему внутреннему массиву и ессно реализовано позиционирование по нему. В качестве бонуса синтаксис вызовов почеловечнее DBI'шного ;) Пишется за пару часов, не проблема. Но может быть и совсем "какой нибудь годовый метод" есть, не знаю, не интересовался...
спустя 54 минуты [обр] Anton(0/1)[досье]
Про простой цикл я Thirteensmay[досье] и без тебя догодался.
Есть метод fetchall_arrayref который пихает возвращёный курсор в масив сылок
а принимает в параметры хеш столбцов которые нужно сохранить
use DBI;
$dbh =  DBI->connect('dbi:Oracle:SERP', 'user', 'password') or die "Error $!";
$stm = $dbh->prepare("select * from table") ;
$stm->execute();

$array_ref = $stm->fetchall_arrayref( { NAME => 1, ID=> 1 } );

#Первый цикл 
foreach $row ( @$array_ref ){
   print  $row->{NAME};
}
#Второй цикл
foreach $row ( @$array_ref ){
   print  $row->{NAME};
}
и.т.д............
спустя 4 минуты [обр] Green(3/6)[досье]
Можно так
my @ans;
&answer_as_arr($stm,\@ans);

print"\n******\nПервый цикл\n******\n";
foreach(@ans)
{
   print @$_, "\n";
}

print"\n******\nВторой цикл\n******\n";
foreach(@ans)
{
   print @$_, "\n";
}


sub answer_as_arr
{
    my ($stm,$array) = @_;
    while(my @row = $stm->fetchrow_array())
    {
       push @$array, \@row;
    }
}
спустя 10 минут [обр] Dennis F. Latypoff aka funky_dennis(24/78)[досье]
$arrayref = $dbh->selectall_arrayref("select * from table");
без prepare, execute, fetch и finish
спустя 8 минут [обр] Green(3/6)[досье]
Dennis F. Latypoff aka funky_dennis[досье] благодарю
*смущено полез читать доки по DBI*
Powered by POEM™ Engine Copyright © 2002-2005