2012-04-18 41 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