2017-04-11 2 views
0

자습서를 여러 번 사용해 보았지만 실패했습니다. 누군가 제게 몇 가지 예를 들어 주시겠습니까? 나는 순간 기억 방법은 함수를 반환 세트를 선언하는PostgreSQL 함수에서 쿼리 결과의 행을 반환하는 방법은 무엇입니까?

create or replace function find() returns SETOF RECORD 
as $$ 
declare A SETOF RECORD; 
begin 
    A=(
     select x,y 
     from ....... 

    ) 
    CASE WHEN EXISTS A 
    THEN returns query A 
    ELSE returns query (
     select x,y 
     from ...... 
    ) 
    END; 

end; 
$$ language plpgsql; 
+2

오류 무엇인가 여기 내 코드, 그것은 "유효하지 않은 유형 이름 'SETOF RECORD'ERROR"가 있음을하라는 메시지 너? 너 정확히 뭘 하려구? (** [편집] ** 귀하의 질문에 덧글에 추가 정보를 게시하지 마십시오.) –

답변

1

:

--example 1 
create or replace function test() returns SETOF RECORD 
as $$ 
begin 
    RETURN QUERY SELECT * FROM generate_series(1,100); 
end; 
$$ language plpgsql; 
--test output 
select * from test() AS a(b integer) 

--example 2 
create or replace function test2() returns TABLE (b integer) 
as $$ 
begin 
    RETURN QUERY SELECT * FROM generate_series(1,100); 
end; 
$$ language plpgsql; 
--test output 
select * from test2() 

--example 3 
create or replace function test3() returns SETOF RECORD 
as $$ 
declare 
    r record; 
begin 
    FOR r IN SELECT * FROM generate_series(1,100) LOOP 
     RETURN NEXT r; 
    END LOOP; 
end; 
$$ language plpgsql; 
--test output 
select * from test3() AS a(b integer); 

--example 4 
create or replace function test4() returns setof record 
as $$ 
    SELECT * FROM generate_series(1,100) 
$$ language sql; 
--test output 
select * from test4() AS a(b integer); 

--example 5 
create or replace function test5() returns setof integer 
as $$ 
begin 
    RETURN QUERY SELECT * FROM generate_series(1,100); 
end; 
$$ language plpgsql; 
--test output 
select * from test5() 

--example 6 
create or replace function test6(OUT b integer, OUT c integer) RETURNS SETOF record 
as $$ 
begin 
    RETURN QUERY SELECT b.b, b.b+3 AS c FROM generate_series(1,100) AS b(b); 
end; 
$$ language plpgsql; 
--test output 
select * from test6() 
+0

감사. 그리고 쿼리 결과가 존재하는지 결정할 필요가있을 때 어떻게해야합니까? 내가하고 싶은 일은 그것이 존재할 때 반환하고, 그렇지 않으면 다른 쿼리의 결과를 반환하는 것입니다. – Chen

+0

쿼리에 따라'FULL JOIN','UNION' 또는'DISTINCT ON' 가능성이 있습니다. 함수 선언과는 아무런 관련이 없다고 생각합니다. 변수에'SETOF RECORD'를 저장하지 마십시오. –

관련 문제