postgresql试图调用update返回多行

时间:2014-02-28 10:00:04

标签: sql postgresql plpgsql

此示例语句在postgresql 9.1及更高版本中正常工作。不幸的是,它在旧版本中不起作用,原因是更新不支持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 个答案:

答案 0 :(得分:2)

不幸的是,你不能在9.1之前的版本上做到这一点,因为可写的公用表表达式(A.K.A wCTE)仅在9.1上可用(参见PostgreSQL feature matrix上的“可写公用表表达式”)。

我能看到的唯一解决方案是这种情况是在您的应用程序上执行此操作或使用函数,例如:

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;