Возврат данных MSSQL с использованием функции plperl в PostgreSQL - PullRequest
1 голос
/ 09 июня 2011

У меня есть база данных 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 Ответ

1 голос
/ 09 июня 2011

Это не отвечает на ваш вопрос напрямую, но я использовал dblink, когда пытался поместить данные запроса одной базы данных в другую базу данных.Казалось, хорошо работает.Очевидно, что у plperlu гораздо больше возможностей, чем у dblink, но у меня нет никакого опыта с этим (просто perl и postgresql: -)

dblink можно найти в каталоге contrib postgresql.

...