Re: Tableau dans une requête

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: pgsql-fr-generale(at)postgresql(dot)org
Cc: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
Subject: Re: Tableau dans une requête
Date: 2009-09-13 17:35:40
Message-ID: 200909131935.40395.guillaume@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Le dimanche 13 septembre 2009 à 19:15:05, Samuel ROZE a écrit :
> Erreur SQL :-/
>
>
> ERREUR: erreur de syntaxe sur ou près de « $1 »
> LINE 1: ... FROM graphiques.critere WHERE lib_critere = ANY $1 ::varch...
> ^
> QUERY: SELECT id_couple_critere , count(*) FROM graphiques.critere WHERE
> lib_critere = ANY $1 ::varchar(50)[] GROUP BY id_couple_critere HAVING
> count(*) = array_upper( $1 , 1) CONTEXT: SQL statement in PL/PgSQL
> function "getcouplecriteresid" near line 8
>
> Dans l'instruction :
>
>
> CREATE OR REPLACE FUNCTION graphiques.getCoupleCriteresId ( v_criteres
> varchar(50)[] ) RETURNS integer AS $$ DECLARE
> v_id_couple integer;
> BEGIN
> SELECT id_couple_critere , count(*) INTO v_id_couple
> FROM graphiques.critere
> WHERE lib_critere = ANY v_criteres::varchar(50)[]
> GROUP BY id_couple_critere
> HAVING count(*) = array_upper(v_criteres, 1);
>
> RETURN v_id_couple;
> END;
> $$ LANGUAGE plpgsql;
>
> Le dimanche 13 septembre 2009 à 19:07 +0200, Guillaume Lelarge a écrit :
> > Le dimanche 13 septembre 2009 à 18:49:40, Samuel ROZE a écrit :
> > > ERREUR: erreur de syntaxe sur ou près de « $1 »
> > > LINE 1: ... FROM graphiques.critere WHERE lib_critere = ANY $1 GROUP
> > > ... ^ QUERY: SELECT id_couple_critere , count(*) FROM
> > > graphiques.critere WHERE lib_critere = ANY $1 GROUP BY
> > > id_couple_critere HAVING count(*) = array_upper( $1 , 1) CONTEXT: SQL
> > > statement in PL/PgSQL function "getcouplecriteresid" near line 11
> > >
> > > Il semblerait que ça ne marche pas... Je vais me pencher sur
> > > array_to_string, qui me semble être une bien bonne solution.
> > >
> > > Le dimanche 13 septembre 2009 à 18:44 +0200, Guillaume Lelarge a écrit :
> > > > Le dimanche 13 septembre 2009 à 18:22:48, Samuel ROZE a écrit :
> > > > > [...]
> > > > > CREATE OR REPLACE FUNCTION graphiques.getCoupleCriteresId (
> > > > > v_criteres varchar(50)[]) ) RETURNS integer AS $$
> > > > > DECLARE
> > > > > v_id_couple integer;
> > > > > BEGIN
> > > > > SELECT id_couple_critere , count(*) INTO v_id_couple
> > > > > FROM graphiques.critere
> > > > > WHERE lib_critere IN ANY 'v_criteres'::varchar(50)[]
> > > > > GROUP BY id_couple_critere
> > > > > HAVING count(*) = array_upper(v_criteres, 1);
> > > > >
> > > > > RETURN v_id_couple;
> > > > > END;
> > > > > $$ LANGUAGE plpgsql;
> > > > >
> > > > > J'ai une erreur lorsque je créé la fonction:
> > > > >
> > > > > ERREUR: erreur de syntaxe sur ou près de « ANY »
> > > > > LINE 1: ...t(*) FROM graphiques.critere WHERE lib_critere IN ANY
> > > > > 'v_cri... ^ QUERY: SELECT id_couple_critere , count(*) FROM
> > > > > graphiques.critere WHERE lib_critere IN ANY
> > > > > 'v_criteres'::varchar(50)[] GROUP BY id_couple_critere HAVING
> > > > > count(*) = array_upper( $1 , 1) CONTEXT: SQL statement in PL/PgSQL
> > > > > function "getcouplecriteresid" near line 8
> > > > >
> > > > > Comment puis-je passer ce tableau dans une requête ?
> > > >
> > > > Le problème n'est pas dans le paramètre, mais dans la requête du
> > > > count(*). À première vue, je dirais qu'on ne fait pas un IN ANY mais
> > > > un = ANY.
> >
> > Je maintiens pour le « = ANY », mais je n'avais pas vu le guillemet pour
> > la variable, ce qui inévitablement pose problème. Il faut virer les
> > guillemets simples au début et à la fin de v_criteres dans la requête.
>

Et il manque maintenant les parenthèses autour de v_criteres. Ainsi:

CREATE OR REPLACE FUNCTION graphiques.getCoupleCriteresId ( v_criteres
varchar(50)[] ) RETURNS integer AS $$
DECLARE
v_id_couple integer;
BEGIN
SELECT id_couple_critere , count(*) INTO v_id_couple
FROM graphiques.critere
WHERE lib_critere = ANY (v_criteres::varchar(50)[])
GROUP BY id_couple_critere
HAVING count(*) = array_upper(v_criteres, 1);

RETURN v_id_couple;
END;
$$ LANGUAGE plpgsql;

La fonction se crée chez moi (sur une 8.3, vu que ma 8.4 semble cassée).

--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Samuel ROZE 2009-09-13 17:43:11 Re: Tableau dans une requête
Previous Message Samuel ROZE 2009-09-13 17:35:19 Re: Tableau dans une requête