таблица номеров приращений postgresql потокобезопасный - PullRequest
0 голосов
/ 12 октября 2018

Я создаю поточно-ориентированную функцию.Я хочу, чтобы число увеличилось на 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

Почему бы и нет?

1 Ответ

0 голосов
/ 12 октября 2018

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...