Портал для веб-мастера

Инструменты для Бизнеса

Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Программирование для Web » PERL/CGI

Справочник по Perl:DBI для mSQL/mySQL

Установка

Для использования интерфейсов rnSQL и MySQL к модулям DataBase Dependent/DataBase

Independent (DBI/DBD) или MsqlPerl и MysqlPerl необходимо иметь следующие компоненты :

Perl 5

В вашей системе должны быть установлены работающие экземпляры Perl 5. Ко времени

написания этой книги последний релиз Perl имел номер 5.005_02. Следует пользоваться по

меньшей мере Perl 5.004, поскольку в более ранних версиях были ошибки , связанные с

защитой . Более подробные сведения о Perl, включая адреса для загрузки , можно найти по адресу :

http://www.perl.com.

DBI

Независимую от базы данных часть модуля DBI/DBD можно загрузить из Comprehensive Perl

Archive Network (CPAN). На момент написания книги последней версией был DBI-0.90. Он

находится на http://www.perl.com/CPAN/authors/id/TIMB/DBI/DBI-l.06.tar.gz.

Data::ShowTable

Модуль Data::ShowTable упрощает отображение больших объемов данных . Это требуется для

модулей Msql-MysqL Последняя версия — Data-ShowTable-З ., ее можно найти по адресу : http://

www.perl.com/CPAN/authors/id/AKSTE/Data-ShowTable-3.3.tar.gz.

mSQL и / MySQL

В главе 3 «........... » подробно рассказано о том , как получить и установить серверы баз

данных mSQL и MySQL.

компилятор С и сопутствующие средства

Для модулей MsqlPerl и MysqlPerl необходим ANSI-совместимый компилятор С , а также

обычные сопутствующие средства , такие как make, Id и т . д . Вам должно хватить тех средств , с

помощью которых вы собрали Perl. Если у вас нет этих инструментов , компилятор GNU С и все

необходимые поддерживающие программы можно бесплатно получить на ftp://ftp.gnu.org/pub/gnu/.

В настоящее время модули Msql-Mysql поддерживает Йохен Видман (Jochen Wiedmann), чье ID в CPAN

выглядит как JWIED. Поэтому текущие модули Msql-Mysql всегда можно найти на http://www.perl.com/

authors/id/JWIED. На момент написания книги текущей версией была Msql-Mysql-modules-1 .20 7.tar.gz.

После загрузки пакета разархивируйте его :

tar xvzf Msql-Mysql-modules-1.2017.tar.gz cd Msql-Mysql-modules-1.2017

В каталоге дистрибутива есть файл INSTALL, содержащий несколько советов по установке . Сначала

нужно выполнить файл Make file.PL:

perl Makefile.PL

Эта команда сначала спрашивает , желаете ли вы установить модули для mSQL, MySQL или те и

другие . Можно установить модули для любого установленного вами сервера баз данных .

После проверки системы программа запрашивает местоположение установки mSQL. Это каталог ,

содержащий подкаталоги lib и include, в которых расположены библиотеки и включаемые

файлы mSQL. По умолчанию этим каталогом является /usr/local/Hughes, но обязательно

проверьте это , поскольку во многих системах используется /usr/local или даже /usr/local/Minerva.

Затем сценарий установки запрашивает путь к MySQL. Как и в случае mSQL, это каталог ,

содержащий надлежащие подкаталоги lib и include, по умолчанию - /usr/local. Это расположение

верно для большинства установок , но следует обязательно проверить , не используются ли другие

каталоги ..После установки сценарий создает соответствующие make-файлы и завершается . Затем нужно

запустить make и скомпилировать файлы .

make

Если вы правильно установили Perl, mSQL и / MySQL, то команда make должна пройти без

ошибок . После завершения ее работы будут созданы все модули , и единственное , что останется -

это протестировать и установить их .

make test

Во время выполнения по экрану пробегает ряд отладочных имен , за каждым из которых должно

следовать . . . ok. И наконец , нужно установить модули .

make install

У вас должно быть разрешение записи в каталог установки Perl. Кроме того , необходимо иметь

разрешение на запись в системный каталог для программ (........... /usr/local/bin или /usr/bin), чтобы

установить поставляемые с модулем вспомогательные программы pmsql, pmysql и dbimon.

DBI.pm API

DBI API является стандартным API баз данных в Perl. Поэтому , хотя MsqPerl и MysqlPerl могут быть

более распространены в унаследованных программах , новые программы следует писать с

использованием DBI.

use

use DBI;

Следует объявлять во всех программах Perl, использующих модуль DBI.

DBI::available_drivers

@available_drivers = DBI->available_drivers;

@available_drivers = DBI->available_drivers($quiet);

DBI::available_drivers возвращает список имеющихся драйверов DBD. Функция выполняет это ,

осуществляя поиск модулей DBD в дистрибуции Perl. Если в аргументе не передано значение true, то

при обнаружении двух одноименных модулей DBD выводится предупреждение . В текущем

дистрибутиве Msql-Mysql драйвер для mSQL называется 'mSQL', а драйвер для MySQL - 'mysq'.

Пример

use DBI;

my @drivers = DBI->available_drivers;

print " Доступны следующие драйверы :\n" . join("\n",@drivers) . "\n Но нас интересуют только mSQL и mysql. :)\n";

DBI::bind_col

