#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.