PostgreSQL尝试调用更新返回多行。

3

这个例子在PostgreSQL 9.1及以上版本中可以正常工作。不幸的是,在旧版本中无法工作,原因是update语句不支持with语句。我该如何将RETURNING放入数组中?我正在使用plpgsql编写一个函数。

begin

create table testing(
i serial,
t text);

insert into testing
(t)
values (null),(null),(null);

with abc AS (
update testing
set t = null
returning i )
select array_agg(i)
from abc;

rollback

感谢您的帮助!
1个回答

3
很遗憾,在9.1版本之前是做不到的,因为可写公共表达式(又称wCTE)仅在9.1版本中提供(请参见PostgreSQL功能矩阵上的“可写公共表达式”)。
我所能想到的唯一解决方案是在您的应用程序中执行此操作或使用函数,例如:
CREATE OR REPLACE FUNCTION test()
RETURNS int[]
VOLATILE
LANGUAGE plpgsql AS $$
DECLARE
    ret int[];
    aux int;
BEGIN
    ret := '{}';
    FOR aux IN
        UPDATE testing
        SET t = null
        RETURNING i
    LOOP
        ret := ret || aux;
    END LOOP;
    RETURN ret;
END;
$$;

无论如何,如果您使用的是早于此版本的版本,我建议您尽快升级到更新的版本(现在为9.3)。8.4版本即将失去支持,9.0版本将在明年失去支持(请参见versioning policy)。
编辑:
为了给那些使用PostgreSQL 9.1+的人留下一个参考,上述操作可以使用wCTE实现,具体操作如下:
WITH updt AS (
    UPDATE testing
    SET t = null
    RETURNING i
)
SELECT array_agg(i) FROM updt;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接