$result = $statement_handle->bind_col($col_num, \$c61_variable, \%unused);

DBI::bind_col связывает колонку команды SELECT с переменной Perl. При всяком чтении или изменении

колонки изменяется значение соответствующей переменной . Первым аргументом является номер колонки

в команде , при этом колонки нумеруются с 1 . Второй аргумент - ссылка на переменную Perl, которая

должна быть привязана к колонке . Необязательный третий аргумент ссылается на хэш атрибутов . В DBD:

:mysql и DBD: :mSQL он не используется . При невозможности в силу каких -......причин сделать привязку

функция возвращает неопределенное значение undef .

Пример

use DBI;

my $db = DBI->Gonnect(1 DBI:mSQL:mydata',undeffundef);.my $query = "SELECT name, date FROM myothertable";

my $myothertable_output = $db->prepare($query);

my ($name, $date);

$nyothertable_output->bind_col(1,\$name, undef);

$myothertable_output->bind_col(2A$date, undef);

# Теперь $name и $date привязаны к соответствующим полям выходных данных ,

$myothertable_output->execute;

while ($myothertable_output->fetch) {

# Каждый раз $name и $date автоматически изменяются ,

print " Имя : $name Дата : $date\n";

}

DBI::bind_columns

$result = $statement_handle->bind_columns(\%unused, @list_of_refs_to_vars);

DBI::bind_columns привязывает весь список скалярных ссылок к значениям соответствующих полей в выдаче .

Первый аргумент функции - ссылка на хэш атрибутов , как в DBI::bind_col . DBD::mSQL и DBD::mysql не

используют этот аргумент . Последующие аргументы должны быть ссылками на скаляры . Скаляры можно с

таким же успехом группировать в структуру \($var , $var2) . Ссылок на скаляры должно быть ровно столько ,

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

Пример

use DBI;

my $db = DBI->connect('DBI:mSQL:mydata', undef, undef);

my .Squery - "SELECT name, date FROM myothertable";'

my $myothertable_output = $db->prepare($query);

my ($name, $date);

$myothertable_output->bind_colufnns(undef, \($name, $date));

# $name и $date теперь привязаны к соответствующим полям в выдаче .

$myothertable_output->execute;

while ($myothertable_output->fetch) {

# $name и $date каждый раз автоматически изменяются ,

print " Имя :$пате Дата : $date\n";

}

DBI::bind_param

$result = $statement_handle->bind_param($param_number, $bind_value);

$result = $statement_handle->bind_param($param_number, $bind_value, $bind_type);

$result = $statement_handle->bind_param($param_numberj $bind_value, \%bind_type);

DBI: :bind_param подставляет в команды действительные значения вместо меток -......*?' (. DBI: :

prepare). Первый аргумент — номер метки -......в команде , нумерация начинается с 1 ( напра -.......). Второй аргумент - подставляемое значение . Необязательный третий аргумент задает тип

подставляемого значения . Это может быть скаляр или ссылка на хэш вида { TYPE => &DBI: :SQL_TYPE }

, где 'SQL_TYPE' - тип параметра . На момент написания этой книги DBI поддерживал SQL-типы

(........... ) SQL_CHAR, SQL_NUMERIC, SQL_DECIMAL, SQL_INTEGER,

SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE и SQL_VARCHAR.. Соответствие их

фактическим типам , используемым DBD::mSQL и DBD::Mysql, не документировано . Тем не менее в

таблице 2 - приведен список соответствия на данный момент . Если подстановка невозможна , функция

возвращает undef.

Таблица1 . Соответствие типов SQL

DBI MSQL MySQL

SQL_CHAR CHAR TYPE

IDENT_TYPE

FIELD_TYPE_CHAR

FIELD_TYPE_DATE.NULL_TYPE

DATE_TYPE

MONEY_TYPE

TIME_TYPE

IDX_TYPE

SYSVAR_TYPE

ANY_TYPE

FIELD TYPE_DATETIME

FIELD TYPE_NULL

FIELD__TYPE_TIMESTAMP

FIELD TYPE_TIME

SQL_NUMERIC FIELD_TYPE_LONG

FIELD_TYPE _LONGLONG

FIELD_TYPE_SHORT

SQL_DECIMAL FIELD_TYPE_DECIMAL

SQL_INTEGER INT_TYPE FIELD_TYPE_INT24

SQL_ SMALLINT UINT_TYPE FIELD_TYPE_INT24

SQL_FLOAT FIELD_TYPE_FLOAT

SQL_REAL REAL TYPE

LAST_REAL_TYPE

FIELD_TYPE_DOUBLE

SQL_DOUBLE FIELD_TYPE_DOUBLE

SQL_VARCHAR TEXT_TYPE FIELD_TYPE_TINY_BLOB

FIELD_TYPE_MEDIUM_BLOB

FIELD_TYPE_BLOB

FIELD_TYPE_LONG_BLOB

FIELD_TYPE_VAR_STRING

FIELD_TYPE_STRING

Пример

use DBI;

my $db = DBI->connect('DBD:msql:mydata', 'me', 'mypass');

my Sstatement = $db->prepare(

"SELECT name, date FROM myothertable WHERE name like ? OR name like ?");

