Сервер 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.


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