1

我有一个 PostgreSQL 数据库用于复杂的 php 网站(和 VB.Net/C# 管理应用程序),它需要访问在 Microsoft SQL Server 2008 数据库上执行存储过程。选择执行此交互的方法是使用 PostgreSQL 数据库中的 plperl 函数来包装对 MSSQL 存储过程的访问。

我们正在使用 perl DBI 模块来处理从 MSSQL 数据库中检索数据。

一般来说,我是 perl 的新手,特别是在将它与 PostgreSQL 一起使用时。我创建了如下所示的函数来返回一组复合类型

CREATE TYPE "public"."permissions_return" AS (
  "rolename" TEXT,
  "roledescription" TEXT,
  "permissionname" TEXT,
  "permissiondescription" TEXT
);

从函数内调用的存储过程可以正常工作,并在通过从命令行运行的略有不同的 perl 脚本运行或直接从 MSSQL Server 运行时返回数据。使用时,我无法弄清楚如何从我的函数返回数据:

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 服务器上运行。使用 unixODBC 和 freetds 驱动程序配置对 MSSQL Server 的访问。对 MSSQL 服务器的访问已经过测试,使用 isql 命令行工具和一个简单的 perl 脚本可以正常工作。


任何想法将不胜感激。我担心我可能会用完头发来拔掉。

问候

谢恩

4

1 回答 1

1

这并不能直接回答您的问题,但是当我尝试在另一个数据库中使用一个数据库查询数据时,我使用了 dblink。它似乎运作良好。显然 plperlu 比 dblink 有更多的功能,但我没有任何经验(只有 perl 和 postgresql :-)

dblink 可以在 postgresql 的 contrib 目录中找到。

于 2011-06-09T16:12:22.420 回答