Fonction stockée avec table temporaire dans postgresql
Im nouveau à l'écriture de fonctions stockées dans postgresql et en général . Je suis en train d'écrire onw avec un paramètre d'entrée et retourne un jeu de résultats stockés dans une table temporaire.
Je n'ai la suite dans ma fonction .
1) Obtenez une liste de tous les consommateurs et de stocker leur id est stocké dans une table temporaire.
2) effectuer une Itération sur une table particulière et récupérer des valeurs correspondant à chaque valeur de la liste ci-dessus et de les stocker dans une table temporaire.
3)Retour à la table temp.
Voici la fonction que j'ai essayé d'écrire par moi-même ,
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;
Cependant je ne suis pas sûr de mon approche et si im droit aux points A et B comme je l'ai marqué dans le code ci-dessus.Et prise en charge des erreurs lors de la tentative de création de la table temporaire.
MODIFIER: ont la fonction de travail ,mais j'obtiens l'erreur suivante lorsque j'essaie d'exécuter la fonction.
ERROR: array value must start with "{" or dimension information
Voici ma fonction révisée.
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;
- si vous préférez, vous pouvez revenir ensemble de lignes au lieu d'une table temporaire
- pouvez-vous nous donner un exemple?
create function GetEmployees() returns setof employee as 'select * from employee;' language 'sql';
de ce wiki: wiki.postgresql.org/wiki/...
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, on ne peut pas déclarer des tableaux comme des variables dans postgres. Ce que vous pouvez faire est de créer un dans votre fonction du corps et de l'utiliser exhaustives (ou même à l'extérieur de la fonction). Méfiez-vous si la forme de tables temporaires ne sont pas baissé jusqu'à la fin de la session ou de commettre.
La voie à suivre consiste à utiliser RETOUR SUIVANT ou de la REQUÊTE de RETOUR
Comme pour la fonction type de résultat j'ai toujours trouvé les RETOURS de la TABLE pour être plus lisible.
edit:
Votre cons_id tableau est innecessary, juste itération les valeurs renvoyées par les sélectionnez.
Aussi, vous pouvez avoir plusieurs retour les instructions de requête dans une seule fonction pour ajouter le résultat de la requête, le résultat retourné par la fonction.
Dans votre cas:
edit2:
Vous avez probablement envie de prendre un coup d'oeil à cette solution pour groupwise-k-maximum de problème tant que c'est exactement ce que vous avez à traiter avec ici.
il pourrait être plus facile de retourner un tableau (ou une requête)
(copié à partir de postgresql docs)