1

MSSQL 内からの現在のレコードの単純なカウントについて、情報のリストを含む PostgreSQL データベースにクエリを実行したいと考えています。PG サーバーは、MSSQL のリンク サーバーです。

私は Postgre についてほとんど知りませんが、危険なほどの知識はあります。次のように、関数内に存在する単純なクエリを作成しました。

CREATE FUNCTION get_count(id text, division text, company integer, INOUT recCount integer) AS $$
BEGIN
recCount := (SELECT COUNT(0)
               FROM test.inventory
               WHERE inv_id = $1 AND div_code = $2 AND cmpy_no = $3);
END;
$$ LANGUAGE plpgsql;

次のように一日中クエリを実行できます。

SET @Query = 'SELECT test.get_count(''' + @Id+ ''', ''' + @Div + ''', ' + CAST(@Company AS VARCHAR) +', ?);'
EXEC (@Query) AT POSTGRESQLTEST;

しかし、次のような変数に割り当てることはできません:

SET @i = EXEC (@Query) AT POSTGRESQLPROD;
-- Error: Incorrect syntax near the keyword 'EXEC'.

オフィスの仲間は、値を一時テーブルに保存し、クエリを実行してからドロップすると言います。非常に効率的な私見ではありませんが、仕事は完了します。

それで、他に何ができますか?PG サーバーから INOUT パラメータ recCount を利用するにはどうすればよいですか?

4

1 に答える 1

1

以下のコメントからのフィードバックで編集されました。
これは次のように動作するはずOpenQueryです:

SELECT * FROM OpenQuery(POSTGRESQLTEST,
                'SELECT test.get_count(''some_inv_id'', ''some_div_code'', 123')

@Andriy が指摘したように、OpenQuery は変数を受け入れません。準動的 SQL の場合、実行する前にクエリ文字列全体を組み立てる必要があります。そのためには、文字列を一重引用符で囲む必要があります-2回!

以下は、.databasejournal.com の例です。
そして、@sighlent は以下のソリューションを提供しました。


余談ですが、plpgsql関数に関しては:

の入力値は必要ないようですrecCount。物事を少し単純化するために、OUT代わりにそれをパラメーターにするとINOUT、入力パラメーターが 1 つ少なくなります。

CREATE OR REPLACE FUNCTION x.get_count(id text, division text, company integer
                                                       , OUT recCount integer) AS
$BODY$
BEGIN
    recCount := (
       SELECT COUNT(*)
       FROM   test.inventory
       WHERE  inv_id   = $1
       AND    div_code = $2
       AND    cmpy_no  = $3);
END;
$BODY$ LANGUAGE plpgsql;
于 2012-04-27T16:51:33.023 に答える