IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

problème de syntaxe pour une fonction


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 9
    Points
    9
    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 : 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.

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    en fait, tes arguments sont des constantes, tu peux creer une variable pour outrepasser ca :

    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
    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)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Problème de syntaxe pour mettre une ligne en gras
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/04/2015, 13h43
  2. [AC-2007] Problème d'exécution entre requète et module pour une fonction quartile
    Par Fcnaatao dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 28/02/2012, 09h50
  3. [AC-2007] Problème de syntaxe pour une formule SQL en VBA
    Par franckimmo dans le forum IHM
    Réponses: 4
    Dernier message: 12/02/2010, 10h54
  4. Probléme argument pour une fonction d'un SLOT
    Par guillaume40 dans le forum Qt
    Réponses: 3
    Dernier message: 03/03/2008, 13h55
  5. paramètres pour une fonction
    Par bul dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/05/2005, 07h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo