Возврат данных MSSQL с использованием функции plperl в PostgreSQL
У меня есть база данных PostgreSQL, используемая для сложного веб-сайта php (и приложений управления VB.Net/C#), которым требуется доступ для выполнения хранимых процедур в базе данных Microsoft SQL Server 2008. Метод, выбранный для выполнения этого взаимодействия, заключается в использовании функций plperl в базе данных PostgreSQL для переноса доступа к хранимым процедурам MSSQL.
Мы используем модуль Perl DBI для обработки извлечения данных из базы данных MSSQL.
Я новичок, когда дело доходит до Perl в целом и особенно при использовании его с PostgreSQL. Я создал функцию, показанную ниже, чтобы вернуть набор составного типа
CREATE TYPE "public"."permissions_return" AS (
"rolename" TEXT,
"roledescription" TEXT,
"permissionname" TEXT,
"permissiondescription" TEXT
);
Хранимая процедура, вызываемая из функции, работает нормально и возвращает данные при запуске через несколько иной скрипт perl, запускаемый из командной строки или непосредственно с MSSQL-сервера. Я не смог выяснить, как вернуть данные из моей функции при использовании:
SELECT * FROM fn_perltest(153);
Результатом всегда является пустой набор.
CREATE FUNCTION fn_perltest(integer) RETURNS SETOF permissions_return AS $$
use strict;
use DBI;
my $data_source = q/dbi:ODBC:Production/;
my $user = q/afunkyusername/;
my $password = q/afunkierpassword/;
my $dbh = DBI->connect($data_source, $user, $password);
my $sth = $dbh->prepare(q/up_DCORsel_getUserPermissionByUserID $1 ;/);
$sth->execute();
while ( defined ( my $row = $sth->fetchrow_array() )) {
return next ({
rolename => $row->{RoleName},
roledescription => $row->{RoleDescription},
permissionname => $row->{PermissionName},
permissiondescription => $row->{PermissionDescription}
});
}
return;
$$ LANGUAGE 'plperlu'
Если это поможет, Postgres работает на сервере Fedora 13. Доступ к MSSQL Server настраивается с использованием unixODBC с драйвером freetds. Доступ к MSSQL-серверу был протестирован и отлично работает с помощью инструмента командной строки isql и простого сценария perl.
Любые идеи очень приветствуются. Я обеспокоен, что у меня могут кончиться волосы, чтобы вытащить.
С уважением
Шейн
1 ответ
Это не отвечает на ваш вопрос напрямую, но я использовал dblink, когда пытался поместить данные запроса одной базы данных в другую базу данных. Казалось, хорошо работает. Очевидно, что у plperlu гораздо больше возможностей, чем у dblink, но у меня нет никакого опыта (только perl и postgresql:-)
dblink можно найти в каталоге постов postgresql.