我正在创建一个线程安全函数。我希望这个数字由'p_sitename‘和'p_sourcename’递增。
CREATE OR REPLACE FUNCTION public.fn_ppp(
p_sitename character varying,
p_sourcename character varying)
RETURNS integer
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
declare
res integer ;
begin
lock table std_seq in access exclusive mode;
update
std_seq
set
post_id = (
select
post_id + 1 into res
from
std_seq
where
sitename = p_sitename and
sourcename = p_sourcename
limit 1
)
where
sitename = p_sitename and
sourcename = p_sourcename ;
return res;
end;
$BODY$;错误信息是
ERROR: INTO used with a command that cannot return data
CONTEXT: PL/pgSQL function fn_ppp(character varying,character varying) line
8 at SQL statement
SQL state: 42601为什么不行?
发布于 2018-10-12 03:59:16
SELECT ... INTO不能在子查询中,只能在顶层。
但是你可以很容易地用UPDATE ... RETURNING做你想做的事
UPDATE std_seq
SET post_id = post_id + 1
WHERE sitename = p_sitename
AND sourcename = p_sourcename
RETURNING post_id INTO res;因为所有事情都发生在一条语句中,所以根本不需要显式地锁定表。每个使用同一个事务调用相同函数的并发事务都将被阻塞,直到事务完成,并且不会出现重复的情况。
表应该对(sitename, sourcename, post_id)有一个主键约束。这将防止重复,但也可能加快UPDATE。
https://stackoverflow.com/questions/52771336
复制相似问题