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 :

mod dans une fonction qui reçoit un varchar [MySQL-5.7]


Sujet :

SQL Procédural MySQL

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut mod dans une fonction qui reçoit un varchar
    Bonjour

    J'ai tourné le problème dans tous les sens cet après-midi et je sors vaincu :-(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create function `test_01`(arg1 varchar(255)) returns tinyint
    begin
      declare v double(30, 0);
      set `v` = `arg1`;
      return `v` mod 10;
    end;
    suivi de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select test_01('1130201120201555555555161133'), 1130201120201555555555161133 % 10;
    Résultat:

    r1;r2
    "2";"3"
    J'ai tenté toutes conversions auxquelles j'ai pensé mais rien à faire pour avoir un résultat de fonction correct.

    Quelqu'un voudrait bien me dire où ça coince svp ??

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    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 111
    Points : 28 451
    Points
    28 451
    Par défaut
    Sans doute parce que le type double est un float avec des problèmes d'arrondi de calcul.

    Ne serait-il d'ailleurs pas plus simple ici de simplement extraire le dernier caractère de la chaine ?

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    C'est juste un exemple raccourci. En fait, je fais un mod 97 dans la fonction complète. Difficile de déduire le résultat à partir du dernier caractère

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    ça y'est, je l'ai eu ....
    en utilisant decimal(40) comme type de paramètre, ça fonctionne bien.

    Merci de m'avoir aiguillé sur le type à ne pas utiliser

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    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 111
    Points : 28 451
    Points
    28 451
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    En fait, je fais un mod 97 dans la fonction complète.
    Il suffisait de le dire que tu cherchais à calculer la clé d'un numéro de compte...

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    J'avais déjà demandé ici comment faire la vérification d'un IBAN.
    Là, plutôt que prendre le code standard, je devais transcrire du code PHP existant pour être parfaitement iso entre SQL et traitement métier.
    Je pense d'ailleurs que la fonction écrite en PHP par un collègue n'est pas complète mais le but était d'avoir le même comportement dans une vérification par SQL pour intégrer le résultat dans une requête.
    J'ai donc suivi chaque étape existante en PHP et avancé jusqu'au mod 97 final.
    Et c'est là que ça a commencé à coincer.
    J'avais bien compris que le problème venait du type de donnée mais après avoir essayé INT puis BIGINT, je ne savais plus vers quoi me tourner.
    C'est là que j'ai pensé au DOUBLE. Si j'avais pensé NUMERIC tout de suite, je n'aurais même pas eu à venir déranger ici

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    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 111
    Points : 28 451
    Points
    28 451
    Par défaut
    Il faut se méfier comme de la peste du type FLOAT et ses dérivés.
    Ils ne conservent qu'un nombre limité de chiffres significatifs et perdent la précision du nombre original, ce qui s'aggrave dès qu'il y a un calcul.

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    J'avoue avoir un peu de mal à faire la différence entre numeric(30) et double(30).
    Et surtout le fait qu'une chaîne puisse être passée comme numeric en paramètre de fonction.
    Je viens principalement de la programmation objet en Delphi et toute mon expérience est basée sur des types très précis que l'on peut éventuellement convertir dans un sens ou dans l'autre.
    C'est quelque chose qui m'a beaucoup gêné quand j'ai découvert PHP et sa facilité à mettre tout et n'importe quoi dans une variable. C'est à la fois pratique, déconcertant et à mon avis dangereux.
    Mais c'est un débat que j'ai eu avec mes collègue du pôle WEB et on n'est jamais tombés d'accord là-dessus

    Pour finir, voilà comment je l'ai écrit.
    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
     
    create
        definer = `root`@`%` function `mod_iban2`(`iban` decimal(40)) returns tinyint
    begin
        declare `fin` varchar(255);
        declare `debut` varchar(35);
     
        if char_length(`iban`) > 20 then
            set `debut` = substr(`iban`, 1, 10) % 97;
            set `fin` = substr(`iban`, 11);
            set `iban` = concat(`debut`, `fin`);
        end if;
     
        return `iban` % 97 = 1;
    end;
    Je me doute que ça pourrait être optimisé mais je suis déjà bien content que ça fonctionne sans erreur maintenant

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/06/2010, 14h48
  2. Erreur Mismatch dans une fonction qui rempli une liste déroulante
    Par MisNiak dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/12/2008, 17h11
  3. probleme dans une fonction qui affiche le nombre de ligne du texte
    Par étoile de mer dans le forum Débuter
    Réponses: 7
    Dernier message: 19/09/2008, 08h25
  4. probléme dans une fonction qui retourne un data reader
    Par saraenim dans le forum Windows Forms
    Réponses: 32
    Dernier message: 28/04/2008, 21h53
  5. [VBA][03] Erreur dans une fonction qui vide des tables
    Par NiKoTiNe dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/04/2007, 14h13

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