Имеем такой код: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, в которой опять же
устанавливается соединение с той же БД и выполняется запрос,
что не есть хорошо...
Как установить один раз соединение с БД и потом просто делать запросы
из разных процедур?
$dbh->connect объявите перед процедурами.
$dbh->disconnect вызывайте после выполнения всей программы.Или пользуйтесь $dbh->connect_cached.
Описание функций DBI вы найдете по ссылке
http://search.cpan.org/~timb/DBI-1.52/DBI.pm#DBI_Class_Methods
я делал так:Пишем функции:
---------------### 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)
{
...
}
}