LINUX.ORG.RU

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


0

0

Имеем такой код:

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, в которой опять же
устанавливается соединение с той же БД и выполняется запрос,
что не есть хорошо...
Как установить один раз соединение с БД и потом просто делать запросы
из разных процедур?

sub CALC {
  my ($sth,$sql,....);
  $sql = "...";
  $sth = $dbh->prepare($sql);
  ....
}

sub SELECT {
  my ($sth,$sql,....);
  $sql = "...";
  $sth = $dbh->prepare($sql);
  ....
}

our $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",$user, $password);

&SELECT;

friday ★★★
()

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

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

# Error was below, spaces between concatenations were omitted
    $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();
}

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($dbh);
    }

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

вот так попробуйте.

Legioner ★★★★★
()
Ответ на: комментарий от Warrior_Of_The_Light

Во-первых у вас там SQL-запрос формировался неправильный (кстати лучше проверяйте код ошибки после выполнения, много нервов сбережёте), во-вторых в моём варианте используется одно подключение.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.