Vous n'êtes pas identifié(e).
Pages : 1
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
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
merci bouceaup pour ton aide
Hors ligne
Pages : 1