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

SQL Procédural MySQL Discussion :

problem fonction mysql


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut problem fonction mysql
    voila depuis un heure je bataille avec cette fonction mais rien marche est ce que la syntaxe est jute svp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE FUNCTION VERIFIERMOTIF (
        dv date,
        di date
        )
        RETURNS boolean deterministic
        BEGIN
            set @ok = false;
     
            if (@dv < @dinf )  then set    @ok = true;
            end if;
     
            return (@ok );
        END;
    //

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Tu n'as pas indiqué le DELIMITER et il y a le caractère HTML &nbsp; qui fait bizarre dans les paramềtres passés à la fonction.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    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
    26
    27
    28
    29
    CREATE FUNCTION VERIFIERMOTIF (
        im int(11),
        div date,
        dif date
       &nbsp;)
        RETURNS boolean deterministic
        BEGIN
     
            select 
                m.id_motif 
            from
                pvi p,
                motif m
            where 
                m.id_motif = p.id_motif and 
                m.id_motif= im and
                m.date_validite_amende = div and
                p.date_infraction = dif;
     
            set @ok = false;
     
            if (@div < @dif) then set    @ok = true;
            end if;
     
            return (@ok );
        END;
    //
     
    delimiter ;
    les trucs html à mon avis c'est quand j'ai copier la fonction
    ca fonctionne tooujours

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Par défaut
    Bonjour,

    'div' est un mot clef réservé donc il faut utiliser un autre nom.

    Ensuite il manque le début de votre procédure à savoir le premier délimiter.

    quelque chose de ce type devrait être plus correct :
    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
    26
     
    DELIMITER $$
    CREATE FUNCTION VERIFIERMOTIF (im int(11), div1 date, dif date )
        RETURNS BOOLEAN deterministic
        BEGIN
            SELECT 
                m.id_motif 
            FROM
                pvi p,
                motif m
            WHERE 
                m.id_motif = p.id_motif AND 
                m.id_motif= im AND
                m.date_validite_amende = div1 AND 
                p.date_infraction = dif$$
     
            SET @ok = false$$
     
            IF (@div1 < @dif) then 
                SET @ok = true$$
            end IF$$
     
            RETURN (@ok )$$
        END$$
     
    delimiter ;
    Ensuite vous effectuez un select sans récupérer la ou les valeurs retournées or vous avez spécifié un type de retour BOOLEAN. La requête va être exécutée et retournée un résultat erroné de part la signature de votre fonction. Après sans connaître le retour attendu de votre fonction difficile d'en dire plus

  5. #5
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    juste une petite explication sur les variables dans les procédure stockées ou fonctions:

    tu as les variables locales à la procédure soit passé dans l'entête genre:
    pour une procédure:
    pour une fonction:
    ou déclarée dans le corps de celle-ci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE truc int(4);

    et les variables globales commençant par un @ qui ne sont pas typée et qui peut être définie avant l'appel à la procédure et dont la valeur persiste après sa fin jusqu'à la fin de la session en cours pour l'utilisateur...

    donc truc et @truc c'est PAS DU TOUT la même variable...

    pour mightyduck, tu as rien compris à l'utilisation de DELIMITER... l'idée est que l'interpréteur sql ne s'arrête pas sur les ';' des instructions dans le corps de la procédure ou fonction pour exécuter correctement le CREATE PROCEDURE ou FUNCTION...

    pour tous les 2, on évite d'utiliser des globales quand c'est pas nécessaire et on leur préfère une variable locale... votre select ne sert à rien tel quel vu qu'il ne stocke rien... comme ça il ne peut que générer une erreur...

    le IF fait que quelque soit le résultat du sélect seul l'ordre des date compte... gros problème de modélisation de ce qui est voulu....

    je suppose que tu voulais chercher si un motif est apparu entre 2 dates...

    une version un peut mieux pourrais être:
    Code sql : 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
    DELIMITER $$
    CREATE FUNCTION VERIFIERMOTIF (im int(11), div1 date, dif date )
        RETURNS BOOLEAN deterministic
        BEGIN
            DECLARE ok bool;
            SELECT 
                count(m.id_motif)>0
            INTO ok
            FROM
                pvi p,
                motif m
            WHERE 
                m.id_motif = p.id_motif AND 
                m.id_motif= im AND
                m.date_validite_amende = div1 AND 
                p.date_infraction = dif;
     
            RETURN ok;
        END$$
     
    delimiter ;

    l'écriture de la requête ne correspond pas aux standards actuel de l'écriture des jointures...

    je vous conseille à tous les 2 de réviser les JOINTURES en sql...

    sqlpro a pondu un cours pas trop mal sur le sujet je vous recommande sa lecture...

    sans les tables et l'explication de ce qui est réellement cherché... je crois que tu as les pistes pour déjà avancer dans ton problème

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Par défaut
    Oula effectivement j'ai bouletisé le délimiteur est très mal placé !

    Je devais être à moitié réveillé ne tenez pas compte de mon post.

Discussions similaires

  1. problème fonctions callback
    Par youp_db dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 02/10/2005, 14h47
  2. probleme fonction gethostbyname
    Par oclone dans le forum Développement
    Réponses: 6
    Dernier message: 14/04/2005, 10h31
  3. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52
  4. Probleme api mysql
    Par ThomasC dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 06/09/2004, 16h00
  5. Probleme avec Mysql
    Par kevinss dans le forum Administration
    Réponses: 5
    Dernier message: 31/10/2003, 10h43

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