Perl для системного администрирования

       

Использование DBI Вот что следует



Таблица 7.1. DBI-методы получения данных



Имя Возвращает Возвращает, если больше нет записей
fetchrow_arrayref ( ) Ссылка на анонимный массив со значениями, являющимися полями следующей записи undef
fetchrow_array() Массив со значениями, являющимися полями следующей записи Пустой список
fetchrow_hashref ( ) Ссылка на анонимный хэш, ключами которого являются имена полей, а значениями - значения полей следующей записи undef
fetchall_arrayref () Ссылка на массив массивов Ссылка на пустой массив

Посмотрим, как работают эти методы в нашем случае. Для каждого из примеров будем считать, что перед вызовом метода выполнено следующее:

$sth = $dbh->prepare(q{SELECT name,ipaddr,dept from nosts}) or

die "Невозможно подготовить запрос: ".$dbh->errstr." \n":

$sth->execute or die "Невозможно выполнить запрос: ". $dbh-->orr

Вот метод fetchrow_arrayref () в действии:

while (Saref = $sth->fetchrow_arrayref){ print "name: " .

$aref~>[0] . "\n"; print "ipaddr: " . $aref->[1] . "\n";

print "dept: " . $aref->[2] . "\n":

А теперь рассмотрим «удобный» метод fe*chall_array"of (). Он загружает весь полученный результат в одну структуру данных, возвращая ссылку на массив ссылок. При использовании данного метода будьте осторожны и учитывайте размер запросов, поскольку результаты целиком считываются в память. Если размер результата равен 100 Гбайт, это может вызвать проблемы.

Каждая ссылка выглядит точно так же, как и результат вызова метода fetchrow_an ayref ().

Вот какой код выводит результат запроса целиком:

$aref_aref = $sth->fetchall_arrayref;

foreach $rowref (@$aref_aref){

print "name: " . $rowref->[0] . "\n";

print "ipaddr: " . $rowref->[1] . "\n";

print "dept: " . $rowref->[2] . "\n";

print '-'x30."\n": }

Этот пример применим только к конкретному набору данных, поскольку предполагается, что количество полей фиксировано и они следуют в определенном порядке. Например, считается, что имя машины возвращается в первом поле запроса ($rowref->[0]).

Можно переписать предыдущий пример и сделать его более общим, если использовать атрибуты (часто называемые метаданными) дескриптора команды. В частности, если после запроса посмореть на $sth->{NUM_OF_FIELDS}, то можно узнать количество полей в полученных данных. $sth->{NAME} содержит ссылку на массив названий полей.

Обязательно изучите документацию по DBI, чтобы подробно узнать об остальных метаданных.

Шаг 5: Закройте соединение с сервером

С DBI это очень просто сделать:

сообщаем серверу, что данные из дескриптора команды больше

и не нужны (необязательно, т. к. мы собираемся завершить

# соединение)

$sth->finish;

ft разорвать соединение дескриптора с базой данных

$dbh->disconnect;

Что еще надо сказать о DBI

Осталось еще две темы, которые стоит обсудить, прежде чем переходить к ODBC. Во-первых, это набор методов, которые я называю «удобными» (shortcut methods). Методы, приведенные в табл. 7.2, объединяют перечисленные шаги 3 и 4.



Содержание раздела