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 是正确的。
当函数返回记录集时,从函数返回的读取器包含格式为“(field1.Value,...,fieldk.Value)”的记录,并被视为varchar。
指定 out 参数时,这些参数的名称和类型让服务器知道读取器中的字段是什么,并正确返回值。我们在最新的 5.30.180 版本中修复了这种情况下的一些错误,它现在可以工作了。
具有强类型 setof (CompositeType) 的解决方案也是一个合适的解决方案。

于 2011-07-13T12:45:10.233 回答