在perl DBI上使用多个查询

时间:2012-04-18 11:49:00

标签: sql perl

我确信有更好的方法可以在同一行上执行此操作,但我无法弄清楚如何,因为我是Perl的初学者。基本上我需要做的是选择,删除和计算结果。

$sth = $dbh->prepare("SELECT env,server, mwp.is_reference where env='$ARGV[1]';");
$sth->execute();

$sth2 = $dbh->prepare("delete from mwp.is_info_package where env='$ARGV[1]'");
$sth2->execute();

$sth3 = $dbh->prepare("SELECT count(1) from mwp.is_reference where env='$ARGV[1]'");
$sth3->execute()

目标是如何在同一行使用3个查询,而不是执行3次。

3 个答案:

答案 0 :(得分:2)

那么你可以开始使用占位符('?')。

my @qlist
    = ( 'SELECT env,server FROM mwp.is_reference where env=?'
      , 'DELETE mwp.is_info_package WHERE env=?'
      , 'SELECT count(1) FROM mwp.is_reference where env=?'
      );

然后你可以像这样迭代它们:

my $env = $ARGV[1];

foreach my $query ( @qlist ) { 
    $dbh->prepare( $query )->execute( $env );
    Carp::croak( $dbh->errstr ) if $dbh->err;
}

但当然,你真的想选择两个输出,不是吗?

use Carp qw<croak>;

my $select_query = 'SELECT env,server FROM mwp.is_reference where env=?';
my $delete_query = 'DELETE mwp.is_info_package WHERE env=?';
my $count_query  = 'SELECT count(1) FROM mwp.is_reference where env=?';
my %empty_atts;

my $rows 
    = $dbh->selectall_arrayref( $select_query, \%empty_atts, $env )
    ;
croak( $dbh->errstr ) if $dbh->err;
$dbh->prepare( $delete_query )->execute( $env );
croak( $dbh->errstr ) if $dbh->err;
my ( $count ) 
    = $dbh->selectrow_array( $count_query, \%empty_atts, $env )
    ;
croak( $dbh->errstr ) if $dbh->err;

答案 1 :(得分:0)

我使用以下查询语句解决了问题:

$sth = $dbh->prepare("select env,iserver, ( select count(1)  from is_reference where env='$ARGV[1]' ) as total from is_reference where env='$ARGV[1]'");

不是最优雅的方式,但用较少的线条解决了我的问题。关于删除查询,我移动到另一个条件来检查表是否有数据。

感谢所有。

答案 2 :(得分:-1)

您可以使用执行这些功能的存储过程并返回select和count的结果,然后您只需要这样做:

 my $sth = $dbh->prepare("EXEC procedure_name ?");
 $sth->execute( $ARGV[1] );

顺便说一下,你使用准备和执行的方式是不可取的。您使用prepare来避免在查询中直接使用Perl变量;您的Perl变量应作为值传递给execute(),而不是赋予prepare()的字符串的一部分。这样做有很多很好的理由,包括防止SQL注入攻击。

我还注意到你上一次SQL查询的奇怪之处。我想你可能想要

SELECT count(env) FROM mwp.is_reference where env=?

否则它将始终返回“1”作为计数...同样,除非数据库触发器执行一些有趣的操作,否则您可以将第一个和最后一个查询组合成一个(我将离开count(1)对于这种情况,如果你真的想要的话):

 my $sth = $dbh->prepare('SELECT env,server FROM mwp.is_reference where env=?');
 $sth = $sth->execute( $ARGV[1] );
 my $result_set = $sth->fetchall_arrayref();
 my $count = scalar @{ $result_set };

$result_set将是对包含结果的ARRAY的ARRAY的引用; $count将包含该结果集中的行数。