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 :
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 :
$sql = 'SELECT public.tempadd(ARRAY[50, 51], ARRAY[$$abc$$, $$def$$]);';
Ensuite j'ai essayé de passer ceci :
$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 :
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
Partager