URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5792
[ Назад ]

Исходное сообщение
"perl, два запроса к базе в рамках одного подключения"

Отправлено CombatPenguin , 09-Окт-06 14:44 
Имеем такой код:

my $database = "db";
my $hostname = "localhost";
my $port     = "3306";
my $user     = "user";
my $password = "password";

sub CALC
{
    my ($dbh,$sql,$sth);

    $dbh  = DBI->connect("DBI:mysql:$database:$hostname:$port",$user, $password);
    $sql  = "SELECT count(*),round(sum(a)),round(sum(b))";
    $sql .= "FROM qwe";
    $sql .= "GROUP BY 'c'";
    $sth  = $dbh->prepare($sql);
    $sth->execute;
    return $sth->fetchrow_array();
    $sth->finish;
    $dbh->disconnect;
}
sub SELECT
{
    my ($dbh,$sql,$sth,$n,$a,$b);

    $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",$user, $password);
    $sql = "SELECT x,y FROM z";
    $sth = $dbh->prepare($sql);
    $sth->execute;

    while ( ($x,$y) = $sth->fetchrow() )
    {
            ($n,$a,$b)=CALC;
    }

    $sth->finish;
    $dbh->disconnect;
}
&SELECT;

Получается, что сначала устанавливается соедиинение с базой в
процедуре SELECT, выполняется запрос к БД, и по мере возврата значений,
для каждой строки выполняется процедура CALC, в которой опять же
устанавливается соединение с той же БД и выполняется запрос,
что не есть хорошо...
Как установить один раз соединение с БД и потом просто делать запросы
из разных процедур?


Содержание

Сообщения в этом обсуждении
"perl, два запроса к базе в рамках одного подключения"
Отправлено seller , 09-Окт-06 18:32 
$dbh->connect объявите перед процедурами.
$dbh->disconnect вызывайте после выполнения всей программы.

Или пользуйтесь $dbh->connect_cached.
Описание функций DBI вы найдете по ссылке
http://search.cpan.org/~timb/DBI-1.52/DBI.pm#DBI_Class_Methods


"perl, два запроса к базе в рамках одного подключения"
Отправлено forfreeuse , 13-Окт-06 11:40 
я делал так:

Пишем функции:
---------------

### Connect to db
sub cdb
{
unless($db=DBI -> connect("DBI:mysql:BASE_NAME","LOGIN","PASS"))
   {
    wlog("error", "Can't connect to db: $DBI::errstr",1);
    print_page("error", lmsg("internal_error"));
    exit();
   }
}

### execute sql query and check to error
sub sql
{
  unless($rc=$db->prepare($_[0]))
    {
     wlog("error","Can\'t prepare \"$_[0]\": $DBI::errstr",1);
     print_page("error",lmsg("internal_error"));
    }

  unless($rc->execute)
    {
     wlog("error","Can\'t execute \"$_[0]\": $DBI::errstr",1);
     print_page("error",lmsg("internal_error"));
    }
}

### execute sql another query and check to error
sub sql1
{
  unless($rc1=$db->prepare($_[0]))
    {
     wlog("error","Can\'t prepare \"$_[0]\": $DBI::errstr",1);
     print_page("error",lmsg("internal_error"));
    }

  unless($rc1->execute)
    {
     wlog("error","Can\'t execute \"$_[0]\": $DBI::errstr",1);
     print_page("error",lmsg("internal_error"));
    }
}


Далее в программе:
------------------
cdb();

sql("SELECT lala_topola");

  if ($rc->rows<1)
     {
      wlog("error","Can't get lala_topola");
      exit;
     }

while ($lala_topola=$rc->fetchrow_array)
     {
      sql1("select users);
      if ($rc1->rows!=1)
       {
        ...
       }
     }