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