Выполнение претранслированого запроса с наборами параметров (execute_array)

Назначение
 

Метод execute_array выполняет претранслированный запрос для каждого набора параметров (группы значений), привязанных либо через массив @bind_values, либо через вызов метода bind_param_array, либо через параметр %attr.

Подобно методу execute метод execute_array при успешном выполнении всегда возвращает true независимо от количества наборов привязываемых параметров, даже если их нет. Если при выполнении метода были выявлены ошибки, то в массиве ArrayTupleStatus можно найти дополнительную информацию о том, с каким набором привязанных параметров зафиксирована ошибка.

Метод может возвращать два скалярных значения в зависимости от варианта исполнения метода (скалярный или списочный):

  1. $tuples – количество наборов значений, использованных для привязки параметров;

  2. $rows – общее количество реально обработанных записей при выполнении запроса с данным параметром (или -1, если драйвер не смог определить это значение).

Значения привязываемых параметров могут быть переданы методу тремя способами:

  1. построчно с помощью атрибута ArrayTupleFetch;

  2. по столбцам путем задания привязываемых значений в параметре @bind_values;

  3. по столбцам с помощью предшествующего вызова метода 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();