Выполнение параметрического запроса с подгружаемыми наборами привязываемых значений (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();