【发布时间】: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