Выполнение претранслированого запроса с наборами параметров (execute_array)
Назначение
Метод execute_array
выполняет претранслированный запрос для каждого набора параметров (группы значений), привязанных либо через массив @bind_values
, либо через вызов метода bind_param_array
, либо через параметр %attr
.
Подобно методу execute
метод execute_array
при успешном выполнении всегда возвращает true независимо от количества наборов привязываемых параметров, даже если их нет. Если при выполнении метода были выявлены ошибки, то в массиве ArrayTupleStatus
можно найти дополнительную информацию о том, с каким набором привязанных параметров зафиксирована ошибка.
Метод может возвращать два скалярных значения в зависимости от варианта исполнения метода (скалярный или списочный):
-
$tuples
– количество наборов значений, использованных для привязки параметров; -
$rows
– общее количество реально обработанных записей при выполнении запроса с данным параметром (или-1
, если драйвер не смог определить это значение).
Значения привязываемых параметров могут быть переданы методу тремя способами:
-
построчно с помощью атрибута
ArrayTupleFetch
; -
по столбцам путем задания привязываемых значений в параметре
@bind_values
; -
по столбцам с помощью предшествующего вызова метода
bind_param_array
.
Если количество элементов в массиве привязываемых значений меньше количества привязываемых столбцов, то столбцы, для которых нет соответствующих значений в массиве привязываемых значений, получают undef-значения.
Атрибут ArrayTupleFetch
позволяет задать функцию (подпрограмму), которая будет поставщиком привязываемых значений для каждого выполнения запроса. Для удобства атрибут может быть использован для указания обработчика, выполняющего вызов метода fetchrow_arrayref
для привязки значений к каждому обрабатываемому запросу.
Атрибут ArrayTupleStatus
может быть использован для указания ссылки на массив, в котором будут содержаться результаты выполнения запросов с каждым набором привязанных параметров. Каждый элемент массива, соответствующий порядковому номеру набора привязанных данных, может содержать следующие данные:
-
количество реально обработанных записей с привязанными значениями;
-
-1, если драйвер не смог определить количество реально обработанных записей;
-
ссылку на массив, содержащий значения
err
,errstr
иstate
, установленные при неуспешном выполнении.
Пакет
Package Linter::st
Прототип
$tuples = $sth- >execute_array(\%attr); $tuples = $sth- >execute_array(\%attr, @bind_values); ($tuples, $rows) = $sth- >execute_array(\%attr); ($tuples, $rows) = $sth- >execute_array(\%attr, @bind_values);
Параметр | Описание | |
---|---|---|
\%attr | Массив с атрибутами для указания дополнительных инструкций по выполнению метода. Возможные атрибуты: ArrayTupleFetch и ArrayTupleStatus (см. выше описание метода) | |
@bind_values | Массив элементов, каждый из которых является набором значений привязываемых к запросу параметров |
Возвращаемые значения
Переменная | Описание | |
---|---|---|
$tuples | Количество наборов значений, использованных для привязки параметров, при отсутствии наборов значений – "0E0" | |
$rows | Общее количество реально обработанных записей при выполнении запроса с данным параметром (или -1 , если драйвер не смог определить это значение) | |
$DBI::errstr | Диагностическое сообщение (в случае ошибки) |
Пример
my $dbh = $drh- >connect("DEMO", "SYSTEM", "MANAGER8") or die "Could not connect to database: " . DBI- >errstr; my @int_vals = (123, 345, 678); my @str_vals = ("first", "second", "third"); $dbh- >do("create or replace TEST_TABLE (int_col int, varchar_col varchar(16));"); my $sth = $dbh- >prepare("insert into TEST_TABLE values (?, ?);"); my $tuples = $sth- >execute_array({ ArrayTupleStatus = > \my @tuple_status }, \@int_vals, \@str_vals, ); if (!$tuples) { for my $tuple (0..@tuple_status - 1) { my $status = $tuple_status[$tuple]; $status = [0, "Skipped"] unless defined $status; next unless ref $status; printf("Failed to insert (%s, %s): %s\n", $int_vals[$tuple], $str_vals[$tuple], $status- >[1]); } } $sth- >finish(); $dbh- >disconnect();