0

我确信在同一行有更好的方法可以做到这一点,但我无法弄清楚如何,因为我是 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 个。

4

3 回答 3

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;
于 2012-04-18T12:12:43.543 回答
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]'");

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

谢谢大家。

于 2012-04-19T11:29:24.520 回答
-1

您可以使用执行这些功能并返回选择结果和计数的存储过程,然后您只需要执行以下操作:

 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将是对包含结果的 ARRAYRefs 的 ARRAY 的引用;$count将包含该结果集中的行数。

于 2012-04-18T13:18:43.623 回答