2014-03-28 65 views
2

目前,我在MYSQL上運行多個語句如下;Perl + DBI + MySQL:如何運行多個查詢/語句

my $sth1 = $dbh->prepare("ALTER TABLE whatever...."); 
my $sth2 = $dbh->prepare("UPDATE whatever...."); 
my $sth3 = $dbh->prepare("ALTER TABLE whatever...."); 
my $sth4 = $dbh->prepare("DROP TABLE whatever...."); 
my $sth5 = $dbh->prepare("DROP TABLE whatever...."); 


$sth1->execute; 
$sth1->finish; 
$sth2->execute; 
$sth2->finish; 
$sth3->execute; 
$sth3->finish; 
$sth4->execute; 
$sth4->finish; 
$sth5->execute; 
$sth5->finish; 

此代碼正常工作。

但是,我有大約50多個這樣的查詢。所以你可以想象以上幾行的大小。我上面粘貼的只是5個查詢。

問:

是否有運行使用Perl DBI多個MySQL查詢/報表更好的優雅的方式?

+2

把你的SQL查詢放入數組並運行foreach? –

+0

@mpapec,我結束了你的建議,現在我的腳本更小了。不幸的是,你將它添加爲評論,Miller將其添加爲答案。因此我接受了這個答案。你們倆都提出了同樣的解決方案,這對我的使用情況非常有用。謝謝。 – slayedbylucifer

回答

7

至少,你應該只是迭代你的SQL字符串。也將是一個好主意,or die添加到您的execute方法:

my @sql = (
    q{ALTER TABLE whatever....}, 
    q{UPDATE whatever....}, 
    q{ALTER TABLE whatever....}, 
    q{DROP TABLE whatever....}, 
    q{DROP TABLE whatever....}, 
); 

for (@sql) { 
    my $sth = $dbh->prepare($_); 
    $sth->execute or die $dbh->errstr; 
    $sth->finish; 
} 
+2

或者只是將RaiseError設置爲true,並且任何錯誤都會消失。 – bohica

+0

@Miller。謝謝。我的腳本現在看起來很整潔。 – slayedbylucifer

+1

有一點需要注意的是,在循環中不應該有'$ sth-> finish'這一行。請參閱https://metacpan.org/pod/DBI#finish – slicedtoad

4

DBD :: MySQL有一個參數mysql_multi_statements:

MySQL 4.1中,對多個語句支持由分離分號(;)可以通過使用此選項啓用。如果啓用了服務器端預處理語句,則啓用此選項可能會導致問題。