Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/09/2007, 17h56   #1
Membre régulier
 
Inscription : mai 2003
Messages : 86
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 86
Points : 76
Points : 76
Par défaut [plpgsql] Clause in en parametre de fonction

Bonjour,
J'essaie d'envoyer le texte d'une clause IN en paramètre d'une fonction. Si je passe une seule valeur ça marche mais à partir de 2 le serveur n'arrive pas à faire le matching.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
CREATE OR REPLACE FUNCTION mafonction(text)
  RETURNS integer AS
$BODY$
DECLARE
	i bigint;
BEGIN
		SELECT INTO i count(DISTINCT id) FROM objects1 WHERE id IN($1);
		RETURN i;
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION mafonction(text);
Si je fais ça :
Code :
1
2
 
SELECT * FROM mafonction('202500066668693')
Ca me renvoie 1 (c'est bon).
Mais si je fais ça :
Code :
1
2
 
SELECT * FROM mafonction('202500066668693,202500001319972')
Ca me renvoie 0...
C'est sûrement un problème d'interprétation du paramètre mais je ne vois pas comment le résoudre.
tomtom7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 18h21   #2
Membre régulier
 
Inscription : mai 2003
Messages : 86
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 86
Points : 76
Points : 76
OK je crois que j'ai pigé.
Il fallait mettre ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
CREATE OR REPLACE FUNCTION mafonction(integer[])
  RETURNS integer AS
$BODY$
DECLARE
	i bigint;
BEGIN
		SELECT INTO i count(DISTINCT id) FROM objects1 WHERE id = ANY($1);
		RETURN i;
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION mafonction(integer[]);
tomtom7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 22h58   #3
Membre habitué
 
Inscription : août 2007
Messages : 128
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 128
Points : 146
Points : 146
Le problème vient du fait qu'il place la chaîne complète à la place indiquée. Donc quand $1 vaut '11111', il exécutera l'instruction :

Code :
SELECT INTO i count(DISTINCT id) FROM objects1 WHERE id IN('1111');
Et si $1 vaut '11111,22222', il exécutera l'instruction :

Code :
SELECT INTO i count(DISTINCT id) FROM objects1 WHERE id IN('11111,22222');
Autrement dit, il cherchera toutes les lignes dont la colonne id vaut la chaîne '11111,22222'.

Si tu veux qu'il utilise cette chaîne pour complètement l'intégrer à l'instruction tu dois utiliser EXECUTE :

Code :
EXECUTE 'SELECT count(DISTINCT id) FROM objects1 WHERE id IN(' || $1 || ');';
Attention, EXECUTE n'accepte pas la clause INTO dans un SELECT, il faut donc placer le INTO derrière et le type de cette variable doit être un RECORD. Bref, ça devient plus complexe que la solution que tu as trouvé...
gleu_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h18.


 
 
 
 
Partenaires

Hébergement Web