С ходу придумал два решения:
- Собрать данные скриптом и обработать.
- Написать server side функцию, которая установит dblink-соединение со всеми необходимыми севрерами, прогонит запрос по ним и вернет агрегированные данные. Необходимый запрос передается параметром.
Есть небольшая сложность: полей данных более, чем два. В случае C я бы использовал структуры. Но в Perl нет структур в комплете (хотя можно подобрать модуль). Я предпочел складывать данные ссылкой на анонимный хеш в хеш ( переменная %result ) :) Правда потом немного сложно сортировать эти записи. Собственно поэтому и пишу пост, магия сортировки происходит в третьей с конца строке:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
my %result; | |
foreach my $server (@servers) { | |
my $dbh = DBI->connect("host=$server,..."); | |
my $sqlh = $dbh->prepare("...") | |
or die "Can't prepare statement: $DBI::errstr"; | |
my $sqlh->execute(...) | |
or die "Can't execute statement: $DBI::errstr"; | |
while (my $rwo = $sqlh->fetchrow_hashref) { | |
$result{ $row->{id} } = { | |
first => $row->{first_data}, | |
second => $row->{second_data} | |
}; | |
} | |
$sqlh->finish; | |
} | |
... | |
print "ID;FIRST_DATA;SECOND_DATA\n"; | |
foreach my $val ( sort {($result{$a}->{first}) <=> ($result{$d}->{first}) } keys %result ) { | |
print "$val;$result{$val}->{first};$result{$val}->{second}\n"; | |
} |
Решение вторым методом пока не реализовывал. Сделаю - дополню пост.