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 :

Création d'une procédure stockée (pour trouver toutes les villes dans un rayon de x km)


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut Création d'une procédure stockée (pour trouver toutes les villes dans un rayon de x km)
    bonjour tout le monde,

    voila un bout de code qui est sensé me trouver toutes les villes dans un rayon de X kilomètres par rapport à un point GPS donné.
    seulement la création de ma procédure stockée n'est pas correcte ! -_-

    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
    DROP FUNCTION IF EXISTS get_distance_metres|
    CREATE FUNCTION get_distance_metres (latDepart DOUBLE, longDepart DOUBLE, latArrivee DOUBLE, longArrivee DOUBLE) RETURNS DOUBLE
    BEGIN
    	DECLARE radLongDepart DOUBLE;
    	DECLARE radLatDepart DOUBLE;
    	DECLARE radLongArrivee DOUBLE;
    	DECLARE radLongArrivee DOUBLE;
     
    	DECLARE dlo DOUBLE;
    	DECLARE dla DOUBLE;
    	DECLARE a DOUBLE;
     
    	SET radLongDepart = RADIANS(longDepart);
    	SET radLatDepart = RADIANS(latDepart);
    	SET radLongArrivee = RADIANS(longArrivee);
    	SET radLongArrivee = RADIANS(latArrivee);
     
    	SET dlo = (radLongArrivee - radLongDepart) / 2;
    	SET dla = (radLongArrivee - radLatDepart) / 2;
     
    	SET a = SIN(dla) * SIN(dla) + COS(radLatDepart) * COS(radLongArrivee) * SIN(dlo) * SIN(dlo);
    	RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));
    END |
     
     
     
    paramètres = $latitude, $longitude, $rayonMax (dans le futur code PHP)
     
    SELECT *, get_distance_metres($latitude, $longitude, latitude, longitude) AS distance
    FROM maps_ville
    WHERE distance < $rayonMax
    ORDER BY distance ASC
    voici l'erreur générée dans PhpMyAdmin :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '|
    CREATE FUNCTION get_distance_metres (latDepart DOUBLE, longDepart DOUBLE, lat' at line 1

    pourriez-vous me dire ce que j'ai bien pu oublier svp ?? O_o
    merci pour votre aide !

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    youhouu ça roule !

    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
    DELIMITER |
    DROP FUNCTION IF EXISTS get_distance_metres|
    CREATE FUNCTION get_distance_metres (latitudeDepart DOUBLE, longitudeDepart DOUBLE, latitudeArrivee DOUBLE, longitudeArrivee DOUBLE) RETURNS DOUBLE
    BEGIN
        DECLARE radLongitudeDepart DOUBLE;
        DECLARE radLatitudeDepart DOUBLE;
        DECLARE radLongitudeArrivee DOUBLE;
        DECLARE radLatitudeArrivee DOUBLE;
     
        DECLARE dlo DOUBLE;
        DECLARE dla DOUBLE;
        DECLARE a DOUBLE;
     
        SET radLongitudeDepart = RADIANS(longitudeDepart);
        SET radLatitudeDepart = RADIANS(latitudeDepart);
        SET radLongitudeArrivee = RADIANS(longitudeArrivee);
        SET radLatitudeArrivee = RADIANS(latitudeArrivee);
     
        SET dlo = (radLongitudeArrivee - radLongitudeDepart) / 2;
        SET dla = (radLatitudeArrivee - radLatitudeDepart) / 2;
     
        SET a = SIN(dla) * SIN(dla) + COS(radLatitudeDepart) * COS(radLatitudeArrivee) * SIN(dlo) * SIN(dlo);
        RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));    
    END|
     
    SELECT nom, get_distance_metres('49.433331', '1.08333', latitude, longitude) AS distance
    FROM maps_ville
    WHERE get_distance_metres('49.433331', '1.08333', latitude, longitude) <=10000
    ORDER BY 2 ;
    bon voila un bout de code me permettant d'obtenir toutes les villes dans un rayon de 10km autour de Rouen

    @+

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Par défaut
    Bonjour,
    j'ai essayé ta requête sql dans phpmyadmin et voila ce qu'il me retourne

    MySQL a répondu : Documentation
    #1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
    merci de ton aide

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    coucou, tu as bien créé la fonction AVANT de lancer la requête non ?
    fais le bien en 2 fois, cré d'abord la fonction get_distance_metres !

    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
    DELIMITER |
    DROP FUNCTION IF EXISTS get_distance_metres|
    CREATE FUNCTION get_distance_metres (latitudeDepart DOUBLE, longitudeDepart DOUBLE, latitudeArrivee DOUBLE, longitudeArrivee DOUBLE) RETURNS DOUBLE
    BEGIN
        DECLARE radLongitudeDepart DOUBLE;
        DECLARE radLatitudeDepart DOUBLE;
        DECLARE radLongitudeArrivee DOUBLE;
        DECLARE radLatitudeArrivee DOUBLE;
     
        DECLARE dlo DOUBLE;
        DECLARE dla DOUBLE;
        DECLARE a DOUBLE;
     
        SET radLongitudeDepart = RADIANS(longitudeDepart);
        SET radLatitudeDepart = RADIANS(latitudeDepart);
        SET radLongitudeArrivee = RADIANS(longitudeArrivee);
        SET radLatitudeArrivee = RADIANS(latitudeArrivee);
     
        SET dlo = (radLongitudeArrivee - radLongitudeDepart) / 2;
        SET dla = (radLatitudeArrivee - radLatitudeDepart) / 2;
     
        SET a = SIN(dla) * SIN(dla) + COS(radLatitudeDepart) * COS(radLatitudeArrivee) * SIN(dlo) * SIN(dlo);
        RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));    
    END|
    quand ce sera fait dis moi si la création s'est bien effectuée.

    puis ensuite essai la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, get_distance_metres('49.433331', '1.08333', latitude, longitude) AS distance
    FROM maps_ville
    WHERE get_distance_metres('49.433331', '1.08333', latitude, longitude) <=10000
    ORDER BY 2 ;
    dis moi si ça fonctionne mieux !

    RAPPEL :

    les coordonnées doivent être au format DOUBLE.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Par défaut
    Dans la fenêtre sql de phpmyadmin, j'ai fait comme tu m'as indiqué : j'ai initialisé la procédure. Mais il me met cette erreur :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '|' at line 22
    J'ai aussi essayé dans la case délimiteur ( en bas de la fenêtre sql ) le caractère | mais ça fait la même erreur 1064.

    Ma version de mysql et 5.1.36.

    J'ai essayé de voir dans la console mysql si je n'avais pas une procédure stockée avec la commande SHOW PROCEDURE STATUS LIKE '%%'\G
    il me met "Empty set".

    Ensuite, je me suis dit que ton code devait être mis dans la console mysql, ce que j'ai fait ; et là, il me met une erreur 1046 (no database selected )

    a+ et merci

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    bon c'est un probleme de délimiteur !
    j'ai fais ça au boulot et ça marchait finger in the noze !
    mais là j'ai le même problème que toi, je n'y comprend rien.
    je fais des recherches, je te tiens informé

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

Discussions similaires

  1. Lancer une procédure stockée pour toute une liste
    Par riomois85 dans le forum Développement
    Réponses: 2
    Dernier message: 16/05/2012, 17h51
  2. Ou placer une procédure stockée qui sauvegarde toutes les bases ?
    Par arthuro45 dans le forum Administration
    Réponses: 4
    Dernier message: 27/09/2010, 21h04
  3. Réponses: 2
    Dernier message: 22/10/2008, 13h14
  4. Création d'une procédure stockée
    Par david71 dans le forum SQL
    Réponses: 5
    Dernier message: 16/01/2008, 17h45
  5. Réponses: 2
    Dernier message: 28/05/2006, 23h31

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