DBI-заполнители потрясающие. Они светятся, когда вам нужно выполнить один и тот же запрос в цикле. Учтите это:
my $dbh = DBI->connect(...);
my $name_pairs = get_csv_data("data.csv");
my $sth = $dbh->prepare("INSERT INTO t1 (first_name, last_name) VALUES (?,?)");
for my $pair (@$name_pairs) {
unless ($sth->execute(@$pair)) {
warn($sth->errstr);
}
}
В этом случае удобнее иметь подготовленный дескриптор оператора.
Однако, за исключением случаев подобного рода замкнутых циклов, мне нравится видеть фактическое утверждение, которое было отправлено на сервер. Вот где я сильно опираюсь на цитаты и откровенно бегу.
# Here, I am confident about the hash keys, less so about the values
$sql = sprintf("INSERT INTO t1 (%s) VALUES (%s)",
join(",", keys(%hash)),
join("," map { $dbh->quote($_) } values(%hash))
);
$sth = $dbh->prepare($sql);
unless ($sth->execute) {
warn($sth->{Statement});
}
Обратите внимание, что вам нужно установить RaiseError => 0 в $ dbh, чтобы вы могли видеть SQL, который не прошел, но это помогло мне в прошлом.
Приветствие.