Добавление функции postgresql в модель сущности Devart

Я пытаюсь импортировать функцию postgresql в модель объекта devart, где я хочу вернуть «пользовательскую» таблицу, но я просто не могу заставить ее работать

Я определяю свою функцию следующим образом:

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;

И использовал шаги в посте № 2 на http://www.devart.com/forums/viewtopic.php?p=71252, но я получаю сообщение об ошибке

Средство чтения данных несовместимо с указанным Model.Entity1. Член типа JournalEntryID не имеет соответствующего столбца в средстве чтения данных с таким же именем.


person Torben Pi Jensen    schedule 11.07.2011    source источник
comment
Работает ли запрос SELECT, если вы выполняете его напрямую, без хранимой процедуры?   -  person Flimzy    schedule 11.07.2011
comment
Да, он возвращает желаемый результат   -  person Torben Pi Jensen    schedule 11.07.2011
comment
Вы получаете эту ошибку при определении хранимой процедуры или при ее вызове? Если при его вызове вы можете вставить точный запрос, который вы выполняете, который вызывает хранимую процедуру?   -  person Flimzy    schedule 11.07.2011
comment
При вызове его, и я использую структуру сущностей для его вызова, поэтому у меня нет вызывающего запроса   -  person Torben Pi Jensen    schedule 11.07.2011
comment
Фреймворк должен вызывать его с запросом.   -  person Flimzy    schedule 11.07.2011


Ответы (2)


Мне часто удавалось лучше использовать переменные OUT для хранимых процедур, возвращающих наборы. Не знаю, поможет ли это в вашем случае, но вы можете попробовать. Честно говоря, я не знаю, меняет ли это способ работы функции или просто то, как она определена...

CREATE OR REPLACE FUNCTION "GetJournalEntriesByVoucherId"(BIGINT,
    JournalEntryID OUT DATATYPE,
    Amount OUT INT,
    EntryText OUT VARCHAR,
)
RETURNS SETOF record AS
$BODY$
....
person Flimzy    schedule 11.07.2011
comment
Ну, это изменило способ, которым импорт распознает тип возвращаемого значения (теперь он правильный), но я все еще получаю ошибку чтения данных. - person Torben Pi Jensen; 11.07.2011
comment
Забавно, что если я сохраняю возвращаемый объект с полем Returnvalue строки типа, он фактически возвращает строки в объектах, где returnvalue будет (JournalEntryID.value, Amount.value, EntryText.value) в виде строки... - person Torben Pi Jensen; 11.07.2011
comment
Мне удалось решить мою проблему, создав собственный тип, который имел те же поля, что и результат моего запроса, и позволил установить результат функции для типа, который затем заставил работать считыватель данных. Я опубликую ответ через 4 часа, когда мне разрешат это сделать. - person Torben Pi Jensen; 11.07.2011
comment
@plazm: Если вы решили свой собственный вопрос, вы должны создать ответ на свой вопрос, а затем принять его. - person Flimzy; 14.07.2011

@Flimzy верен.
Когда функция возвращает набор записей, средство чтения, возвращаемое функцией, содержит запись в форме '(field1.Value, ..., fieldk.Value)' и обрабатывается как varchar.
Когда параметры out указаны, имена и типы этих параметров позволяют серверу узнать, какие поля находятся в считывателе, и значения возвращаются правильно. Мы исправили некоторые ошибки в этом сценарии в последней сборке 5.30.180, теперь все работает.
Решение со строго типизированным setof (CompositeType) также является подходящим.

person Devart    schedule 13.07.2011