我是在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;
但林不知道我的方法以及是否在A點和B IM權利,我已經標註在上面的代碼。在嘗試創建臨時表時遇到一些錯誤。
編輯:得到了可以工作的函數,但是當我嘗試運行該函數時出現以下錯誤。
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;
如果你願意,你可以返回行集,而不是臨時表 – triclosan
@triclosan,你能舉個例子嗎? – KodeSeeker
'create function GetEmployees()將setof employee返回爲select * from employee;'語言'sql';'從這個wiki:http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions – triclosan