1

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 スクリプトを使用して正常に動作します。


どんなアイデアでも大歓迎です。抜く毛が無くならないか心配です。

よろしく

シェーン

4

1 に答える 1

1

これはあなたの質問に直接答えるものではありませんが、あるデータベースから別のデータベースにデータを照会しようとするときに dblink を使用しました。うまくいったようです。明らかな plperlu は dblink よりもはるかに強力ですが、私はそれを使った経験がありません (perl と postgresql だけです :-)

dblink は、postgresql の contrib ディレクトリにあります。

于 2011-06-09T16:12:22.420 に答える