2012-04-18 88 views
0

我确定有更好的方法可以在同一行上做到这一点,但我无法弄清楚,因为我是Perl的初学者。基本上我需要做的是选择,删除和统计结果。在perl DBI上使用多个查询

$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

那么这是什么问题? – 2012-04-18 12:03:22

+0

请相应编辑您的问题.i.e。在上面添加上面的语句,而不是将它放在注释中。 – 2012-04-18 17:40:09

+1

做到了,感谢您的建议。 – 2012-04-19 11:21:16

回答

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

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

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

,你可以使用执行这些功能,并返回选择的结果以及计数,那么你只需要做一个存储过程:

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

顺便说一句,方式你正在使用准备和执行是不可取的。您可以使用prepare来避免在查询中直接使用Perl变量;您的Perl变量应该作为值传递给​​,而不是给予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的数组的引用; $count将包含该结果集中的行数。

+0

'count(env)'在这里可能是错误的东西,它只会计算其中'env'不为空的行,但where子句只允许具有非空env的行有效计算返回的所有行,count (1)'将统计所有返回的行。因此,在这种情况下,两者都会返回相同的结果。但是'count(column)'具有轻微的可移植性问题(某些数据库对'column'为空的行进行了计数),并且在某些数据库上执行会更糟糕。 – 2012-04-18 14:21:42