PostgreSQL 9.4 UPSERT解决方法带有返回值

时间:2017-03-03 12:17:54

标签: postgresql upsert

我有一个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,因为光标的执行恰好在事务结束之前发生,因此它总是会插入值。

更新 没有功能它甚至可能吗?

0 个答案:

没有答案