2014-02-28 8 views
2

이 예제 문장은 postgresql 9.1 이상에서 올바르게 작동합니다. 불행히도 이전 버전에서는 작동하지 않습니다. 이유는 업데이트가 with 문을 지원하지 않기 때문입니다. 배열에 RETURNING을 넣을 수 있습니까? 나는 plpgsql을 사용하여 함수를 작성 중이다.postgresql이 여러 행을 반환하는 update를 호출하려고 시도합니다.

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 

감사합니다.

답변

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 참조).

EDIT :

WITH updt AS (
    UPDATE testing 
    SET t = null 
    RETURNING i 
) 
SELECT array_agg(i) FROM updt; 
:

PostgreSQL의 9.1+를 사용하여 이들에 대한 참조를 좌측으로, 상기 다음으로 wCTE하여 수행 할 수

관련 문제