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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.