Выполнение параметрического запроса с подгружаемыми наборами привязываемых значений (execute_for_fetch)
Назначение
Метод execute_for_fetch используется для выполнения каких-либо массовых операций
и часто используется в совокупности с методом execute_array, однако может применяться
и самостоятельно. Основное различие между методами execute_array и
execute_for_fetch в способе привязки параметров: первый метод допускает постолбцовое
или построчное привязывание параметров, а второй – только построчное. Для получения значений привязываемых
параметров метод вызывает специальную подпрограмму, которая и предоставляет требуемый набор значений.
Метод execute_for_fetch вызывает циклически подпрограмму, задаваемую параметром
$fetch_tuple_sub, без передачи ей каких-либо аргументов до тех пор, пока она не вернет значение
false (это означает, что подпрограмма исчерпала предоставление наборов привязываемых значений). Каждый возвращенный
подпрограммой набор подставляемых значений используется для привязки значений с помощью вызова
$sth->execute(@$tuple).
В скалярном варианте исполнения метод execute_for_fetch возвращает либо undef при наличии
ошибок, либо количество наборов значений, использованных им для привязки параметров. Подобно методам execute
и execute_array, метод execute_for_fetch возвращает ноль как "0E0" (false
возвращается в случае ошибки). Для локализации и детализации ошибок, возникших в процессе исполнения метода, служит массив
@tuple_status, в котором содержится информация о том, какие из наборов значений привели к ошибкам. Данный
массив содержит один элемент для каждого набора подставляемых значений. Если метод execute выполнен
успешно, то значение этого элемента совпадает с возвращенным методом execute значением (количество
реально обработанных записей). Если выполнение метода execute завершилось неуспешно, то значением
этого элемента является ссылка на массив c детальной информацией об ошибке ($sth->err, $sth->errstr, $sth->state).
В списочном варианте исполнения метод execute_for_fetch возвращает два скалярных значения:
количество наборов значений, использованных им для привязки параметров, и суммарное количество записей, реально обработанных
SQL-запросом для каждого набора подставленных значений (или -1, если драйвер не смог определить это значение).
Для более эффективного выполнения метода рекомендуется использовать ссылку на набор подставляемых значений ($sth->execute(@$tuple_array_ref)).
Пакет
Package Linter::st
Прототип
$tuples = $sth->execute_for_fetch($fetch_tuple_sub); $tuples = $sth->execute_for_fetch($fetch_tuple_sub, \@tuple_status); ($tuples, $rows) = $sth->execute_for_fetch($fetch_tuple_sub); ($tuples, $rows) = $sth->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
| Параметр | Описание | |
|---|---|---|
$fetch_tuple_sub | Подпрограмма, предоставляющая наборы подставляемых значений | |
\@tuple_status | Ссылка на массив для размещения информации об ошибках |
Возвращаемые значения
| Переменная | Описание | |
|---|---|---|
$tuples | Количество наборов значений, использованных для привязки параметров | |
$rows | Суммарное количество записей, реально обработанных для каждого набора подставленных значений | |
$DBI::errstr | Диагностическое сообщение (в случае ошибки) |
Пример
my $dbh = $drh->connect("DEMO", "SYSTEM", "MANAGER8")
or die "Could not connect to database: " . DBI->errstr;
my $sth_slct = $dbh->prepare("select MODEL, MAKE, YEAR from AUTO;");
$sth_slct->execute();
my $sth_ins = $dbh->prepare(
"insert into AUTO_RESERVE(MODEL, MAKE, YEAR) values (?, ?, ?)");
my $fetch_tuple_sub = sub { $sth_slct->fetchrow_arrayref };
my @tuple_status;
$sth_ins->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
my @errors = grep { ref $_ } @tuple_status;
if (scalar(@errors) > 0)
{
print("errors: " . join(", ", @errors));
}
$sth_slct->finish();
$sth_ins->finish();
$dbh->disconnect();