2011-11-28 2 views
2

PostgreSQL과 일반적으로 저장 함수를 작성하는 데 새로운 점이 있습니다. 입력 매개 변수로 onw를 작성하고 임시 테이블에 저장된 결과 세트를 리턴하려고합니다. 내 기능에서 다음을 수행합니다. 1) 모든 소비자의 목록을 가져 와서 임시 테이블에 저장된 ID를 저장하십시오. 2) 특정 테이블에 대해 반복하고 위 목록에서 각 값에 해당하는 값을 검색하고 임시 테이블에 저장합니다. 3) 임시 테이블을 반환하십시오. 나는 위의 코드에 표시 한대로 다음 postgresql의 임시 테이블을 가진 저장 함수

create or replace function getPumps(status varchar) returns setof record as $$ (setof record?) 
DECLARE 
cons_id integer[]; 
i integer; 
temp table tmp_table;--Point B 
BEGIN 
select consumer_id into cons_id from db_consumer_pump_details; 
FOR i in select * from cons_id LOOP 
    select objectid,pump_id,pump_serial_id,repdate,pumpmake,db_consumer_pump_details.status,db_consumer.consumer_name,db_consumer.wenexa_id,db_consumer.rr_no into tmp_table from db_consumer_pump_details inner join db_consumer on db_consumer.consumer_id=db_consumer_pump_details.consumer_id 
where db_consumer_pump_details.consumer_id=i and db_consumer_pump_details.status=$1--Point A 
order by db_consumer_pump_details.consumer_id,pump_id,createddate desc limit 2 
END LOOP; 
return tmp_table 
END; 
$$ 
LANGUAGE plpgsql; 

그러나 임 내 접근 방식에 대한 확인 및 B와 점 A에서 메신저를 잘인지하지 나 자신에 의해 작성 시도한 기능을,이다 . 그리고 임시 테이블을 만들려고하는 동안 오류가 발생했습니다.

편집 : 작동하는 함수가 있지만 함수를 실행하려고하면 다음 오류가 발생합니다.

ERROR: array value must start with "{" or dimension information 

다음은 필자의 수정 된 기능입니다.

create temp table tmp_table(objectid integer,pump_id integer,pump_serial_id varchar(50),repdate timestamp with time zone,pumpmake varchar(50),status varchar(2),consumer_name varchar(50),wenexa_id varchar(50),rr_no varchar(25)); 

    select consumer_id into cons_id from db_consumer_pump_details; 
    FOR i in select * from cons_id LOOP 
insert into tmp_table 
select objectid,pump_id,pump_serial_id,repdate,pumpmake,db_consumer_pump_details.status,db_consumer.consumer_name,db_consumer.wenexa_id,db_consumer.rr_no from db_consumer_pump_details inner join db_consumer on db_consumer.consumer_id=db_consumer_pump_details.consumer_id where db_consumer_pump_details.consumer_id=i and db_consumer_pump_details.status=$1 
order by db_consumer_pump_details.consumer_id,pump_id,createddate desc limit 2; 
END LOOP; 
return query (select * from tmp_table); 
drop table tmp_table; 
    END; 
    $$ 
    LANGUAGE plpgsql; 
+0

임시 테이블 대신 임시 테이블 – triclosan

+0

@ triclosan을 반환 할 수 있습니다. 예제를 제공해 주시겠습니까? – KodeSeeker

+0

'create 함수 GetEmployees()는 setof employee를 'select * from employee;'로 반환합니다. language 'sql'; '이 위키에서 : http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions – triclosan

답변

3

AFAIK를 반환하는 것이 더 쉬울 수 있습니다. 당신이 할 수있는 일은 당신의 기능 체 (funcion body)에 하나를 만들어 그것을 thourough (또는 심지어 기능의 외부)로 사용하는 것입니다. 임시 테이블은 세션이 종료되거나 커밋 될 때까지 삭제되지 않으므로주의하십시오.

이동하는 방법은 항상 RETURNS 표가 더 읽을 수있는 기능의 결과 유형에 관해서는 RETURN NEXT or RETURN QUERY

을 사용하는 것입니다.

편집 : cons_id 배열이 필요합니다. select에 의해 반환 된 값을 반복하면됩니다. 또한 단일 함수에서 여러 개의 return query 문을 사용하여 함수의 결과에 쿼리 결과를 추가 할 수 있습니다. 귀하의 경우에는

:

CREATE OR REPLACE FUNCTION getPumps(status varchar) 
RETURNS TABLE (objectid INTEGER,pump_id INTEGER,pump_serial_id INTEGER....) 
AS 
$$ 
BEGIN 
    FOR i in SELECT consumer_id FROM db_consumer_pump_details LOOP 

    RETURN QUERY(
     SELECT objectid,pump_id,pump_serial_id,repdate,pumpmake,db_consumer_pump_details.status,db_consumer.consumer_name,db_consumer.wenexa_id,db_consumer.rr_no FROM db_consumer_pump_details INNER JOIN db_consumer ON db_consumer.consumer_id=db_consumer_pump_details.consumer_id 
     WHERE db_consumer_pump_details.consumer_id=i AND db_consumer_pump_details.status=$1 
     ORDER BY db_consumer_pump_details.consumer_id,pump_id,createddate DESC LIMIT 2 
    ); 
    END LOOP; 
END; 
$$ 

EDIT2 :

당신은 아마 당신이 여기 다루고 정확히 무엇으로 GroupWise에 K-최대 문제에 대한 this 솔루션에서 살펴 봐야 할

.

+0

내가 편집 한 글을 보았습니까? – KodeSeeker

+0

예, 제 편집 – soulcheck

+0

을 참조하십시오, 감사합니다!관련이없는 약간의 수정으로 완벽하게 잘 작동하는 위 쿼리에서 반환되는 총 레코드 수를 가져 오는 방법이 있습니까? (*) 분명히 작동하지 않는 것처럼. – KodeSeeker

0

단지 (postgresql docs에서 복사) 테이블 (또는 쿼리)

CREATE FUNCTION extended_sales(p_itemno int) 
RETURNS TABLE(quantity int, total numeric) AS $$ 
BEGIN 
    RETURN QUERY SELECT quantity, quantity * price FROM sales 
      WHERE itemno = p_itemno; 
END; 
$$ LANGUAGE plpgsql; 

하나가 포스트 그레스에서 변수로 테이블을 선언 할 수 없습니다