|
Программирование >> Программный интерфейс приложений
$query = SELECT last narae, first narae, birth FROM president ORDER BY birth DESC LIMIT 1 ; $sth = $dbh->prepare ($query); $sth->execute (); # получить результаты запроса и очистить память ($last narae, $first name, $birth) = $sth->fetchrow array (); $sth->finish 0; if ((defined ($last narae) ) print Запрос не дал результатов\п ; else { print Самый молодой президент: $first narae $last name ($birth)\n ; } Др>тими типами запросов, которым не требуется цикт выборки, являются запросы, использующие афегирующие функции МАХ () или MiN () для выборки единственного значения. Но во всех этих случаях существует еще один способ получить результат, состоящий из одной сфоки, - воспользоваться методом selectrow array(), объединяющим возможности методов prepare () , execute () и выборки сфок в одном вызове. Этот метод возвращает массив (а не ссылку на массив) или пустой массив в случае возникновения ощибки. Предыдущий пример можно переписать с помощью метода selectrow array () следующим образом: $query = SELECT last name, first name, birth FROM president ORDER BY birth DESC LIMIT 1 ; $la3t name, $fir3t name, $birth) = Sdbh->selectrow array ($query); f (Idefined ($last name)) print Запрос не дал результатов \n ; print Самый молодой президент: $first name $last name $birth)\n ; Выборка полных результирующих наборов данных Интерфейс DBI не позволяет производить выборку в произвольном порядке и обрабатывать возвращаемые строки в порядке, отличном от того, в котором они поступают. Кроме того, после выборки строки предыдущая выбранная строка будет потеряна, если до этого не будет предпринято щагов для сохранения ее результатов в памяти. Такое положение вещей не всегда удобно по ряду причин. Может потребоваться обработка сфОк в непоследовательном порядке. Предположим, вы хотите провести викторину, основываясь на имеющейся у вас информации о президентах США. Каждый раз вопросы необходимо формулировать в произвольном порядке. Для этого необходимо производить выборку всех строк из таблицы, содержащей информацию о президентах. После этого уже можно варьировать порядок появления вопросов о президентах. Для произвольной выборки строки необходимо иметь доступ ко всем строкам одновременно. Возможно, понадобится только подмножество возвращаемых строк, собранных в произвольном порядке. Например, для того, чтобы сконструировать вопрос о месте рождения президентов и несколько возможных вариантов ответа на него, необходимо сначапа в случайном порядке выбрать президента (и правильный ответ), а затем еще несколько строк для формирования нескольких ложных ответов. Полный результирующий набор может потребоваться, даже если его надо обрабатывать в последовательном порядке. Это необходимо для повторных просмотров строк. Например, при статистических вычислениях сначала необходимо получить общие цифровые свойства данных, а затем просмотреть строки повторно для получения более детального анализа. Получить доступ к результирующему набору как к одному целому можно разными способами. Это можно сделать с помощью обычного цикла выборки, сохраняя каждую строку после выборки. Можно воспользоваться методом, который одновременно возвращает весь результирующий набор. Но в любом случае будет получена матрица, содержащая результирующий набор данных. Элементы матрицы можно обрабатывать в произвольном порядке столько раз, сколько это необходимо. Ниже сравниваются оба эти подхода. Задействовать цикл выборки с целью получить результирующий набор данных можно с помощью метода f etchrow array (), сохраняя при этом ссьшки на строки. Вот исходный текст программы, который производит цикл выборки и печати, аналогичный тому, что представлен в процедуре dump members, за исключением того, что он сначала сохраняет все выбранные строки, а затем для того, чтобы продемонстрировать определение количества строк и столбцов в матрице и осуществление доступа к отдельным ее элементам, распечатывает всю матрицу. ту (Smatrix) = (); # массив ссьшок на массивы while (my @ary = Ssth->fetchrow array ()) # построчная выборка push (Smatrix, ( @ary ]); # сохранить ссылку на только что # выбранную строку Ssth->finish О; # определить размеры матрицы ту (Srows) = scalar (gmatrix); my (Scols) = ($rows == 0 ? 0 : scalar (@{$matrix[0]})); for (my Si = 0; Si < Srows; $i++) # Построчная печать my ($delim) = ; for (my Sj = 0; Sj < Scols; $j++) ( print Sdelim . Smatrix[Si][Sj]; Sdelim = , ; print \n ; При определении размеров матрицы сначала определяется количество столбцов в матрице, потому что число столбцов матрицы обусловлено тем, пуста эта матрица или нет. Если значение переменной $rows равно О, матрица будет пустой и $cols будет тоже равно 0. В противном случае количество столбцов можно вычислить равным количеству элементов в массиве строк, пользуясь синтаксисом § {$matrix [$i] }, позволяющим получить доступ к строке $i. В предьщущем примере мы сначала производили выборку каждой строки, а затем запоминали ссылку на нее. Можно предположить, что гораздо эффективнее сделать вызов fetchrow arrayref (), а не делать непосредственный поиск ссылок на строки: ту (matrix) = (); # массив ссьшок на массив while (my Sary ref = Ssth->fetchrow arrayref ()) ( # это не будет работать! push (I3matrix, Sary ref) ; # запомнить ссылку на только # что выбранную строку Ssth->finish (); Такая конструкция не будет работать потому, что fetchrowarrayref () повторно использует массив, на который ссылается (указывает) ссылка. Полученная матрица будет представлять собой массив ссылок, каждая из которых будет указывать на одну и ту же самую последнюю найденную строку. Поэтому, если необходима построчная выборка, лучще воспользоваться методом fetchrow array(), а не fetchrow arrayref(). В качестве альтернативы использованию цикла выборки можно воспользоваться одним из методов интерфейса DBI, возвращающим весь результирующий набор. Например, метод fetchall arrayref () возвращает массив ссылок, каждый из которых ссылается на содержимое одной строки результирующего набора. Действительно, возвращаемое значение является ссылкой на матрицу. Перед использованием метода fetchallarrayref () вызовите последовательно ргерагеО и execute О, а затем можно выбирать результат следующим образом: ту (Smatrix ref); # ссылка на массив ссьшок $matrix ref = Ssth->fetchall arrayref (); #Быбрать все строки # определить размерность матрицы ту (Srows) = ((defined ($matrix ref) ? О : scalar (I3{$matrix ref}) ) ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |