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 :

Error 1064 pour fonction.


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut Error 1064 pour fonction.
    Bonjour,

    Je suis en train de créer un script en MYSQL (version 5.6.17).
    Je viens d'avoir une erreur au début du script :

    Error 1064 (42000) at line 5 : Erreur de syntaxe près de 'BEGIN
    DECLARE StartDate DATETIME;
    DECLARE EndDate DATETIME;
    DECLARE PreceedingOldValue INT DEFAULT 0;
    DECLARE Preceedin'
    Et voici mon code, qui commence comme ça:
    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
     
    DROP FUNCTION IF EXISTS getHours;
     
    DELIMITER //
     
    CREATE FUNCTION getHours()
    	BEGIN
    	DECLARE StartDate DATETIME;
    	DECLARE EndDate DATETIME;
    	DECLARE PreceedingOldValue INT DEFAULT 0;
    	DECLARE PreceedingNewValue INT DEFAULT 0;
    	DECLARE CurrentTicket INT DEFAULT 0;
    	DECLARE NbWorkingDays INT DEFAULT 0;
    	DECLARE items_id, id, old_value, new_value, id_users INT(10);
    	DECLARE date_mod, creation_date DATETIME;
    	DECLARE name VARCHAR(50);
    	DECLARE NbHours INTEGER DEFAULT 0;
     
    (...)
     
    END;
    //
    DELIMITER;
    J'ai suivi la documentation MYSQL mais je ne vois pas où ça coince, quelqu'un une idée ?

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Si c'est une procédure stockée, il faut utiliser CREATE PROCEDURE.

    Si c'est une fonction, il faut préciser le type de résultat avec une clause RETURNS avant le BEGIN.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut ... merci donc :
    Bonjour,

    Merci pour votre réponse.
    Il s'agit bien d'une fonction, pas d'une procédure stockée. Il n'y a pas de valeur retournée, donc je n'ai pas mis de clause "RETURNS <type>".

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    RETURNS est obligatoire pour les fonctions...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    OK, donc j'ai mis à la fin un Ma fonction est :

    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
    DROP FUNCTION IF EXISTS getHours;
     
    DELIMITER //
     
    CREATE FUNCTION getHours()
    	RETURNS BIT;
    	BEGIN
    	DECLARE StartDate DATETIME;
    	DECLARE EndDate DATETIME;
    	DECLARE PreceedingOldValue INT DEFAULT 0;
    	DECLARE PreceedingNewValue INT DEFAULT 0;
     
    (...)
     
    RETURN 1;
    END;
    //
    J'ai la même erreur.
    Je ne vois toujours pas d'où ça peut venir :
    Est-ce qu'il faut supprimer des lignes vides? Est-ce qu'il y a des conditions particulières pour les noms/longueur des variables?

    Merci.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par catadanna Voir le message

    J'ai la même erreur.
    Je ne vois toujours pas d'où ça peut venir :
    Est-ce qu'il faut supprimer des lignes vides? Est-ce qu'il y a des conditions particulières pour les noms/longueur des variables?

    Merci.
    Il ne faut pas mettre de point-virgule entre RETURNS et BEGIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELIMITER //
    CREATE FUNCTION getHours()
     RETURNS BIT
     BEGIN
     DECLARE StartDate DATETIME;
    RETURN 1;
    END;
    //
    Query OK, 0 rows affected (0.00 sec)
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut Merci!
    En effet, ça marche comme ça! Merci à vous !

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Ceci dit, si tu n'utilises pas le résultat de la fonction, ça devrait logiquement être une procédure stockée... en fait ça change surtout la façon dont elle est appelée.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    Merci!

    En fait, le résultat est stocké dans une table temporaire. Je ne crée pas de procédure stockée, mais une fonction, car j'ai des restrictions concernant l'insertion dans la base.

    Amicalement.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut Autre chose :
    Bonjour,

    Puisque j'y suis : je n'arrive pas à lancer la fonction. Logiquement, à la fin du fichier, après la déclaration, je lance la fonction :

    J'ai le même message d'erreur.

    Quelqu'un a une idée?

    Merci.

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    On en arrive au fait que tu ne veux pas faire une fonction mais une proc' stock'.

    Si tu voulais vraiment lancer ta fonction telle quelle, il faudrait faire un truc comme ça :

    Ce qui t'afficherait 1 et en outre devrait faire ce qu'il y a dans ta fonction (sauf limitation).

    Normalement, tu devrais la transformer en procédure, ce qui te permettrait de lever certaines limitations et de l'appeler de manière moins contournée :

    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    Merci!

    Comme je l'ai dit, je ne peux pas faire de procédure, pour des raisons de réglementation (indépendants des questions techniques - c'est comme ça).

    Cette histoire de SELECT ça marche (merci).

    Par contre, si j'ai dans mon fichier plusieurs fonctions, ça marche plus. J'ai essayé plusieurs cas de figure, pas de résultat. Faut-il mettre un seul délimiteur pour tout ?
    Je ne peux pas mettre tout dans une seule fonction, car func3 est récursive ;-).


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    DELIMITER //
    DROP FUNCTION IF EXISTS func1;
     
    DELIMITER //
     
    function func1()
    RETURNS INT
    BEGIN
    DECLARE myvar INT;
    (...)
    SET myvar=func2()
    (...)
    RETURN 1;
    END; //
    DELIMITER ;
     
    DROP FUNCTION IF EXISTS func2;
     
    DELIMITER //
     
    function func2()
    RETURNS INT
    BEGIN
    DECLARE myvar INT;
    (...)
    SET myvar = func3();
    (...)
    RETURN myvar;
    END; //
    DELIMITER ;
     
    DROP FUNCTION IF EXISTS func3;
     
    DELIMITER //
     
    function func3()
    RETURNS INT
    BEGIN
    DECLARE myvar INT;
    (...)
    RETURN myvar;
    END; //
    DELIMITER ;

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Je pense que les deux premières lignes sont contradictoires :

    DELIMITER //
    DROP FUNCTION IF EXISTS func1;
    Le DROP doit pouvoir s'exécuter indépendamment du CREATE (et de préférence avant ). Donc tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELIMITER ;
    DROP FUNCTION IF EXISTS func1;
    DELIMITER //
    CREATE FUNCTION...
    ou encore ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELIMITER //
    DROP FUNCTION IF EXISTS func1 //
    CREATE FUNCTION...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Il y a une une faute de frappe, mon code est comme ça en effet :


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    DROP FUNCTION IF EXISTS func1;
     
    DELIMITER //
     
    function func1()
    RETURNS INT
    BEGIN
    DECLARE myvar INT;
    (...)
    SET myvar=func2()
    (...)
    RETURN 1;
    END; //
    DELIMITER ;
     
    DROP FUNCTION IF EXISTS func2;
     
    DELIMITER //
     
    function func2()
    RETURNS INT
    BEGIN
    DECLARE myvar INT;
    (...)
    SET myvar = func3();
    (...)
    RETURN myvar;
    END; //
    DELIMITER ;
     
    DROP FUNCTION IF EXISTS func3;
     
    DELIMITER //
     
    function func3()
    RETURNS INT
    BEGIN
    DECLARE myvar INT;
    (...)
    RETURN myvar;
    END; //
    DELIMITER ;
     
    SELECT func1();

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par catadanna Voir le message
    Par contre, si j'ai dans mon fichier plusieurs fonctions, ça marche plus. J'ai essayé plusieurs cas de figure, pas de résultat. Faut-il mettre un seul délimiteur pour tout ?
    Je ne peux pas mettre tout dans une seule fonction, car func3 est récursive ;-).
    Quand tu dis "ça ne marche plus", ça veut dire quoi ? Ton message laisse penser que les fonctions ne se créent pas, c'est bien ça ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  16. #16
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Il faut que tu ajoutes CREATE avant chaque FUNCTION.

    Il manque un point-virgule après SET myvar=func2().

    ... et je ne parle que des lignes que tu as gardées
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut Merci!
    Ça marche en effet, merci! J'étais intéressée surtout s'il faut mettre des délimiteurs séparés pour chaque fonction.
    Il y a CREATE avant chaque fonction, et point virgule à la fin de "SET ...".
    Oui les fonctions sont créées et stockées.

    Merci pour le coup de main! On ne trouve pas toutes ces choses sur le site officiel de MYSQL.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut Encore une chose :
    Je voudrais savoir simplement si je peux récupérer la valeur de retour d'une fonction dans une variable.

    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
    DELIMITER //
     
    CREATE function func1(unedate DATETIME)
    RETURNS DATETIME
    DECLARE madate DATETIME;
    BEGIN
    (...)
    SET madate = func1(madate);
    (...)
    RETURN madate;
    END;
    //
    DELIMITER ;
     
    SELECT func1('2015-03-17 12:23:36');
    J'ai essayé ceci dans mon code mais j'ai l'impression qu'on n'entre pas dans le rappel de fonction. Je n'ai rien trouvé sur le net à ce sujet.

    Merci!

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    T'es pas en train de faire une récursion infinie ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    NON! La fonction s'arrête (réponse : pas de résultat). Note : je l'ai testée en phpmyadmin, j'espère qu'il n'y a pas un paramétrage qui pose problème.
    Il y a une condition d'arrêt, on arrive là en tout cas.

Discussions similaires

  1. Error 500 pour mon htaccess
    Par Fleuretta dans le forum Apache
    Réponses: 3
    Dernier message: 08/10/2006, 20h54
  2. configurer php.ini pour fonction mail
    Par michka999 dans le forum Apache
    Réponses: 4
    Dernier message: 06/09/2006, 14h13
  3. Besoin d'aide pour fonctions OpenSSL..... HELP !!!
    Par aide64 dans le forum Langage
    Réponses: 7
    Dernier message: 12/05/2006, 17h46
  4. [VBA-E] référence Pour fonction Excel
    Par illight dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 19/04/2006, 14h29
  5. Debutant en C cherche aide pour fonctions!!!!
    Par benji17c dans le forum C
    Réponses: 5
    Dernier message: 30/09/2003, 12h47

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