我对 SQL SELECT 语句返回的行有一个循环,并且在对行的数据进行一些处理之后,我有时想更新行的值。循环体中的处理非常重要,我不能用 SQL 编写它。当我尝试对所选行执行 UPDATE 时,出现错误(在 Perl 的 DBD::SQLite::st 下执行失败:数据库表已锁定)。是否有一种可读、高效且可移植的方式来实现我想要做的事情?如果做不到这一点,是否有 DBD 或 SQLite 特定的方法来做到这一点?
显然,我可以在单独的数据结构中推送更新并在循环后执行它们,但我讨厌代码的照顾。
如果你有兴趣,这里是对应的 Perl 代码。
my $q = $dbh->prepare(q{
SELECT id, confLoc FROM Confs WHERE confLocId ISNULL});
$q->execute or die;
my $u = $dbh->prepare(q{
UPDATE Confs SET confLocId = ? WHERE id = ?});
while (my $r = $q->fetchrow_hashref) {
next unless ($r->{confLoc} =~ m/something-hairy/);
next unless ($locId = unique_name_state($1, $2));
$u->execute($locId, $r->{id}) or die;
}