【问题标题】:Returning MSSQL data using plperl function in PostgreSQL在 PostgreSQL 中使用 plperl 函数返回 MSSQL 数据
【发布时间】:2011-06-09 14:44:14
【问题描述】:

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

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

对于 perl,尤其是在 PostgreSQL 中使用 perl 时,我是个新手。我创建了如下所示的函数来返回一组复合类型

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 脚本可以正常工作。


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

问候

肖恩

【问题讨论】:

  • 我唯一的想法是简单地调试该 PL/Perl 代码以找出(精确)问题发生的位置。共有三个(基本)步骤:建立连接、执行查询和返回结果。

标签: sql-server perl postgresql dbi plperl


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我之前研究过dblink。不幸的是,除非我错过了什么,否则 dblink 仅在连接到远程 PostgreSQL 服务器时才有效。在我的例子中,我在 PostgreSQL 中的 MSSQL 2008 服务器上执行存储过程。
  • 实际上,如果您使用 DBI-link(谷歌搜索它),您可以连接到 Perl 可以访问的任何数据库 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2020-10-18
相关资源
最近更新 更多