SQL SELECT 문에 의해 반환 된 행에 루프가 있으며 행 데이터에 대한 일부 처리 후에 때때로 행의 값을 업데이트하려고합니다. 루프의 본문에서 처리하는 것은 간단하지 않으며 SQL로 작성할 수 없습니다. 선택한 행에 대한 UPDATE를 실행하려고하면 오류가 발생합니다 (Perl의 DBD :: SQLite :: st 실행 실패 : 데이터베이스 테이블이 잠김). 할 일을 성취 할 수있는 읽기 쉽고 효율적이며 이식 가능한 방법이 있습니까? DBD 나 SQLite에 특화된 방법이 있습니까?루프에서 SELECT에 의해 반환 된 행을 어떻게 업데이트 할 수 있습니까?
분명히 별도의 데이터 구조로 업데이트를 푸시하고 루프 이후에 업데이트를 실행할 수 있지만 그 후에 코드의 모습을 싫어할 것입니다.
관심있는 사람은 여기에 해당하는 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;
}
당신이 사용하는 perl이 너무 좋지 않을 때, Hibernate는 당신이하고 싶은 일에 완벽 할 것입니다. – Zoidberg
내부적으로는 피하려고하는 비효율적 인 작업을 수행합니다. –
@Zoidberg, 우리는 쓸데없는 말을 줄이지도 못한다. – friedo