The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"perl, два запроса к базе в рамках одного подключения"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"perl, два запроса к базе в рамках одного подключения"  
Сообщение от CombatPenguin email(ok) on 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, в которой опять же
устанавливается соединение с той же БД и выполняется запрос,
что не есть хорошо...
Как установить один раз соединение с БД и потом просто делать запросы
из разных процедур?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "perl, два запроса к базе в рамках одного подключения"  
Сообщение от seller on 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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "perl, два запроса к базе в рамках одного подключения"  
Сообщение от forfreeuse email(??) on 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)
       {
        ...
       }
     }

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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