Функция PostgreSQL возвращает тип, который не существует при вызове из C#

#postgresql #plpgsql

#postgresql #plpgsql

Вопрос:

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

 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» не существует

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

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

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

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

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

Комментарии:

1. Я настоятельно рекомендую никогда не использовать двойные кавычки в операторах SQL.

2. Я бы хотел, но часто он не найдет схему / таблицу без этого. Я обнаружил, что с двойными кавычками проблемы не существует

3. вы не должны создавать их, используя двойные кавычки для начала.

Ответ №1:

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

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

 _membershipStatus MemberStatus;
  

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

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

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

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

Комментарии:

1. Я попытался добавить полное имя схемы. Запрос выполняется, но функция вообще не изменяется в этой части кода. Трюк с поиском пути сработал! Спасибо!

2. Можете ли вы объяснить этот комментарий? Я этого не понимаю. Ваша проблема решена?

3. Конечно, в основном я изменил _membershipStatus MemberStatus; на _membershipStatus «Членство». MemberSatus; После ее запуска он не был изменен. Я удалил функцию и воссоздал с использованием нового кода, и то же самое произошло с «Членством». отсутствовал (однако был на месте в других частях кода). Я только начинаю использовать PostgreSQL, и кажется, что мое программное обеспечение ведет себя странно (один раз работает, другой раз что-то не так и т.д.). Что касается проблемы, один раз, когда она находила MemberStatus, через 20-30 минут этого не произошло (то же окно, тот же экземпляр приложения).

4. О, да, проблема решается путем установки search_path.