Perl + DBI + MySQL:如何运行多个查询/语句

sla*_*fer 4 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;
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.

但是,我有大约50多个这样的查询.所以你可以想象上面这些线的大小.我上面粘贴的只是5个查询.

题:

是否有更好的方式来运行多个MySQL查询/语句Perl DBI

Mil*_*ler 9

至少,你应该迭代你的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;
}
Run Code Online (Sandbox Code Playgroud)

  • 或者只是设置RaiseError为true,任何错误都会消失. (2认同)
  • 请注意,该循环中不应该包含“$sth->finish”行。请参阅 https://metacpan.org/pod/DBI#finish (2认同)

小智 6

DBD :: mysql有一个参数mysql_multi_statements:

从MySQL 4.1开始,可以使用此选项启用对以分号(;)分隔的多个语句的支持.如果还启用了服务器端预准备语句,则启用此选项可能会导致问题.