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
.