Bonjour,

Je me bats avec PDOStatement pour exécuter un appel d'une fonction stockée qui attend deux tableaux en paramètre. Bref, rien de sorcier à première vue. Le hic, c'est que j'ai beau tout tordre dans tous les sens, je récupère toujours un message d'erreur.

Voici, la fonction stockée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE FUNCTION public.tempadd (
  num_att integer [],
  vals varchar []
)
RETURNS pg_catalog.void AS
$body$
BEGIN  
   FOR i IN 1..2 LOOP
      INSERT INTO t_temp ("numAttr", "valeur")
      VALUES (num_att[i]::INTEGER, vals[i]::VARCHAR);
   END LOOP;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100;
Cette fonction attend 2 paramètres tableaux : un tableau d'integer et un tableau de string.

Voici une des syntaxes qui passe (montée manuellement) avec PDOStatement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$sql = 'SELECT public.tempadd(ARRAY[50, 51], ARRAY[$$abc$$, $$def$$]);';
Ensuite j'ai essayé de passer ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$sql = 'SELECT public.tempadd(ARRAY[:n1, :n2], ARRAY[:v1, :v2]);';
On prépare la requête, on attache les valeurs aux paramètres du statement (bindValue ou bindParam, les 2 aucune erreur) et on fait un et là boum erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SQLSTATE[42883]: Undefined function: 7 ERREUR: la fonction public.tempadd(text[], text[]) n'existe pas LINE 1: SELECT public.tempadd(ARRAY[$1, $2], ARRAY[$3, $4]);
J'ai beau tourner dans tous les sens, il me semble impossible de faire autrement qu'en montant soit même la chaine sql.

Si vous êtes arrivé à contourner ce problème en utilisant PDOStatement, je suis preneur de l'astuce.
Merci