Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je souhaite écrire une procédure dont je ne connais pas à l'avance le nombre de sorties (OUT) car la requête la constituant est
construite en dynamique...
expl:
CREATE OR REPLACE FUNCTION p_test()
RETURNS setof record AS
$BODY$
DECLARE
rec RECORD;
txtquery text;
i integer;
_tab_element text[];
_tab_idelement integer[];
BEGIN
i=0;
for rec in (select idelement,element from elements)
loop
_tab_idelement[i] = rec.idelement;
_tab_element[i] = rec.element;
i = i +1;
end loop;
txtquery := 'select chp1,chp2';
FOR i IN 0..array_length(_tab_element,1)-1 LOOP
-- ajout de champs dans mon select selon les valeurs renseignées dans le tableau
txtquery := txtquery || ',' || _tab_element[i] || '.taux as ' || _tab_element[i];
END LOOP;
txtquery :=txtquery || ' FROM table ';
return query execute txtquery;
END;
$BODY$
LANGUAGE plpgsql STABLE
COST 100;
ALTER FUNCTION p_etat_stocks_suivi_compo()
Est-ce possible ? car pour l'instant voici la sortie de mon appel de procédure :
ERREUR: une liste de définition de colonnes est requise pour les fonctions renvoyant un « record »
Merci
Hors ligne
Comme le message l'indique, vous devez préciser la liste des colonnes dans la requête appelant la fonction.
Voici un exemple minimaliste :
b1=# create or replace function f1() returns setof record language plpgsql
as $$
begin
return next (1, 'un'::text);
end
$$;
CREATE FUNCTION
b1=# select * from f1();
ERREUR: une liste de définition de colonnes est requise pour les fonctions renvoyant
un « record »
LINE 1: select * from f1();
^
b1=# select * from f1() tmp(c1 integer, c2 text);
c1 | c2
----+----
1 | un
(1 row)
Guillaume.
Hors ligne
Merci pour cette réponse,
effectivement si je précise la liste des colonnes dans la requête appelant la fonction, ça fonctionne.
Seulement ça déporte mon problème car je ne sais pas combien de champs je doit préciser dans ma fonction appelante... Ou alors il
faudrait que je puisse passer un tableau ou un select dans la liste des champs temporaire du genre :
select * from f1() tmp(c1 integer, array_to_string(array(select champs from table)));
Hors ligne
Pages : 1