0

「カスタム」テーブルを返したいdevartエンティティモデルにpostgresql関数をインポートしようとしていますが、機能させることができません。

私は自分の関数を次のように定義します:

CREATE OR REPLACE FUNCTION "GetJournalEntriesByVoucherId"(bigint)
  RETURNS SETOF record AS
$BODY$
SELECT 
    JE."JournalEntryID"
    JE."Amount",
    JE."EntryText",
FROM
    "JournalEntries" AS JE
WHERE
    JE."FK_Voucher"=$1
$BODY$
  LANGUAGE sql VOLATILE STRICT
  COST 100
  ROWS 1000;
ALTER FUNCTION getjournalentriesbyvoucherid(bigint) OWNER TO sqluser;

http://www.devart.com/forums/viewtopic.php?p=71252の投稿#2の手順を使用しましたが、エラーメッセージが表示されます

データリーダーは、指定されたModel.Entity1と互換性がありません。タイプJournalEntryIDのメンバーには、データリーダーに同じ名前の対応する列がありません。」

4

2 に答える 2

1

ストアドプロシージャを返すセットを返すためにOUT変数を使用するほうが幸運であることがよくあります。これがあなたの場合に役立つかどうかはわかりませんが、試してみてください。これが関数の動作方法を変更するのか、それとも関数の定義方法を変更するのかは正直わかりません...

CREATE OR REPLACE FUNCTION "GetJournalEntriesByVoucherId"(BIGINT,
    JournalEntryID OUT DATATYPE,
    Amount OUT INT,
    EntryText OUT VARCHAR,
)
RETURNS SETOF record AS
$BODY$
....
于 2011-07-11T08:58:21.137 に答える
0

@Flimzyは正しいです。
関数がsetofrecordを返す場合、関数から返されるリーダーには'(field1.Value、...、fieldk.Value)'の形式のレコードが含まれ、varcharとして扱われます。
outパラメーターが指定されている場合、これらのパラメーターの名前とタイプにより、サーバーはリーダー内のフィールドを認識し、値が正しく返されます。最新の5.30.180ビルドでこのシナリオのいくつかのエラーを修正しましたが、現在は機能しています。
強く型付けされたsetof(CompositeType)を使用したソリューションも適切です。

于 2011-07-13T12:45:10.233 に答える