Сервер Sybase и DBI
Сервер Sybase и DBI
В этом подразделе представлен аналог для Sybase. Внимательно просмотрите программу, а после этого поговорим о некоторых существенных моментах:
use DBI;
print "Введите имя пользователя: "; chomp($user = <STDIM>);
print "Введите пароль для $user: "; chomp($pw = <STDIN>);
$dbh = DBl->connect('dbi:Sybase'',Suser,$pw);
die "Невозможно соединиться: $DBI::errstr\n" unless (defined $dbh);
ищем базы данных на сервере$sth = $dbh->prepare(q{SELECT name from master dbo.sysdatarases}) cr
die "Невозможно подготовить запрос к sysdatabases: ".
$db'i->er rst r . "\n", $stli->oxecute or
die "Невозможно выполнить запрос к sysdarabases: '.
$dori->errstr. "\п";
while (Sarof = $sth->fetchrow_arrayref) (
push((3dbs, $aref->[0]): }
$sth->finisn:
foreach $cm (Mbs) {
$dbh->do("USE $do") or
die "Невозможно использовать $db: ".
®tables=():
while ($агч'( - $.::;->fotchrow_arrayref) {
die "Невозможно изменить Sdb: ".
S'Jor->err-str."' n":
# ищем поля для каждой таблицы foreach Stable (tables) { print "\t$table\n";
$sth=$dbh->prepare(qq{EXEC bp_colunns Stable}) or
die "Невозможно подготовить запрос sp^columns ", $obh-:-err.v
$sth->execute or
die "Невозможно выполнить запрос sp^columns: ".$dbh->errstr.
while ($aref = $sth->fetchrow_arrayref) {
print "\t\t",$aref->[3]," [",$aref->[5],"(",
$aref->[6],")]\n": }
$sth->finish; ! }
$dbh->discohnect or warn "Невозможно отсоединиться: ".
$dbh->errstr."\n";
Вот обещанные заметные моменты:
- Sybase хранит информацию о базах данных и таблицах в специальных системных таблицах sysdatabases и sysobjects. Каждая база данных содержит таблицу sysobjects, в то время как сервер хранит обобщенную информацию о них в одной таблице sysdatabases, расположенной в основной базе данных. Мы используем более явный синтаксис databases, owner, table в первом запросе SELECT, чтобы недвусмысленно обратиться именно к этой таблице. Для перехода к sysobjects каждой базы данных можно применять этот же синтаксис, вместо того чтобы явно переключаться между ними при помощи USE. Более того, как и при переходе в каталог средствами cd, такой контекст упрощает написание других запросов.
- Запрос SELECT к sysobjects применяет ключевое слово iVHE-L, чтобы вернуть информацию только о пользовательских таблицах. Это было сделано для ограничения размера вывода. Если бы мы хотели включить также и все системные таблицы.
- Складывается впечатление, что заполнители в DBD: : Sybase реализованы так для того, чтобы препятствовать их употреблению с хранимыми процедурами. Будь реализация другой, следовало бы использовать заполнители в EXEC sp_columns.