Функция PostgreSQL возвращает тип не существует при вызове из C # - PullRequest
0 голосов
/ 13 марта 2019

Вот пример функции

CREATE OR REPLACE FUNCTION "Membership".status2(membershipid text)
RETURNS "Membership".memberstatus
 LANGUAGE plpgsql
AS $function$
declare
_membershipStatus MemberStatus;
total integer;
typeId integer;
startDate date;
endDate date;
groupId integer;
membershipStatus varchar;
BEGIN
Select "TypeId", "StartDate","EndDate" into typeId, startDate, endDate from     "Membership"."Memberships" M where M."MembershipId" = membershipId;

   if endDate > NOW() then
   _membershipStatus.groupid = 3;
   _membershipStatus.membershipstatus = 'Expired';
   end if;

RETURN _membershipStatus;
END;
$function$
;

Это прекрасно работает, когда вчера я звонил через

select status2('gwgwg');

Сегодня я начинаю реализацию и вдруг при вызове с помощью

select "Membership".status2('sdgsd');

Я получаю

Ошибка SQL [42704]: ОШИБКА: тип "memberstatus" не существует

Конечно, я пытался добавить "Членство" .memberstatus, но тот же результат.

Со вчерашнего дня ничего не изменилось, и когда я тестировал его, он работал нормально.

Я не могу понять, почему он снова исчезнет ???

У меня уже была эта проблема, и по какой-то причине через некоторое время все типы данных исчезали (после исправной работы в течение X минут). Они все еще находятся в типах данных схемы, но не найдены ... (?)

КСТАТИ Когда я пытаюсь удалить тип данных, я получаю информацию о том, что функция зависит от него ... Но функция не может найти его (сначала она работала нормально).

1 Ответ

2 голосов
/ 13 марта 2019

Я бы предположил, что это проблема search_path.

Либо измените объявление

_membershipStatus MemberStatus;

, чтобы тип данных соответствовал схеме ("Membership".memberstatus), либо установитеsearch_path в определении функции: _membershipStatus MemberStatus;

ALTER FUNCTION "Membership".status2(text) SET search_path = "Membership";

Ваш SQL был бы менее сложным, если бы вы не использовали смешанные идентификаторы.

Причина, по которой он работал нормально дляНекоторое время должно быть, что у вас в сеансе установлен search_path.

...