Возврат данных 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.

Другие вопросы по тегам