Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
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 22/09/2011, 21h15   #1
Invité de passage
 
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 0
Points : 0
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 :
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;
//
azebou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 09h37   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 10h24   #3
Invité de passage
 
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 0
Points : 0
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
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
azebou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 10h21   #4
Membre régulier
 
Homme Julien SIMON
Ingénieur systèmes et réseaux
Inscription : février 2006
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Julien SIMON
Âge : 26
Localisation : France

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

Informations forums :
Inscription : février 2006
Messages : 100
Points : 99
Points : 99
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 :
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
MightyDucks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 06h14   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 870
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 870
Points : 1 355
Points : 1 355
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 :
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 :
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
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 09h06   #6
Membre régulier
 
Homme Julien SIMON
Ingénieur systèmes et réseaux
Inscription : février 2006
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Julien SIMON
Âge : 26
Localisation : France

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

Informations forums :
Inscription : février 2006
Messages : 100
Points : 99
Points : 99
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.
MightyDucks est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h20.


 
 
 
 
Partenaires

Hébergement Web