postgresqlおよび一般的に保存された関数を書くのは初めてです。入力パラメータを使用してonwを記述し、一時テーブルに格納された一連の結果を返そうとしています。私は自分の関数で次のことを行います。1)すべてのコンシューマーのリストを取得し、一時テーブルに格納されているIDを格納します。2)特定のテーブルを反復処理し、上記のリストから各値に対応する値を取得して、一時テーブルに格納します。3)一時テーブルを返します。
これが私が自分で書こうとした関数です、
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が正しいかどうかはわかりません。また、一時テーブルを作成しようとすると、大量のエラーが発生します。
編集:関数を動作させましたが、関数を実行しようとすると次のエラーが発生します。
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;