我确信有更好的方法可以在同一行上执行此操作,但我无法弄清楚如何,因为我是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次。
答案 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
将包含该结果集中的行数。