我有一个PostgreSQL 9.4的应用程序。 由于upsert是PostgreSQL 9.5的一个特性,我需要一个解决方法。
由于必须返回更新/插入的行,因此任务更加复杂。
起初我试过这个:
BEGIN;
DO $$
DECLARE
_cursor CONSTANT refcursor := '_cursor';
BEGIN
LOOP
OPEN _cursor FOR
UPDATE uac.roles
SET parent_id = null,
PRIVILEGES = 'blablabla213',
autoload = 'blablabla2'
WHERE name = 'role_name2'
RETURNING *;
IF FOUND THEN
EXIT;
END IF;
CLOSE _cursor;
BEGIN
OPEN _cursor FOR
INSERT INTO uac.roles
(
parent_id,
name,
PRIVILEGES,
autoload
)
VALUES
(
null,
'role_name2',
'blablabla214',
'blabla21'
)
RETURNING *;
EXIT;
EXCEPTION
WHEN unique_violation THEN
END;
END LOOP;
END
$$;
FETCH ALL FROM _cursor;
COMMIT;
但内部变量“FOUND”将始终为false,因为光标的执行恰好在事务结束之前发生,因此它总是会插入值。
更新 没有功能它甚至可能吗?