$statement->bind_param(1I 1 J%', 'SQL_CHAR');

$statement->bind_param(2,'%oe%', { TYPE => &DBI::SQL_CHAR });

# Теперь команда будет такой :

# SELECT name, date FROM myothertable WHERE name like 'J%' or name like %oe%

DBI::connect

$db = DBI->connect($data_source, $username, $password);

$db = DBI->connect($data_source, Susername, $password, \%attributes);

DBI::connect требует по крайней мере три аргумента и необязательный четвертый . Через возвращаемый

описатель выполняются все операции с сервером базы данных . Первый аргумент является источником

данных . Список имеющихся источников можно получить с помощью DBI::data_sources . Для mSQL и

MySQL формат источника данных 'DBI:mSQL:$database:$hostname:$ро rt' и

'DBI:mysql:$database:$hostname:$port' соответственно . Можно опустить :$port при соединении через стан -

порт . Аналогично можно опустить : $hostname; $port при соединении с сервером на локальном узле

с помощью сокета Unix. Имя базы данных указывать обязательно .

Второй и третий аргументы - имя пользователя и пароль для подключения к базе данных . Для mSQL оба

аргумента должны иметь значение 'undef'. Если они заданы как 'undef' при работе с MySQL, то у

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

Последний аргумент необязателен и является ссылкой на ассоциативный массив . Данный хэш позволяет

определить некоторые атрибуты соединения . В настоящее время поддерживаются только атрибуты

PrintError, RaiseError и AutoCommit. Для сброса им нужно придать значение 0, для установки - какое -.......истинное значение . По умолчанию PrintError и AutoCommit включены , a RaiseError - сброшен . Поскольку в

данное время ни mSQL, ни MySQL не поддерживают транзакции , атрибут AutoCommit должен быть установлен

(......подробно см . Атрибуты ).

При неудаче соединения возвращается неопределенное значение undef, и в $DBI: errstr помещается ошибка ..

Пример

use DBI;

my $db1 = DBI->connect('DBI:mSQL:mydata',undef,undef);

# Теперь $db1 представляет соединение с базой данных 'mydata' на локальном # сервере mSQL.

my $db2=DBI-> connect ('DBI:mysql:mydata:myserver.com','me','mypassword');

# Теперь $db2 представляет соединение с базой данных 'mydata1 сервера MySQL

# 'myserver.com' через порт по умолчанию .

# При соединении использовались имя пользователя 'me' и пароль 'mypassword'.

my $db3 =. DBI->connect('DBI:mSQL:mydata',undef,undef,{RaiseError => 1});

# Теперь $db3 - такое же соединение , как $db1, за исключением того , что # установлен атрибут 'RaiseError'.

DBI::data_sources

@data_sources = DBI->data_sources($dbd_driver);

DBI::data_sources принимает в качестве аргумента имя модуля DBD и возвращает все имеющиеся для этого

драйверы базы данных в формате , пригодном к использованию в качестве источника данных функцией

DBI:::connect . Программа заканчивает свое выполнение с ошибкой , если задано неверное имя драйвера DBD.

В текущих версиях модулей Msql-Mysql драйвер для mSQL называется 'mSQL', а для MySQL-'mysql'.

Пример

use DBI;

my @msql_data_sources = DBI->data_sources('mSOL');

my @mysql_data_sources - DBI~>data_sources('mysql');

# Должны быть установлены DBD::mSQL и DBD::mysql, иначе # выполнение программы прекратится .

print "mSQL databases:\n" . join("\n",@msql_data_sources) , "\n\n";

print "MySQL databases:\n" . join("\n"I@mysql_data_sources) . "\n\n";

DBI::do

$rows_affected = $db->do($statement);

$rows_affected = $db->do($statement, \%unused);

$rows_affected = $db->do($statement, \%unused, @bind_values);

DBI::do непосредственно выполняет SQL-команду , не являющуюся командой SELECT, и возвращает число

измененных строк . Этот способ быстрее , чем пара DBI::prepare/DBI::execute, требующая два вызова функции .

Первый аргумент - сама команда SQL. Второй аргумент не используется в DBD::mSQL и DBD::mysql, но для других

модулей DBD может содержать ссылку на хэш атрибутов . Последний аргумент - массив значений для

подстановки в команду вместо меток - '?'. Подстановка происходит слева направо . Дополнительно

DBI::do автоматически заключит подставляемые строковые значения в кавычки .

Пример

use DBI;

my $db = DBI->connect('DBI:mSGL:mydata',undef,undef);

my $rows_affected =

$db->do("UPDATE mytable SET name-'Joe' WHERE name-'Bob'");

print "$rows_affected Joe заменены на Bob's\n";

my $rows_affected2 =

$db->do("INSERT INTO mytable (name) VALUES (?)", {},'("Sheldon's Cycle"});

# После заключения в кавычки и подстановки # серверу базы данных посылается команда
#INSERT INTO mytable (name) VALUES ('Sheldon's Cycle').

DBI::disconnect

$result = $db->disconnect;

DBI::disconnect отсоединяет описатель базы данных от сервера баз данных . Для mSQL и MySQL в этом обычно

нет необходимости , поскольку эти базы данных не поддерживают транзакций , и неожиданное отсоединение

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

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

перед выходом . При ошибке во время отсоединения возвращается ненулевое значение , и в $DBI::ег rst

устанавливается ошибка .

Пример

use DBI;

my $db1 = DBI->connect('DBI:mSQL:mydata", undef, undef);

my $db2 = DBI->connect('DBI:mSQL:mydata2',undef,undef);

$db1->disconnect;

# Соединение 'mydata' разорвано . Соединение с 'mydata2'

# продолжает действовать .

DBI::dump_results

$neat_rows = DBI::dump_results($statenent_handle);

$neat_rows = DBI:dump_results($statement_handle, $niaxlen);

$neat_rows = DBI::dump_results($'statement_handle, $maxlen, $line_sep);

$neat_rows - DBI::dump_results($statenient_handle, $maxlen, $line_sep, $field_sep);

$neat_rows = DBI::dump_results($statement_handle, $maxlen, $line_sep, $f i el d_sep, $f i l e_handle);

DBI:::dump_results выводит содержание описателя команды в удобном и упорядоченном виде , применяя к

каждой строке DBI::neat_string. Функцию удобно использовать для быстрой проверки результатов за -.......во время разработки программы . Единственный обязательный аргумент - описатель команды .

Второй аргумент , если имеется , задает максимальный размер полей в таблице , по умолчанию равный 35.

Третий аргумент задает строку , используемую для разграничения строк данных , по умолчанию - \.

Четвертый аргумент задает строку , используемую для разделения значений полей в строке , по умолчанию

используется запятая . Последний аргумент задает ссылку на глобальный описатель файла , в который

выводятся результаты . По умолчанию это STDOUT. Если невозможно прочесть описатель команды ,

возвращается значение undef.

Пример

use DBI;

my $db = DBI->connect( 'DBI:mSQL:mydata', undef, undef);

my $query = "SELECT name, date FROM myothertable";

my $myothertable_output = $db->prepare($query);

$myothertable_output->execute;

print DBI::dump_results($myothertable_output);

# Вывести результаты в аккуратной таблице .

open (MYOTHERTABLE, "myothertable");

print DBI::dump_results($myothertable_output, undef, undef, undef, \*MYOTHERTABLE);

# Снова вывести результаты в файл 'myothertable'.

$DBI::err

$error_code = $handle->err;

$DBI::e r r возвращает код последней по времени ошибки DBI. Код ошибки соответствует сообщению об

ошибке , возвращаемому функцией $DBI::errstr . Переменная $DBI::err выполняет ту же задачу . Эта функция

применима с описателями как баз данных , так и команд ..

Пример

use DBI;

my $db = DBI->connect('DBI:mysql:mydata','webuser','super_secret_squirrel');

# Этот запрос имеет синтаксическую ошибку ...

my $output = $db->prepare('SLECT * from mydata');

$output->execute;

if (not $output) {

print "Error $DBI:err: $DBI:errstr\n";

}

$DBI::errstr

$error = $handle->errstr;

Эта функция возвращает сообщение о последней происшедшей ошибке DBI. Значение сохраняется до

возникновения новой ошибки , когда оно будет заменено . Если во время данного сеанса ошибок не было ,

функция возвращает undef. Переменная $DBI::errstr выполняет ту же задачу . Эта функция применима с

описателями как баз данных , так и команд .

Пример

Use DBI;

my $db = DBI->connect('DBI:mysql:mydata','webuser','super_secret_squirrel');

my $error = $db->errstr;

warn ("Вот последняя ошибка DBI: $error");

DBI::execute

$rows_affected = $statement_handle->execute;

$rows_affected = $statement_handle->execute(@bind_values);

DBI::execute выполняет SQL-команду , содержащуюся в описателе команды . Для запроса , не являющегося

SELECT, функция возвращает число измененных строк . Функция возвращает -, если число строк неиз -........ Для запроса типа SELECT при успехе возвращается истинное значение . Если заданы аргументы , они

используются для подстановки имеющихся в команде меток - (. DBI:::p r epar e).

Пример

use DBI;

my $db = DBI->connect('DBI:mSQL:mydata',undef,undef);

my $statement_handle = $db->prepare("SELECT * FROM mytable");

my $statementjiandle2 = $db->prepare("SELECT name, date FROM myothertable

WHERE name like ?");

$statement_handle->execute;

# Выполнена первая команда . К значениям можно # обращаться через описатель .

$statement_handle->execute("J%");

# Выполнена вторая команда следующего содержания :

# SELECT name, date FROM myothertable WHERE name like 'J%'

DBI::fetchall_arrayref

$ref_of_array_of_arrays = $statement_handle->fetchall_arrayref;

DBI::fetchall_arrayref возвращает все оставшиеся данные в описателе команды в виде ссылки на

массив . Каждая строка массива - ссылка на другой массив , в котором содержатся данные этой строки .

Если в описателе команды нет данных , функция возвращает неопределенное значение undef. Если с

этим описателем команды уже выполнялись функции DBI: :fetchrow_ *, то DBI: :fetchall_arrayref

возвращает все данные , оставшиеся после последнего обращения к DBI: : fetchrow_ *..

Пример

use DBI;

my $db = DBI->connect('DBI:mSQL:mydata',undef,undef);

my $query = "SELECT name, date FROM myothertable";

my $output = $db->prepare($query);

$output->execute;

my $data = $output->fetchall_arrayref;

# Теперь $data является ссылкой на массив массивов . Каждый элемент #' главного ' массива сам является ссылкой на массив , содержащий строку данных .

print " Четвертой строкой данных в таблице является : " , $data->[3][1] . "\п ";

# Элемент 3 ' главного ' массива является массивом , содержащим четвертую # строку данных .

# Элемент 1 этого массива является датой .

DBI::fetchrow_array

@row_of_data = $statement_handle->fetchrow;

DBI : :fetchrow возвращает очередную строку данных из описателя команды , созданного DBI: :execute .

Каждое последующее обращение к DBI : :fetchrow возвращает очередную строку данных . Когда данных

больше нет , функция возвращает неопределенное значение u n d e f . Порядок элементов в результирующем

массиве определяется исходным запросом . Если запрос имел вид SELECT * FROM . . . , то элементы следуют в

том порядке , в котором они были определены в таблице .

Пример

use DBI;

my $db = DBI->connect('DBI:mSQL:mydata',undef,undef);

my $query = "SELECT name, date FROM myothertable WHERE name LIKE 'Bob%'";

my $myothertable_output = $db->prepare($query).;

$myothertable_output->execute;

my ($name, $date);

# Это первая строка из $myothertable_output.

($name, $date) = $myothertable_output->fetchrow_array;

# Это следующая строка ...

($name, $date) = $myothertable_output->.fetchrow_array;

# И еще одна ...

my @name_and_date = $myothertable_output->fetchrow_array;

# ит . д ...

DBI::fetchrow_arrayref,

DBI::fetch

$array_reference = $statement_handle->fetchrow_arrayref;

$array_reference = $statement_handle->fetch;

DBI::fetchrow_arrayref и ее псевдоним DBI:::fetch работают точно так же , как DBI::fetchrow_array , но

возвращают не фактический массив , а ссылку на него .

Пример

use DBI;

my $db = DBI->connect('DBI:mSQL:mydata',undef,undef);

my $query = "SELECT name, date FROM myothertable WHERE name LIKE 'Bob%'";

my $myothertable_output - $db->prepare($query);

$myothertable_output->execute;

my $name1 = $myothertable_output->fetch->[0]

# Это поле 'name' из первой строки данных ,

my $date2 = $myothertable_output->fetch->[1]

# Это поле 'date' из второй строки данных ,.my ($name3, $date3) = @{$myothertable_output->fetch};

# Это целиком третья строка данных .

$myothertable_output->fetch

# возвращает ссылку на массив . Можно ' преобразовать ' ее в действительный # массив , используя конструкцию @{}.

DBI::fetchrow_hashref

$hash_reference = $statement_handle->fetchrow_hashref;

DBI::fetchrow_hashref работает так же , как DBI::fetchrow_arrayref , но возвращает ссылку на

ассоциативный , а не на обычный массив . Ключами хэша являются имена полей , а значениями - значения в

этой строке данных .

Пример

use DBI;

my $db = DBI->connect('DBI:mSQL:mydata', undef, undef);

my $query = "SELECT * FROM mytable";

my $mytable_output = $db->prepare($query);

$mytable_output->execute;

my %row1 = $mytable_ouput->fetchrow_hashref;

my @field_names = keys %row1;

# @field_names содержит - теперь имена всех полей в запросе .

# Это делается только один раз . Во всех следующих строках будут те же поля .

my @row1 = values %row1;

DBI::finish

$result = $statement_handle->finish;

DBI::finish освобождает все данные в описателе команды , чтобы можно было уничтожить описатель или

снова подготовить его . Некоторым серверам баз данных это необходимо для освобождения соответству -

ресурсов . DBD::mSQL и DBD::mysql не нуждаются в этой функции , но для переносимости кода

следует использовать ее по окончании работы с описателем команды . Функция возвращает неопределенное

значение undef, если описатель не удается освободить .

Пример use DBI;

my $db - DBI->connect('DBI:mysql:mydata', 'me','mypassword');

my $query = "SELECT * FROM mytable";

my $mytable_output - $db->prepare($query);

$mytable_output->execute;

$mytable_output->finish;

# Теперь можно переназначить $mytable_output или подготовить для него # другую команду SQL.

DBI::func

$handle->func(@func_arguments, $func_name);

@dbs = $db->func("$hostname", '_ListDBs');

@dbs = $db->func("$hostname:Sport", '_ListDBs');

@tables = $db->func('._ListTables');

$result = $drh~>func( $database, '_CreateDB' );

$result = $drh->func( $database, '_DropDB' );

DBI::func вызывает специализированные непереносимые функции , включенные в различные драйверы

DBD. Она используется с описателем базы данных или описателем команды , в зависимости от назначения

специализированной функции . По возможности следует использовать равносильную переносимую функцию .

При использовании специализированной функции сначала передаются ее аргументы как скаляр , а затем - имя.функции . DBD::mSQL и DBD::mysql реализуют следующие функции :

_ListDBs

Функция _ListDBs принимает имя узла и необязательный номер порта и возвращает список

имеющихся у сервера баз данных . Лучше использовать переносимую функцию DBI::data_sources .

_Listlat)les

Функция _ListTables возвращает список таблиц , имеющихся в текущей базе данных .

_CreateDB

Функция _CreateDB принимает в качестве аргумента имя базы данных и пытается создать эту базу

данных на сервере . Для работы с этой функцией необходимо иметь право создания баз данных .

Функция возвращает - в случае неудачи и 0 в случае успеха .

_DropDB

Функция _DropDB принимает в качестве аргумента имя базы данных и пытается удалить с сервера

эту базу данных . Данная функция не выводит пользователю сообщений и при успешном выполнении

удаляет базу данных навсегда . Для работы с этой функцией необходимо иметь право удаления баз

данных . Функция возвращает - в случае неудачи и 0 в случае успеха .

Пример

use DBI;

my $db = DBI->connect('DBI:mysql:mydata','me 1 , 'mypassword');

my @tables = $db->func('_ListTables');

# @tables содержит теперь список таблиц в 'mydata'.

DBI::neat

$neat_string.= DBI::neat($string); $neat_string - DBI: :neat(.$string, $maxlen);

DBI::neat принимает в качестве аргументов строку и необязательную длину . Затем строка форматируется для

аккуратного вывода . Вся строка заключается в одиночные кавычки . Непечатаемые символы заменяются

точками . Если задан аргумент длины , все символы после максимальной длины удаляются , а строка

заканчивается тремя точками (...). Если длина не указана , по умолчанию используется значение 400.

Пример

use DBI;

my $string = " Это очень , очень длинная строка , в которой много чего написано .";

my $neat_string = DBI::neat($string,14);

# Теперь $neat_string такая :' Это очень , оче ..."

DBI::neat_list

$neat_string = DBI;:neat_list(\@listref, Smaxlen);

$neat_string = DBI::neat_list(\@listref, $maxlen, $fi§ld_seperator);

DBI: :neat_list принимает три аргумента и возвращает аккуратно отформатированную строку , пригодную для

вывода . Первый аргумент содержит ссылку на список выводимых значений . Второй аргумент -

длина каждого поля . Последний аргумент - строка , используемая для разделения полей . Для каждого

элемента списка вызывается DBI:: neat с использованием заданной максимальной длины . В результирующих

строках для разделения полей используется последний аргумент . Если последний аргумент не задан , в

качестве разделителя применяется запятая .

Пример

use DBI;

my @list = ('Bob', 'Joe', 'Frank');.my $neat_string = DBI::neat_list(\@list, 3);

# Теперь $neat_string такая : 'Bob', 'Joe', 'Fra...'

DBI::prepare

$statement_handle = $db->prepare($statement); $statement_handle = $db->

prepare($statement, \%unused);

DBI::prepare принимает в качестве аргумента SQL-команду , которую некоторые модули баз данных

переводят во внутреннюю компилированную форму , исполняемую быстрее при вызове DBI:: execute . Эти мо -

DBD ( DBD::mSQL или DBD::mysql) принимают также ссылку на хэш необязательных атрибутов .

Серверы mSQL и MySQL в настоящее время не реализуют концепцию подготовки команд , поэтому DBI::

prepa re просто запоминает команду . По желанию вместо значений данных в команду можно вставить любое

количество символов '?'. Эти символы известны как метки - (placeholders). Функция DBI:

;bincLparam осуществляет подстановку действительных значений вместо меток -. Если по какой -.......причине команду нельзя подготовить , функция возвращает undef.

Пример

use DBI;

my $db = DBI->connect('DBI:mysql:mydata', 'me','mypassword');

my $statement_handle = $db->prepare('SELECT * FROM mytable');

# Теперь эта команда готова к выполнению .

My $statement_handle = $db->prepare(

'SELECT name, date FROM myothertable WHERE name like ?');

# Эта команда будет готова к выполнению после подстановки # с использованием функции DBI::bind_param.

DBI::quote

$quoted_string = $db->quote($string);

DBI : : quote принимает строку для использования в качестве запроса SQL и возвращает ее копию с правильно

расставленными для ввода в запрос кавычками , в том числе расставляя корректные кавычки по концам

строки .

Пример

use DBI;

my $db1 = DBI->connect('DBI:mSQL:mydata',undef,undef);

my $db2 = DBI->connect('DBI:mysql:myotherdata', 'me','mypassword');

my Sstring = "Sheldon's Cycle";

my $qs1 = $db1->quote($string);

# $qs1: 'Sheldon\'s Cycle' ( включая наружные кавычки )

my $qs2 = $db2->quote($string);

# $qs2 : 'Sheldon's Cycle' ( включая наружные кавычки ).

# Теперь обе строки годятся для использования в командах для своих # соответствующих серверов баз данных .

DBI::rows

$number_of_rows = $statement_handle->rows;

DBI: : rows возвращает число строк данных , содержащихся в описателе команды . Для DBD::mSQL и DBD::mysql

эта функция дает точное число для всех команд , включая SELECT. Для многих других драйверов , которые не

хранят в памяти сразу все результаты , эта функция надежно работает только для команд , не являющихся

SELECT. Это следует учитывать при написании переносимых программ . Функция возвращает -, если по

какой -......причине число строк неизвестно . Переменная $DBI: ; rows выполняет ту же задачу .

Пример.

use DBI;

my $db = DBI->connect('DBI:mSQL:mydata',undef,undef);

my $query = "SELECT name, date FROM myothertable WHERE name='Bob'";

my $myothertable_output = $db->prepare($query);

$myothertable_output->execute;

my $rows = $myothertable_output->rows;

print " В таблице 'myothertable' есть $rows строк ' ВоЬ '\n";

DBI::state

$sql_error = $handle->state;

DBI:::state возвращает код ошибки SQL SQLSTATE последней по времени ошибки DBI. В данное время

DBD::mSQL и DBD;:mysql сообщают 'S 000' для всех ошибок . Эта функция доступна для описателей баз

данных и команд . Переменная $DBI::state выполняет ту же задачу .

Пример

use DBI;

my $db = DBI->connect('DBI:mysql:mydata', 'webuser', 'super_secret_squirrel');

my $sql_error = $db->state;

warn(“Bor последняя по времени ошибка DBI SQL: $sql_error");

DBI::trace

DBI->trace($trace_level)

DBI->trace($trace_level, $trace_file)

$handle->trace($trace_level);

$handle->trace($trace_level, $trace_file);

DBI::trace используется в основном для отладки . Если уровень трассировки установлен равным 2, выводится

полная отладочная информация . Установка уровня 0 отключает трассировку . DBI->trace осуществляет

трассировку для всех описателей , a $handle->trace - только для данного описателя - базы данных или команды .

При наличии DBI->trace или $handle->trace второго аргумента отладочная информация выводится в

указанный файл . Также трассировку можно включить , установив значение переменной окружения

DBI_TRACE. Если переменная окружения установлена равной числу ( настоящее время 0 или 2), включается

трассировка всех описателей на этом уровне . При другом значении переменной уровень трассировки

устанавливается равным 2, а само значение используется в качестве имени файла для вывода отладочной

информации .

Пример

use DBI;

my $db1 = DBI->connect('DBI:mysql:mydata', 'webuser','super_secret_squirrel');

my $db2 = DBI->connect('DBI:mSQL:myotherdata',undef,undef);

DBI->trace(2);

# Включена трассировка для всех описателей на уровне 2.

$db2->trace(0);

# Отключена трассировка для $db2, но продолжает действовать для $db1

$db1->trace(2,'DBI.trace');

# Теперь включена трассировка для всех описателей на уровне 2, выдача # посылается в файл 'DBI.trace'.

DBI::commit

DBI::rollback

DBI::ping

$result = $db->commit;

$result = $db->rollback;.$result = $db->ping;

DBI::commit и DBI::rollback полезны только при работе с серверами , поддерживающими транзакции . При

работе с DBD::mSQL и DBD::mysql они не оказывают никакого эффекта . DBD: :ping пытается проверить ,

запущен ли сервер базы данных . В DBD::mSQL и DBD: :mysql она не реализована .

Атрибуты

$db->{AutoCommit}

$handle->{ChopBlanks}

$handle->{CompatMode}

$handle->{InactiveDestroy}

$handle->{LongReadLen}

$handle->{LongTruncOk}

$handle->{PrintError}

$handle->{RaiseError}

$handle->{Warn}

$statement_handle->{CursorName}

$statement_handle->{insertid} ( MySQL)

$statement_handle->{is_blob} ( MySQL)

$statement_handle->{is_key} ( MySQL)

$statement_handle->{is_not_null}

$statement_handle->{is_nufri}

$statement_handle->{is_pri_key} ( MySQL è mSQL 1.x

$statement_handle->{length}

$statement_handle->{max_length} ( MySQL)

$statement_handle->{NAME}

$statement_handle->{NULLABLE}

$statement_handle->{NUM_OF_FIELDS}

$statement_handle->{NUM_OF_PARAMS}

$statement_handle->{table}

$statement_handle->{type}

В DBI.pm API определено несколько атрибутов , которые можно читать и устанавливать в любой

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

соединения . Присвоение любого отличного от нуля значения атрибуту устанавливает его . Присвоение

значения 0 атрибуту сбрасывает его . Некоторые значения определены только для конкретных баз

данных и непереносимы . Ниже следуют атрибуты , применимые как к описателям баз данных , так и к

командам .

$db->{AutoCommit}

Этот атрибут оказывает влияние на поведение серверов баз данных , поддерживающих транзакции .

Для mSQL и MySQL он всегда должен быть установлен ( по умолчанию ). Попытка

изменить его прерывает выполнение программы .

$handle->{ChopBlanks}

При установке этого атрибута отсекаются все ведущие и замыкающие пробелы в данных ,

возвращаемых запросом (, при вызове DBI::fetch row ).. Все производные от данного описатели

наследуют значение этого атрибута . Значение по умолчанию - «......».

$handle->{InactiveDestroy}

Назначение этого атрибута - сохранить процесс при ветвлении (fork), чтобы дочерний процесс мог

пользоваться родительским описателем . Его следует установить в родительском или дочернем

процессе , но не в обоих . Значение по умолчанию - «......».

$handle-> {PrintError}

При установке этого атрибута выводятся все предупредительные сообщения . При сброшенном.атрибуте доступ к ошибкам осуществляется только через $DBI::errstr. Все производные от данного

описатели наследуют значение этого атрибута . Значение по умолчанию -«установлен ».

$handle->{RaiseError)

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

прерывая ее выполнение , если не определен обработчик '_DIE_'. Все описатели , производные от

этого , наследуют значение этого атрибута . Значение по умолчанию -«сброшен ».

$handle->{Warn}

При установке этого атрибута выводятся предупредительные сообщения о неудачных приемах

программирования (.................пережитках Perl 4). Сброс этого атрибута отключает предупреждения

DBI, что допустимо только при полной уверенности в своем мастерстве . Все производные от данного

описатели (, описатель команды , происходящий от описателя базы данных ) наследуют

значение этого атрибута . Значение по умолчанию - «......».

$statement_handle->{insertid}

Непереносимый атрибут , определенный только для DBD::mysql. Он возвращает из таблицы текущее

значение поля auto_increment ( таковое имеется ). Если поле auto_increment не существует ,

атрибут возвращает undef.

$statement_handle->{is_blob}

Это непереносимый атрибут , определенный только для DBD::mysql. Атрибут возвращает ссылку на

массив булевых значений , указывающих для каждого из содержащихся в описателе команды полей ,

имеет ли оно тип BLOB. Для описателя команды , который был создан не выражением SELECT,

$statement_handle->{is_blob} возвращает undef.

$statement_handle->{is_key}

Непереносимый атрибут , определенный только для DBD::mysql. Он возвращает ссылку на массив

булевых значений , указывающих для каждого из содержащихся в описателе команды полей ,

определено ли оно как KEY. Для описателя команды , который был создан не выражением SELECT,

$statement_handle->{is_key} возвращает undef.

$statement_handle->{is_not_null}

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Он возвращает

ссылку на массив булевых значений , указывающих для каждого из содержащихся в описателе

команды полей , определено ли оно как 'NOT NULL' . Для описателя команды , который был создан не

выражением SELECT, данный атрибут возвращает undef. Того же результата можно достичь в

переносимом виде , используя $statement_handle->{NULLABLE} .

$statement_handle->{is_num}

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Атрибут

возвращает ссылку на массив булевых значений , указывающих для каждого из содержащихся в

описателе команды полей , имеет ли оно числовой тип . Для описателя команды , созданного не

выражением SELECT, $ s t at ement _handl e->{i s_num} возвращает undef.

$statement_handle->{is_pri_key}

Это непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. При

использовании с DBD::mSQL он оказывает влияние только для серверов mSQLl.x, поскольку mSQL2.x

не использует первичные ключи . Атрибут возвращает ссылку на массив булевых значений ,

указывающих для каждого из содержащихся в описателе команды полей , является ли оно первичным

ключом .

Для описателя команды , созданного не выражением SELECT, данный атрибут возвращает undef.

$statenent_handle->{length}.Непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Этот атрибут

возвращает ссылку на список максимально допустимых размеров полей , содержащихся в описателе

команды . Для описателя команды , который был создан не выражением SELECT, $statement_handle->{

length} возвращает undef.

$statement_handle->{.max_length}

Это непереносимый атрибут , определенный только для DBD::mysql. Атрибут возвращает ссылку на

список фактических максимальных размеров полей , содержащихся в описателе команды . Для

описателя команды , который был создан не выражением SELECT, данный атрибут возвращает undef.

$statement_handle->{NAME}

Атрибут возвращает ссылку на список имен полей , содержащихся в описателе команды . Для

описателя команды , который был создан не выражением SELECT, $staternent_handle->{NAME} возвращает

undef.

$statement_handle->{NULLABLE}

Этот атрибут возвращает ссылку на массив булевых значений , указывающих для каждого из

содержащихся в описателе команды полей , может ли оно иметь значение NULL. Поле , определенное как

'NOT NULL' , даст в списке значение 0. Остальные поля дадут значение 1 . Для описателя команды ,

созданного не выражением SELECT, атрибут возвращает undef.

$statement_handle->{NUM_OF_FIELDS}

Атрибут возвращает число колонок данных , содержащихся в описателе команды . Для описателя

команды , который был создан не выражением SELECT, $statement_handle->{NUM_OF_FIELDS} возвращает

0

$statementJandle->{NUM_OF_PARAMS}

Этот атрибут возвращает число меток - в описателе команды . Метки -

обозначаются в команде символом '?'. Для подстановки вместо меток - надлежащих

значений используется функция DBI:: bind_values .

$statement_handle->{table}

Это непереносимый атрибут , определенный только для DBD: rmSQL и DBD::mysql. Атрибут

возвращает ссылку на список имен таблиц , к которым осуществлялся доступ в запросе . Полезно

использовать для SELECT с соединением нескольких таблиц .

$statement_handle->{type}

Непереносимый атрибут , определенный только для DBD::mSQL и DBD::mysql. Он возвращает

ссылку на список типов полей , содержащихся в описателе команды . Для описателя команды , создан -...........

не выражением SELECT, $statement_handle->{max_length} возвращает undef. Значениями списка

являются целые числа , соответствующие перечислению в заголовочном файле С mysql_com.h из

дистрибутива MySQL. Сейчас способа доступа к именам этих типов из DBI не существует . Но доступ

к типам возможен через функцию &Mysql::FIELD_TYPE_ * в Mysql.pm. В DBD::mysql имеется также недоку -.......атрибут $statement_handle->{format_type_name}, идентичный

$statement_handle->{type}, за исключением того , что вместо целых чисел возвращает SQL-

типов . Следует подчеркну

Автор: Вадим Хомаха · Добавлена: 2003-09-15
Просмотров: 7423 · Рейтинг: 4.0

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Ведете ли вы блог?
Всего ответов: 60296
Наша кнопка
WoWeb.ru - портал для веб-мастера