我對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 2009-08-20 13:03:20
內部它會執行我試圖避免的低效操作。 – 2009-08-20 13:08:52
@Zoidberg,太糟糕了,我們不能downvote無用的評論。 – friedo 2009-08-20 15:29:48