PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 20/11/2017 18:43:30

Soni03
Membre

Utilisation d'un retour fonction dans un array qui ne fonctionne pas

Bonjour à toutes et à tous,

Je cherche à utiliser une fonction recursive qui fonctionne correctement lorsque je fais un simple select, mais pas quand je l'insère dans un bloc de fonction.

La fonction est powerset trouvé sur : https://www.postgresql.org/message-id/2 … e.fuhr.org



SELECT * FROM powerset2(ARRAY['A','B','C']);
...
DECLARE
v_test2 text[];
tab_couple varchar[] := ARRAY['A','B','C'];

BEGIN
      FOR v_test2
	IN 
	SELECT * FROM "powerset2"(tab_couple)
	
	LOOP
		RAISE NOTICE '%:TEST : %', i,v_test2[i];
		i := i + 1;
	
	END LOOP;

END;

Cela fonctionne très bien en SELECT standard, mais lors de l'intégration dans un bloc pgSQL cela ne fonctionne plus : je n'arrive pas à avoir l'ensemble des résultats, j'ai juste :

NOTICE:  1:TEST : A
NOTICE:  2:TEST : <NULL>
NOTICE:  3:TEST : <NULL>
NOTICE:  4:TEST : <NULL>
NOTICE:  5:TEST : <NULL>
NOTICE:  6:TEST : <NULL>
NOTICE:  7:TEST : <NULL>

Au lieu de :

"{A}"
"{B}"
"{A,B}"
"{C}"
"{A,C}"
"{B,C}"
"{A,B,C}"

Je demande donc votre aide, car je suis sec sur le sujet... ! J'ai l'impression qu'il y a un problème de déclaration de variable et d'affectation... !

Merci d'avance ...

Hors ligne

#2 20/11/2017 21:38:53

Marc Cousin
Membre

Re : Utilisation d'un retour fonction dans un array qui ne fonctionne pas

Le problème vient du fait que la fonction n'est pas complète, et que votre gestion de la variable i est fausse: si vous voulez accéder aux éléments de v_test2, il faut dans le LOOP boucler sur les indices du tableau.

create or replace function test() returns void language plpgsql as
$$
DECLARE
v_test2 text[];
tab_couple varchar[] := ARRAY['A','B','C'];
i int;

BEGIN
      FOR v_test2
        IN 
        SELECT * FROM "powerset"(tab_couple)
        
        LOOP
                IF array_length(v_test2,1) IS NOT NULL -- not empty array
                THEN
                        FOR i IN 1 .. array_length(v_test2,1)
                        LOOP
                                RAISE NOTICE '%:TEST : %', i,v_test2[i];
                        END LOOP;
                ELSE
                        RAISE NOTICE 'Empty array';
                END IF;
        
        END LOOP;

END;
$$;

Marc.

Hors ligne

Pied de page des forums