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/04/2011 15:52:34

gharras
Membre

probleme avec tableau 2 dimension

salut,

mon problème c'est que j'ai une fonction que je lui passe deux tableau comme paramètre, et avec c'est deux tableau je doit créer une matrice. Mais le problème c'est que je ne sais pas comment donner a ma matrice les dimension nécessaire pour que je puisse l'utiliser.
Il me donne a chaque fois une erreur d'indice en dehors de l'échelle.
voila le code qui me donne le probleme

--vec1 et vec2 sont deux tableau que je passe en parametre de la fonction
FOR i IN REVERSE array_length(vec1, 1)..1 LOOP
		RAISE NOTICE 'i is %', i;
		FOR j IN REVERSE array_length(vec2, 1)..1 LOOP
			RAISE NOTICE 'j is %', j;
			matrice[i][j] := abs(vec1[i] - vec2[j]);
		end loop;
	end loop;

et voila ma requête

SELECT ma_fonction(
    array[1.0, 0.23, 0.7, 0.87],
    array[1.0, 0.23, 0.7]
);

et voila le resultat

NOTICE:  i IS 3
NOTICE:  j IS 4
NOTICE:  j IS 3
 
ERREUR:  indice du tableau en dehors de l'échelle
 
État SQL :2202E

Hors ligne

#2 20/04/2011 17:03:58

Marc Cousin
Membre

Re : probleme avec tableau 2 dimension

C'est un peu difficile. Le problème, c'est qu'en plpsql, une fois qu'un tableau multidimmensionnel est créé, il est de taille fixe (ce n'est pas vrai pour les tableaux à une seule dimension).
On peut s'en sortir en affectant un tableau de 0 à la matrice d'emblée, comme ça:

CREATE OR REPLACE FUNCTION test(vec1 real[], vec2 real[]) returns void language plpgsql as $$
declare
matrice real[][];

BEGIN
matrice:=array_fill(0::real,ARRAY[array_length(vec1, 1),array_length(vec2, 1)]);
    
FOR i IN REVERSE array_length(vec1, 1)..1 LOOP
        RAISE NOTICE 'i is %', i;
        FOR j IN REVERSE array_length(vec2, 1)..1 LOOP
            RAISE NOTICE 'j is %', j;
            matrice[i][j] := abs(vec1[i] - vec2[j]);
            RAISE NOTICE 'matrice is %', matrice;
        end loop;
    end loop;
end;
$$
;

Sinon, il y a des langages de PL qui pourraient être plus appropriés, mais c'est une dépendance de plus (PL/R par exemple).


Marc.

Hors ligne

#3 20/04/2011 19:40:40

gharras
Membre

Re : probleme avec tableau 2 dimension

merci bouceaup pour ton aide

Hors ligne

Pied de page des forums