Мне нужно запросить у группы баз данных SAP Sybase некоторую информацию и распечатать ее в виде запятого. Поэтому я полагаю, что пишу сценарий perl, который подключается к любой из этих баз данных через модуль DBI. Вот что я придумал.
my $user = "someuser";
my $passwd = "somepassword";
my @sids=(filled with DB identifiers);
my $output="";
my $size;
my $version;
my $id;
my $dsn;
my $dbh;
my $sid;
my @row;
my $sth1;
my $sth2;
foreach $sid (@sids) {
print $sid."\n";
$dsn = "dbi:Sybase:server=$sid;charset=iso_1;tdsLevel=CS_TDS_50";
print $dsn."\n";
$dbh = DBI->connect($dsn, $user, $passwd,{ PrintError => 0,RaiseError => 0, AutoCommit => 1, syb_enable_utf8 => 1});
print "DBI OK\n" if defined ($dbh);
$sth1 = $dbh->prepare('select SUM(size) from master..sysusages WHERE dbid = 4 AND segmap = 3');
$sth2 = $dbh->prepare('select @@version');
$sth1->execute;
while (@row = $sth1->fetchrow) {
$size = $row[0];
}
$size = $size * 16 / 1024;
$sth1->finish;
$sth2->execute;
while (@row = $sth2->fetchrow) {
$version = $row[0];
}
$sth2->finish;
$output = $sid.",".$size.",".$version;
$dbh->disconnect;
print $output."\n";
}
Когда я выполняю это, он падает после 4-й итерации, потому что дескриптор соединения не установлен. Таким образом, подключение пятой БД больше не работает.
Can't call method "prepare" on an undefined value at ./check_sybasedbs.pl line 36.
Строка 36 - это подготовка оператора 1.
Я пытался поместить команды сна в различные позиции. Я также попытался явно очистить переменные, которые повторно используются через undef
. Теперь у меня нет идей, и я был бы очень признателен за ваш вклад.