函数不是 returning table 尽管它是 return 类型
Function not returning table despite it being the return type
这是我的函数:
create or replace function like(likerId uuid, likeeId uuid)
returns table(is_matched bool, created_notification bool)
language plpgsql
as $$
declare
performed_like bool := (select swipeIfDifferent(likerId, likeeId, 'like'));
liker_name text := (SELECT every_user.username from every_user where every_user_.id=likerId);
is_matched bool := (
SELECT EXISTS (
SELECT 1 from user_like_or_dislike where
user_like_or_dislike.owning_user_id=likeeId AND
user_like_or_dislike.subject_user_id=likerId AND
user_like_or_dislike.like_or_dislike='like'
)
);
begin
if performed_like then
insert into notification (owning_user_id, subject_user_id, notification_kind_id, message, timestamp) values (likeeId, likerId, 2, liker_name + ' liked you!', current_timestamp);
end if;
return query select is_matched, performed_like;
end;
$$;
每当我执行它时,无论我使用 select * from like(...);
还是 select like(...);
它总是输出以下内容:
like
------
f
(1 row)
此外,'like' 似乎也从未执行过(定义 performed_like
变量时函数调用 swipeIfDifferent(...)
)。 swipfIfDifferent(...)
的 return 类型是 bool
.
将数据库对象命名为与系统函数相同的名称是个坏主意。当你认为你正在调用你的函数时,你实际上不能保证数据库会真正调用它。这是您的案例中实际调用的内容。
因此,将您的函数重命名为 user_func_like,错误就会消失。或者指定架构名称,如 user_schema.like(x,y)。但最好使用 non-system names
这是我的函数:
create or replace function like(likerId uuid, likeeId uuid)
returns table(is_matched bool, created_notification bool)
language plpgsql
as $$
declare
performed_like bool := (select swipeIfDifferent(likerId, likeeId, 'like'));
liker_name text := (SELECT every_user.username from every_user where every_user_.id=likerId);
is_matched bool := (
SELECT EXISTS (
SELECT 1 from user_like_or_dislike where
user_like_or_dislike.owning_user_id=likeeId AND
user_like_or_dislike.subject_user_id=likerId AND
user_like_or_dislike.like_or_dislike='like'
)
);
begin
if performed_like then
insert into notification (owning_user_id, subject_user_id, notification_kind_id, message, timestamp) values (likeeId, likerId, 2, liker_name + ' liked you!', current_timestamp);
end if;
return query select is_matched, performed_like;
end;
$$;
每当我执行它时,无论我使用 select * from like(...);
还是 select like(...);
它总是输出以下内容:
like
------
f
(1 row)
此外,'like' 似乎也从未执行过(定义 performed_like
变量时函数调用 swipeIfDifferent(...)
)。 swipfIfDifferent(...)
的 return 类型是 bool
.
将数据库对象命名为与系统函数相同的名称是个坏主意。当你认为你正在调用你的函数时,你实际上不能保证数据库会真正调用它。这是您的案例中实际调用的内容。
因此,将您的函数重命名为 user_func_like,错误就会消失。或者指定架构名称,如 user_schema.like(x,y)。但最好使用 non-system names