|
Программирование >> Программный интерфейс приложений
while ($ary ref = $sth->fetchrow arrayref ()) { $delim = ; for ($1 = 0; $1 < @($ary ref}; $i++) { print $delim . $ary ref->[$i]; $delim = print \n ; Доступ к элементам массива осуществляется с помощью ссылки на массив $ary ref. Для использования механизма указателя здесь применяется нотация $ary ref-> [$i], а не $ary[$i]. Для обращения к массиву можно воспользоваться конструкцией @{$агу ref}. Метод f etchrow arrayref () не подходит для выборки переменных в список. Так, например, такой цикл работать не будет: while (($last name, $first name, $suffix, $email) = @{$sth->fetchrow arrayref ()}) # произвести определенные действия над переменными Пока метод fetchrow arrayref () действительно производит выборку строк, этот цикл функционирует нормально. Но как только строки за-верщаются, fetchrow arrayref () возвращает значение undef, а выражение @{undef} становится ошибочным. (Чтобы бьшо понятно - это аналогично ссылке на пустой указатель в С-программе.) Еше один метод выборки строк fetchrow hashref () работает следующим образом: while ($hashref = $sth->fetchrow nashref ()) { $delim = ; foreach $key (keys (%($hashref}) { print $delim . $hashref->{$key}; $delim = print \n ; Каждый вызов f etchrow hashref () возвращает ссылку на хэш строковых значений или, если строк больше не осталось, значение undef. В этом случае чередование значений столбцов не имеет какого-либо определенного порядка, элементы хэша в языке написания сценариев Perl не следуют в каком-то определенном порядке. Однако элементы хэша имеют ключевые ссьшки на имена столбцов, таким образом $hashref дает одну переменную, с помошью которой можно получить доступ к каждому столбцу по имени. Это позволяет получать значения (или любое их подмножество) в нужном порядке, и совсем не обязательно знать порядок, в котором были выбраны столбцы в запросе SELECT. Например, для получения имени и электронного адреса это можно сделать следующим образом: while ($hashref = $sth->fetchrow hashref О) { $delim = ; foreach $key ( last name , first name , suffix , email ) print $delim . $hashref->{$):ey) ; $delim = , ; print \n ; Процедура f etclirow liasliref {) очень удобна при передаче функции последовательности значений, не зависящих от порядка, в котором столбцы были перечислены в операторе SELECT. В этом случае для выборки строк можно вызвать f etclirow liasliref () и создать функцию, которая получает доступ к хэщу с помощью имен столбцов. Необходимо быть очень внимательным при использовании процедуры f etclirow liasliref () При необходимости экономить каждую секунду метод fetclirow liasliref () не может считаться лучшим рещением, так как он не настолько эффективен, как методы f etctirowarray О или fetchrow arrayref() Имена столбцов, которые здесь используются в качестве ключевых значений в хэще, имеют тот же регистр, что и в операторе SELECT. В СУБД MySQL имена столбцов не реагируют на регистр, таким образом, запрос будет работать независимо от того, в каком регистре написаны имена столбцов. Но ключевые имена хэщ-памяти языка написания сценариев Perl чувствительны к регистру. Это несоответствие может вызвать определенные затруднения в работе. Для того чтобы избежать вероятных проблем несоответствия регистра, можно непосредственно указать fetclirow liasliref () обрабатывать имена в определенном регистре, передав методу атрибуты NAME lc или NAME uc: $hash ref = $sth->fetchrow hashref {NAME lc); # имена в нижнем регистре $hash ref = $sth->fetchrow hashref {NAME uc); # имена в верхнем регистре Сама структура хэща такова, что один элемент содержит одно уникальное имя столбца. Выборка же может содержать объединение нескольких таблиц, имена столбцов которых могут совпадать. В этом случае значение таких столбцов получить невозможно. Например, fetclirow liashref О вернет только один элемент при запросе типа: SELECT а.name, Ь.name FROM а, Ь WHERE а.name = b.name Определение количества строк, возвращаемых запросами Каким образом можно определить количество строк, возвращаемых запросом select или подобным запросом? Конечно, одним способом является подсчет возвращаемых столбцов по мере их выборки. И действительно, это единственный универсальный способ узнать количество строк, возвращаемых запросом select. Пользуясь драйвером СУБД MySQL, после вызова execute () можно вызвать метод rows () с помощью дескриптора оператора, но такой прием неприменим для других баз данных. Более того, даже для СУБД MySQL метод rows () при установленном атрибуте mysql use result не возвращает правильный результат до полной выборки всех строк. (Детальная информация изложена в приложении Ж, Программный интерфейс DBI языка написания сценариев Perl .) Так что можно просто подсчитать количество строк по мере их выборки. Выборка результатов, содержащих одну строку Совсем не обязательно создавать цикл для того, чтобы произвести выборку, заведомо содержащую одну строку. Предположим, что вы собираетесь написать сценарий count menibers, который подсчитывает количество членов Исторической Лиги на данный момент времени. Вот профаммнь[й код, выполняющий такой запрос: # создать запрос $sth = $dbh->prepare ( SELECT COUNT(*) FROM member ); $sth->execute {); # прочесть результаты запроса, a затем очистить память $count = $sth->fetchrow arгay (); $sth->finish ( ) ; $count = трудно судить if [defined ($count); print $count\n ; Оператор select возвращает только одну строку, поэтому здесь нет необходимости в цикле, вызов метода f etchrow array {) производится только один раз. Кроме того, так как производится выборка только одного столбца, нет необходимости присваивать возвращаемое значение массиву. При вызове f etchrow array {) в скалярном контексте (когда ожидается возвращение одного, а не нескольких значений), она возвращает первый столбец строки или значение undef, если строк больще нет. Еще одним типом запроса, для которого ожидается как максимум одна запись, является запрос, содержащий конструкцию limit 1, ограничивающую количество возвращаемых строк одной строкой. Наиболее традиционным применением запросов такого типа является возвращение строки, содержащей максимальное или минимальное значение определенного столбца. Например, вот запрос, который возвращает имя и дату рождения самого молодого президента:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |