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 :

Paramètre de fonction qui pose problème [MySQL-5.7]


Sujet :

SQL Procédural MySQL

  1. #1
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut Paramètre de fonction qui pose problème
    Bonjour à tou(te)s

    Je viens d'écrire une petite fonction pour vérifier la validité d'un SIRET en me basant sur un code JavaScript trouvé sur le net.

    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
    FUNCTION EstSiretValide(Siret varchar(255))
      RETURNS tinyint(1)
    BEGIN
      DECLARE somme int;
      DECLARE tmp int;
      DECLARE LongueurSiret int;
      DECLARE I int;
     
      -- Longueur 14 obligatoirement et QUE des chiffres
      IF Siret REGEXP '^[0-9]{14}$' = FALSE THEN  
        RETURN FALSE;
      END IF;
     
      SET I = 0;
      Loop_Label: LOOP
     
        IF (I % 2) = 1 THEN
          SET tmp = CAST( SUBSTRING(Siret, I) AS SIGNED) * 2;
     
          IF tmp > 9 THEN
            SET tmp = tmp - 9;
          END IF;
     
        ELSE 
          SET tmp = CAST( SUBSTRING(Siret, I) AS SIGNED);
        END IF;
     
        SET somme = somme + tmp;
     
        IF I = 14 THEN
          LEAVE `Loop_Label`;
        END IF;
     
        SET LongueurSiret = LongueurSiret + 1;
      END LOOP;
     
      IF (somme % 10) = 0 THEN
        RETURN TRUE;
      END IF;
     
      RETURN FALSE;
    END
    Pour la tester, je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT EstSiretValide("79942059100015");
    Et là, je récolte une erreur
    "Truncated incorrect INTEGER value"
    Si je supprime le premier chiffre du paramètre, plus d'erreur.

    Quelqu'un saurait-il me dire le pourquoi du comment svp ?

    Merci d'avance,



    oups /// Trouvé :-(

    Je n'incrémente pas la bonne valeur dans la boucle : SET LongueurSiret = LongueurSiret + 1; au lieu de SET I = I + 1;.


    Désolé

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Papy214.

    Pourquoi recréer un nouveau sujet sur les siret alors qu'il en existe un où nous avons répondu à tes questions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET tmp = CAST( SUBSTRING(Siret, I) AS SIGNED) * 2;
    C'est le substring qui pose problème.
    La syntaxe est : substring ( chaine, position dans la chaine, longueur ).
    Déjà, il n'y a pas la longeur qui est normalement 1.
    En l'absence de la longueur, il prend le maximum, à savoir tes 14 caractères.

    Et d'autre part, la valeur numérique est "79942059100015".
    En mettant des points séparateurs de milliers cela donne : 79.942.059.100.015. Or tu utilises "integer" !!!
    Le maximum que le type "integer" peut recevoir est : 2.147.483.647 quand il est signé.

    Il y a d'autres erreurs dans la procédure stockée, comme le fait de se positionner en 0 sur une chaîne de caractères.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pourquoi recréer un nouveau sujet sur les siret alors qu'il en existe un où nous avons répondu à tes questions ?
    C'est plutôt l'autre sujet qui est la suite de celui-ci. Regarde les heures de création des sujets !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  4. #4
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Je n'ai pas créé 2 sujets, le premier a simplement été déplacé.

    Voilà ma fonction corrigée après avoirpris en compte les remarques de SQLPro (merci Fred)

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    FUNCTION EstSiretValide(Siret varchar(255))
      RETURNS tinyint(1)
    BEGIN
      DECLARE somme int;
      DECLARE tmp int;
      DECLARE I int;
     
      -- Suppression des espaces inutiles
      SET Siret = REPLACE(Siret, ' ', '');
     
      SET somme = 0;
     
      -- Longueur 14 obligatoirement et QUE des chiffres
      IF Siret REGEXP '^[0-9]{14}$' = FALSE THEN  
        RETURN FALSE;
      END IF;
     
      SET I = 1;
      Loop_Label: LOOP
     
        IF (I % 2) = 1 THEN
     
          SET tmp = CAST(SUBSTRING(Siret, I, 1) AS UNSIGNED) * 2;
     
          IF tmp > 9 THEN
            SET tmp = tmp - 9;
          END IF;
     
        ELSE 
          SET tmp = CAST(SUBSTRING(Siret, I, 1) AS UNSIGNED);
        END IF;
     
        SET somme = somme + tmp;
     
        IF I = 14 THEN
          LEAVE `Loop_Label`;
        END IF;
     
        SET I = I + 1;
     
      END LOOP;
     
      IF (somme % 10) = 0 THEN
        RETURN TRUE;
      ELSE
     
        -- Vérification pour les SIRET de la poste
        SET somme = 
          CAST(SUBSTRING(Siret, 1, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 2, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 3, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 4, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 5, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 6, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 7, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 8, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 9, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 10, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 11, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 12, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 13, 1) AS UNSIGNED) +
          CAST(SUBSTRING(Siret, 14, 1) AS UNSIGNED);
        IF (somme % 5) = 0 THEN
            RETURN TRUE;
        END IF;
     
      END IF;
     
      RETURN FALSE;
     
    END
    Je ne me suis pas cassé la tête à faire une boucle pour le test complémentaire.
    Mais cette fois, après avoir lu vos messages et fais la correction, ça fonctionne.

    Merci encore

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Papy214.

    Elle a l'air d'être bien compliqué ta function.
    Je ne pense qu'elle fonctionne correctement.
    Prends le cas du siège social de la poste qui est " ‎35600000000048".
    Celui-ci ne fonctionne pas comme le reste des autres siret de la poste.
    Le cas normal est l'application de l'algorithme de Luhn.
    Dans le cas de la poste, on n'applique pas le doublement pour les rangs pairs et le modulo se calcul sur 5 et non sur 10 comme dans le cas normal.

    As-tu regardé ma procédure stockée ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour

    Bien sur que j'ai regardé ton code, et je l'ai même donné en exemple à des collègues
    Comme ma fonction était destinée à un import de données (avec vérification du champ) et que c'était un peu urgent,j'avoue que je me suis contenté de ce que j'&vais puisque ça faisait la majeure partie du boulot. Mais je l'améliorerai en ma basant sur ton code pour un prochain import.
    Et encore merci pour ça.

    Pour ce qui est du modulo sur 5, je le fais pourtant si le premier test "normal" ne passe pas.

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

Discussions similaires

  1. fonction qui pose problème - liste circulaire
    Par tangara001 dans le forum Lisp
    Réponses: 1
    Dernier message: 19/07/2010, 09h48
  2. Paramètre Ne00: qui pose problème
    Par jsr71 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 30/10/2009, 21h22
  3. requete update qui pose problème
    Par kirian dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/02/2007, 11h20
  4. code qui pose problème
    Par onePersonne dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/10/2006, 14h27
  5. Un cast de SmartPointer qui pose probléme
    Par Higestromm dans le forum C++
    Réponses: 3
    Dernier message: 13/10/2005, 10h25

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