Я новичок в написании хранимых функций в postgresql и вообще. Я пытаюсь написать onw с входным параметром и вернуть набор результатов, хранящихся во временной таблице.
Я делаю следующее в своей функции.
1) Получить список всех потребителей и сохранить их идентификаторы, хранящиеся во временной таблице.
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;