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