Microsoft SQL Server 2008 データベースでストアド プロシージャを実行するためのアクセスを必要とする複雑な php Web サイト (および VB.Net/C# 管理アプリケーション) に PostgreSQL データベースを使用しています。この対話を実行するために選択された方法は、PostgreSQL データベース内で plperl 関数を使用して、MSSQL ストアド プロシージャへのアクセスをラップすることです。
MSSQL データベースからのデータ取得を処理するために perl DBI モジュールを使用しています。
私は一般的に perl に関して初心者であり、特に PostgreSQL で使用する場合は初心者です。複合型のセットを返すために、以下に示す関数を作成しました
CREATE TYPE "public"."permissions_return" AS (
"rolename" TEXT,
"roledescription" TEXT,
"permissionname" TEXT,
"permissiondescription" TEXT
);
関数内から呼び出されたストアド プロシージャは正常に動作し、コマンド ラインから、または MSSQL Server から直接実行されるわずかに異なる perl スクリプトを実行すると、データが返されます。以下を使用しているときに、関数からデータを返す方法を理解できませんでした。
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 へのアクセスは、freetds ドライバーで unixODBC を使用して構成されます。MSSQL サーバーへのアクセスはテスト済みで、isql コマンドライン ツールと単純な perl スクリプトを使用して正常に動作します。
どんなアイデアでも大歓迎です。抜く毛が無くならないか心配です。
よろしく
シェーン