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

PL/SQL Oracle Discussion :

PL/SQL pour calcul vectoriel


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 8
    Points
    8
    Par défaut PL/SQL pour calcul vectoriel
    Bonjour

    j'ai une table qui contient distinctes positions de coordonnées (X,Y) et je voulais pour un point C de coordonnées (xc, yc) déterminer la position la plus proche depuis la table prédéfinie

    comment je peux le faire?

    merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    La distance entre deux points se calcule à l'aide du théorème de Pythagore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqrt(pow(xa - xb, 2) + pow(ya - yb, 2))
    Il suffit ensuite de rechercher l'ensemble des points pour lesquels cette valeur est minimal par rapport au point donné.

    Il faudra faire une sous-requête.

    PS : On peut simplifier le calcul en ne faisant pas la racine carrée. En effet, la somme des carrés et la racine carrée de la somme des carrés croissent en même temps.
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci pour la réponse

    je ne suis pas forte en dev comment pourrais je traduite ça en procédure SQL?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 805
    Points
    30 805
    Par défaut
    Présente nous ta requête, nous t'aiderons à la corriger.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre habitué

    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2011
    Messages : 115
    Points : 188
    Points
    188
    Par défaut
    Au fait , en utilisant l'algo ci-dessus, tu pourra t'inspirer de ce code (Attention, j'ai pas encore eu le temps de l'exécuter, faut vérifier la syntaxe)
    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
     
    CREATE OR REPLACE PROCEDURE tmp_teste(xinput IN REAL, yinput IN REAL)  IS
    cursor my_cursor is
           select 
                    X,Y
           from
                    TPosition;
    --my_cursor val%rowtype;
    distance_min REAL;
    BEGIN
       indicateur_tmp REAL;
       init_distance_min NUMERIC := 0;/*Initialisation de la variable distance_min*/
       for tmp_val in my_cursor
       loop
          indicateur_tmp := sqrt(power(xinput - tmp_val.X, 2) + power(yinput - tmp_val.Y, 2));
          if init_distance_min = 0 /*Execution une seule fois*/
          then
              distance_min := indicateur_tmp; /*Initialisation du distance_min*/
              init_distance_min := init_distance_min + 1;
          else
              if indicateur_tmp < distance_min
              then
                distance_min = indicateur_tmp;
              end if;
          end if;
       end loop;
       bms_output.put_line('Distance min = '|| to_char(distance_min));
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    END tmp_teste;
    /
    Innovation = Blending of idea , science and practice engineering

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Bref, à part la syntaxe approximative et l'algorithme discutable vous avez réussi à donner un bon exemple d'un très mauvais gestionnaire d'exception.

  7. #7
    Membre habitué

    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2011
    Messages : 115
    Points : 188
    Points
    188
    Par défaut
    Bref, à part la syntaxe approximative et l'algorithme discutable vous avez réussi à donner un bon exemple d'un très mauvais gestionnaire d'exception.
    Ouai, on pourra le dire , mais là n'est pas la question. C'est n'est qu'un exemple.
    Innovation = Blending of idea , science and practice engineering

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    Voila une solution simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with ma_requete as
    (
    select xa , ya , sqrt(pow(xa - xb, 2) + pow(ya - yb, 2)) dis
      from ma_table
    )
    select *
      from ma_requete
     where dis =  ( select min(dis) from ma_requete);
    Bonne Fin de semaine.

    Khalid

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/02/2010, 11h05
  2. [MySQL] Problème de requête SQL pour calculer des stats
    Par k2006 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/05/2009, 18h23
  3. Problème d'instruction SQL pour calculer un min
    Par aragorn23 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/02/2008, 14h08
  4. [Oracle] fonction pl/sql pour calcul pwd
    Par shaun_the_sheep dans le forum PL/SQL
    Réponses: 7
    Dernier message: 02/06/2006, 15h38
  5. update pour calcul pourcentage (SQL SERVER 2000)
    Par meufeu dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/09/2005, 09h04

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