【发布时间】:2013-09-09 15:12:36
【问题描述】:
我创建了一个 Perl 脚本,该脚本旨在遍历一个数组(满足特定条件的客户的候选名单),使用 system() 执行一个外部命令,然后在操作完成后更新每行中的一个字段.
它适用于第一条记录(即执行外部命令,客户记录更新),但是当它到达第二条记录时,我收到此错误:
DBD::mysql::st fetchrow_array 失败:在 customer_update.pl 上没有 execute() 的 fetch()
通过谷歌搜索,我添加了 $sth->finish();命令,但是无论我是否包含它(如图所示在循环内,或者直接在之后),我仍然得到同样的错误。
谁能帮我解释一下我在这里做错了什么?
摘录如下:
# PERL MYSQL CONNECT()
$dbh = DBI->connect('dbi:mysql:signups', $user, $pw)
or die "Connection Error: $DBI::errstr\n";
# DEFINE A MySQL QUERY
$myquery = "SELECT * FROM accounts WHERE field3 = false";
$sth = $dbh->prepare($myquery);
# EXECUTE THE QUERY
$sth->execute
or die "SQL Error: $DBI::errstr\n";
@records = $sth->rows;
print "Amount of new customers: @records\n\n";
while ( my ($field1, $field2, $field3) = $sth->fetchrow_array() ) {
#execute external command via system();
$update_customer_status = "UPDATE accounts SET field3=true WHERE id=$id";
$sth = $dbh->prepare($update_customer_status);
$sth->execute
or die "SQL Error: $DBI::errstr\n";
print "Customer record modified & MySQL updated accordingly\n\n";
$sth->finish();
}
【问题讨论】:
-
你要调用的外部命令是什么?通常不会执行
select,然后通过单独的update命令更新每个结果,此时您可以轻松地将select 语句中使用的where子句移动到update 语句的where 子句。 -
finish用于当您不想遍历SELECT返回的其余结果时。UPDATE之后就没用了