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 27/07/2007, 02h05   #1
Invité de passage
 
Inscription : juin 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 6
Points : 2
Points : 2
Par défaut problème de syntaxe pour une fonction

Bonsoir à Tous,

Après avoir cherché dans les post sans résultat, j'aimerais avoir vos avis sur une difficulté de syntaxe. J'essaye de créer une fonction qui me retourne 2 champs l'un de type int et l'autre de type float ce qui correspond au select et je réalise en même temps un update.

J'ai déclaré le type suivant:
Code :
1
2
 
CREATE TYPE soustraire_qtite AS (id_lot INTEGER, quantite FLOAT);
J'essaye la fonction suivante dont les requêtes INSERT et UPDATE sont fonctionnelles:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE FUNCTION soustraire_qtite(INTEGER, FLOAT) RETURNS SETOF soustraire_qtite AS
'
	DECLARE			
		enr soustraire_qtite; 		
	begin		
		while $2 != 0 loop			
			SELECT INTO enr id_lot, (quantite_restante - $2) AS quantite FROM lot 
			WHERE id_mp = $1  AND date_peremption LIKE 
			(SELECT min(date_peremption) FROM lot where id_mp = $1 AND quantite_restante != 0); 
			UPDATE lot SET quantite_restante = (quantite_restante - $2) 
			WHERE id_mp = $1  AND date_peremption LIKE 
			(SELECT min(date_peremption) FROM lot where id_mp = $1 AND quantite_restante != 0); 
 
			if enr.quantite >= 0 then	
				$2 := 0;
			end if;
		end loop;
		RETURN NEXT enr;	
		RETURN;	
	end;
'
  LANGUAGE 'plpgsql';
Lorsque j'exécute la requête, il m'affiche le message d'erreur suivant qui correspond à l'instruction $2 := 0;
Code :
1
2
3
 
ERROR:  "$2" IS declared CONSTANT
CONTEXTE : compile of PL/pgSQL FUNCTION "soustraire_qtite" near line 13
C'est certainement une bétise mais je ne vois. Quelqu'un aurait-il une idée? Merci pour vos avis.
gero123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 08h16   #2
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
en fait, tes arguments sont des constantes, tu peux creer une variable pour outrepasser ca :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE FUNCTION soustraire_qtite(INTEGER, FLOAT) RETURNS SETOF soustraire_qtite AS
'
	DECLARE			
		enr soustraire_qtite;
                i float; 		
	begin		
            i:=$2;
		while i != 0 loop			
			SELECT INTO enr id_lot, (quantite_restante - i) AS quantite FROM lot 
			WHERE id_mp = $1  AND date_peremption LIKE 
			(SELECT min(date_peremption) FROM lot where id_mp = $1 AND quantite_restante != 0); 
			UPDATE lot SET quantite_restante = (quantite_restante - i) 
			WHERE id_mp = $1  AND date_peremption LIKE 
			(SELECT min(date_peremption) FROM lot where id_mp = $1 AND quantite_restante != 0); 
 
			if enr.quantite >= 0 then	
				i := 0;
			end if;
		end loop;
		RETURN NEXT enr;	
		RETURN;	
	end;
'
  LANGUAGE 'plpgsql';

ou sinon, mais dans ce cas ce n'est pas judicieux, utiliser les OUT dans les arguments. (qui ne sont plus des constantes)
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 12h11   #3
Invité de passage
 
Inscription : juin 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 6
Points : 2
Points : 2
Un grand merci hpalpha ! Je viens de tester ta solution et elle fonctionne parfaitement!
Pourrais-tu me dire pourquoi les paramètres passés en argument sont considérés comme constants? Est-ce le fait de les manipuler directement sans passer par des variables intermédiaires qui les rend constants?
Encore merci.
gero123 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 10h27.


 
 
 
 
Partenaires

Hébergement Web