The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, 18:32 , 09-Окт-06 (1)
    $dbh->connect объявите перед процедурами.
    $dbh->disconnect вызывайте после выполнения всей программы.

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

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

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

    ### 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)
           {
            ...
           }
         }




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру