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 :

utiliser le resultat d´un select dans une fonction


Sujet :

PostgreSQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Points : 29
    Points
    29
    Par défaut utiliser le resultat d´un select dans une fonction
    Bonsoir à tous

    J´ai plusieurs tables et je voudrai dans une fonction de validation pour des une valeur ecrite dans une table, ceci en prennant à l´aide d´un select une valeur dans une autre table. ma fonction se presente ainsi:

    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 OR REPLACE FUNCTION delay_check(integer)
      RETURNS boolean AS
    $BODY$
    DECLARE 
     
    BEGIN
     
    IF ($1 < 0 ) 
     THEN
    Raise Exception 'Test|numb1|delay|WRONG_DELAY|%|is a wrong delay (% < 0)',$1,$1;
    END IF;
     
    SELECT * FROM numb1_layout max_value;
     
    IF ($1 > max_value)
    THEN
    Raise Exception 'Test|numb1|delay|WRONG_DELAY|%|is a wrong delay (% > %}$',$1,$1,max_value;
    END IF;
    RETURN true;
    END;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION delay_check(integer) OWNER TO postgres;
    Je recois comme méssage d´erreur "les resultas du select ne sont pas utilisés". Est ce qu´un d´entre vous aurait une idée comment resoudre ce problème?
    Merci d´avance et bonne fin de soirée.

    YP

  2. #2
    jnore
    Invité(e)
    Par défaut
    Bonjour,

    Il te faut deja declarer une variable sous 'DECLARE' puis intégrer dans la variable la valeur de ton select:

    comme ceci
    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
    25
    CREATE OR REPLACE FUNCTION delay_check(integer)
    RETURNS BOOLEAN AS
    $BODY$
    DECLARE 
    max_value INTEGER; ///si la variable est un integer 
    BEGIN
     
    IF ($1 < 0 ) 
     THEN
    Raise Exception 'Test|numb1|delay|WRONG_DELAY|%|is a wrong delay (% < 0)',$1,$1;
    END IF;
     
    SELECT INTO max_value champ_a_recuperer 
    FROM numb1_layout
    WHERE ligne=critere; ///BIEN S'ASSURER QUE TU ES FILTRE POUR N'AVOIR QU'UNE LIGNE 
    IF ($1 > max_value)
    THEN
    Raise Exception 'Test|numb1|delay|WRONG_DELAY|%|is a wrong delay (% > %}$',$1,$1,max_value;
    END IF;
    RETURN true;
    END;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION delay_check(integer) OWNER TO postgres;
    Il est possible aussi d'associer toute une ligne dans une variable "RECORD" que tu pourra décomposer en cas de besoin.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Points : 29
    Points
    29
    Par défaut Merci pour ta reaction
    Bonjour

    déjà merci pour ta reaction, mais j´ai encore une question, à quoi correspond champ_a_recuperer dans dans ton code à ce niveau ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT INTO max_value champ_a_recuperer 
    FROM numb1_layout
    WHERE ligne=critere; ///BIEN S'ASSURER QUE TU ES FILTRE POUR N'AVOIR QU'UNE LIGNE
    merci encore

    YP

  4. #4
    jnore
    Invité(e)
    Par défaut
    Ce champ correspond à ta valeur que tu veux récupérer.
    J'ai mis ce nom parceque je ne connais pas le nom de tes champs de table.

    Mets nous ta requete avec tes noms de champ.

    L'objectif est de récupérer la valeur du champ en question et de le mettre dans une variable.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Points : 29
    Points
    29
    Par défaut
    j´ai deux tables numb1(avec comme colones: id, phone_number,email_adress, sip_adress,Port_number, url,delay) et numb1_layout(avec comme colones:id,name,min_value et max_value).
    Dans la table numb1_layout j´ai les valeurs suivantes (1 dans id, delay dans name, 0 dans min_value et 30 dans max_value).
    Je souhaite ecire une fonction pour valider les valeurs entrées dans numb1 pour la colone delay et pour cela j´aimerai prendre à l´aide d´un select la valeur dans max_value de numb1_layout et l´utiliser comme base de comparaison.

  6. #6
    jnore
    Invité(e)
    Par défaut
    OK, mais dans ta table numb1_layout, j'imagine que t'as plusieurs lignes.
    Y a t-il un critère de filtrage?
    Parceque si tu fais un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select max_value from numb1_layout;
    , tu auras trop de ligne.

  7. #7
    jnore
    Invité(e)
    Par défaut
    Essaie ceci quand même:

    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 OR REPLACE FUNCTION delay_check(integer)
    RETURNS BOOLEAN AS
    $BODY$
    DECLARE 
    value INTEGER; ///si la variable est un integer 
    BEGIN
     
    IF ($1 < 0 ) 
     THEN
    Raise Exception 'Test|numb1|delay|WRONG_DELAY|%|is a wrong delay (% < 0)',$1,$1;
    END IF;
     
    SELECT INTO value max(max_value) FROM numb1_layout
     
    IF ($1 > value)
    THEN
    Raise Exception 'Test|numb1|delay|WRONG_DELAY|%|is a wrong delay (% > %}$',$1,$1,value;
    END IF;
    RETURN true;
    END;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION delay_check(integer) OWNER TO postgres;

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Points : 29
    Points
    29
    Par défaut
    salut

    ca ne pourrait pas fonctionner, parce que je n´ai pas dans la table numb1_layout une colone du nom value, mais plutôt les colones suivantes: id, name,min_value et max_value. Dans cette table il n´y a qu´une seule ligne avec des valeurs. quand je fais un select normal comme celui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT max_value FROM numb1_layout;
    ca me remet une seule ligne avec la valeur dans max_value. La question est comment recuperer cette valeur pour l´utiliser dans le reste de ma fonction?

  9. #9
    jnore
    Invité(e)
    Par défaut
    "value" ici n'est pas un nom de champ mais une variable qui va recevoir la valeur du champ "max_value".

    Regarde ici la syntaxe pour faire ce genre de manipulation:
    http://www.postgresql.org/docs/8.2/s...tatements.html
    Dernière modification par Deepin ; 06/07/2011 à 09h47.

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

Discussions similaires

  1. [XL-2010] Utiliser sheet.select dans une fonction personnalisée
    Par sebkem dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/04/2015, 15h37
  2. Réponses: 3
    Dernier message: 27/07/2011, 11h57
  3. Utiliser la valeur d’un textbox dans une requete sql
    Par Developpeur19 dans le forum VB.NET
    Réponses: 8
    Dernier message: 14/11/2008, 09h10
  4. Utilisation de variables de Gui dans une fonction
    Par campofelliz dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 20/08/2007, 17h46
  5. Réponses: 23
    Dernier message: 10/01/2007, 01h09

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