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

6

目前,我在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 运行? - mpapec
@mpapec,我最终采纳了你的建议,现在我的脚本要小得多了。不幸的是,你把它作为评论添加了,而Miller则将其作为答案添加了。因此,我接受了那个答案。你们两个都提出了同样的解决方案,对于我的用例来说非常有效。谢谢。 - slayedbylucifer
2个回答

10

至少,您应该仅迭代您的 SQL 字符串。此外,为您的execute方法添加or die是一个好主意:

至少,您应该只迭代您的 SQL 字符串。此外,为您的execute方法添加or die是一个好主意:

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;
}

2
或者设置RaiseError为true,任何错误都会致命。 - bohica
@Miller。谢谢。我的脚本现在看起来更整洁了。 - slayedbylucifer
2
有一个注意事项,你不应该在那个循环中加上$sth->finish这一行。请参考https://metacpan.org/pod/DBI#finish - DanielST

6

DBD::mysql有一个参数mysql_multi_statements:

从MySQL 4.1开始,可以通过使用此选项启用由分号(;)分隔的多个语句的支持。启用此选项可能会在还启用服务端准备语句时导致问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接