Как я могу ОБНОВИТЬ строки, возвращенные ВЫБОРОМ в цикле?

Можно создать служебный класс как следующее и использовать его для подавления предупреждения непроверенного.

public class Objects {

    /**
     * Helps to avoid using {@code @SuppressWarnings({"unchecked"})} when casting to a generic type.
     */
    @SuppressWarnings({"unchecked"})
    public static  T uncheckedCast(Object obj) {
        return (T) obj;
    }
}

можно использовать его следующим образом:

import static Objects.uncheckedCast;
...

HashMap getItems(javax.servlet.http.HttpSession session) {
      return uncheckedCast(session.getAttribute("attributeKey"));
}

еще Некоторая дискуссия об этом здесь: http://cleveralias.blogs.com/thought_spearmints/2006/01/suppresswarning.html

5
задан Diomidis Spinellis 20 August 2009 в 12:48
поделиться

3 ответа

Временно включить AutoCommit :

sqlite> .header on
sqlite> select * from test;
field
one
two
#!/usr/bin/perl

use strict;
use warnings;

use DBI;

my $dbh = DBI->connect('dbi:SQLite:test.db', undef, undef,
    { RaiseError => 1, AutoCommit => 0}
);

test_select_with_update($dbh);

sub test_select_with_update {
    my ($dbh) = @_;
    local $dbh->{AutoCommit} = 1;
    my $q = $dbh->prepare(q{SELECT field FROM test});
    my $u = $dbh->prepare(q{UPDATE test SET field = ? WHERE field = ?});
    $q->execute or die;
    while ( my $r = $q->fetchrow_hashref ) {
        if ( (my $f = $r->{field}) eq 'one') {
            $u->execute('1', $f) or die;
        }
    }
}

После запуска кода:

sqlite> .header on
sqlite> select * from test;
field
1
two
6
ответ дан 13 December 2019 в 22:12
поделиться

Ваша проблема в том, что вы используете один и тот же обработчик базы данных для выполнения обновления, пока вы находитесь в цикле выборки.

Так что используйте другой экземпляр обработчика вашей базы данных для выполнения обновлений :

my $dbh = DBI->connect(...);
my $dbhForUpdate = DBI->connect(...) ;

Затем используйте dbhForUpdate в своем цикле:

while(my $row = $sth->fetch()){
   ...
   $dbhForUpdate->do(...) ;
}

В любом случае, я бы не рекомендовал это делать, поскольку велика вероятность того, что вы столкнетесь с проблемами параллелизма на уровне базы данных.

2
ответ дан 13 December 2019 в 22:12
поделиться

Подробнее в ответ на комментарий Зойдберга , но если бы вы смогли переключиться на ORM, например Perl DBIx :: Class , то вы могли бы напишите что-нибудь вроде этого:

my $rs = $schema->resultset('Confs')->search({ confLocId => undef });

while ( my $data = $rs->next ) {
    next unless $data->confLoc =~ m/(something)-(hairy)/;
    if ( my $locId = unique_name_state( $1, $2 ) ) {
        $data->update({ confLocID => $locid });
    }
}

И если DBIx :: Class не привлекает вас, на CPAN есть еще несколько других, например Fey :: ORM и Rose: : DB , например.

2
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: