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 Firebird Discussion :

[Rand] Eviter les résultats similaires sous FB 1.5


Sujet :

SQL Firebird

  1. #1
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut [Rand] Eviter les résultats similaires sous FB 1.5
    Bonjour,

    Je dois pouvoir générer des ID de session aléatoires dans une procédure stockée, sous la forme de chaînes de 16 chiffres hexadécimaux.

    Pour ça, j'ai codé la procédure stockée suivante :
    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
    CREATE PROCEDURE RandomString (
      ValidChars VARCHAR(255) CHARACTER SET ASCII,
      StrLength INTEGER
    )
    RETURNS (
      RandStr VARCHAR(255) CHARACTER SET ASCII
    )
    AS
     
    DECLARE VARIABLE Len SMALLINT;
    DECLARE VARIABLE RandInt SMALLINT;
    BEGIN
      RandStr = '';
      Len = StrLen(ValidChars);
     
      WHILE (StrLength > 0) DO
      BEGIN
        RandInt = Floor(Len*Rand()) + 1;
        IF (RandInt <= StrLength) THEN -- avoiding Rand returning 1
        BEGIN
          RandStr = RandStr || SubStr(ValidChars, RandInt, RandInt);
          StrLength = StrLength - 1;
        END
      END
     
      SUSPEND;
    END
    Le problème, c'est que les appels répétés à Rand() en peu de temps donnent le même résultat plusieurs fois de suite. J'obtiens des chaînes comme :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    5555555555522200
    CCCC999555533000
    9999999776333210
    Bref pas très aléatoire

    En cosultant ib_udf2.sql, on trouve :
    Note: The rand() function was changed in Firebird 2.0 so that the seed value is not set by every call. This corrects a potential duplicate value problem and ensures that different values will always be returned.

    To seed the random number generator or retain the old behaviour, use srand().
    Mais mon hébergeur travaille sous Firebird 1.5, et ne m'autorise pas l'utilisation de mes propres UDFs.

    Y a-t-il un moyen d'éviter ces répétitions ? Forcer des pertes de temps entre deux appels ?

    d'avance
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    en ajoutant l'appel à un generateur ?
    cela garantira l'unicité
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par makowski
    en ajoutant l'appel à un generateur ?
    cela garantira l'unicité
    Ca marche super



    Pour la postérité, mon nouveau code :
    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
    CREATE PROCEDURE RandomString (
      ValidChars VARCHAR(255) CHARACTER SET ASCII,
      StrLength INTEGER
    )
    RETURNS (
      RandStr VARCHAR(255) CHARACTER SET ASCII
    )
    AS
     
    DECLARE VARIABLE Len SMALLINT;
    DECLARE VARIABLE RandInt SMALLINT;
    BEGIN
      RandStr = '';
      Len = StrLen(ValidChars);
     
      WHILE (StrLength > 0) DO
      BEGIN
        RandInt = GEN_ID(SessionIDGenerator, 1) * Floor(Len*Rand());
        RandInt = Mod(RandInt, Len) + 1;
        RandStr = RandStr || SubStr(ValidChars, RandInt, RandInt);
        StrLength = StrLength - 1;
      END
     
      SUSPEND;
    END
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

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

Discussions similaires

  1. [Toutes versions] Regrouper sous forme d'une seule chaine les résultats d'une requete
    Par dacid dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/09/2009, 09h39
  2. Réponses: 18
    Dernier message: 21/09/2009, 22h47
  3. Réponses: 2
    Dernier message: 17/07/2008, 20h04
  4. [MySQL] Afficher les résultats sous forme d'un tableau
    Par Invité dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/06/2008, 22h53
  5. Eviter les redondances à l'affichage d'un résultat SQL
    Par Dazdh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/01/2008, 20h39

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