Vous n'êtes pas identifié(e).

#1 12/09/2013 16:28:01

mystikilla
Membre

Procédure - nombre de paramètre OUT variable

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

#2 12/09/2013 23:11:55

gleu
Administrateur

Re : Procédure - nombre de paramètre OUT variable

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

#3 13/09/2013 09:31:18

mystikilla
Membre

Re : Procédure - nombre de paramètre OUT variable

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

Pied de page des forums