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 :

[générateur]


Sujet :

SQL Firebird

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Par défaut [générateur]
    hello à tous,

    avec 35 degrés à l'ombre voici la question à 1 verre bien frais... sur les générateurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select gen_id( legenerateur,0) from rdb$database
    donne la valeur du générateur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select rdb$generator_name from rdb$generators where rdb$system_flag is null
    donne la liste des générateurs...

    maintenant la question à un verre bien frais. comment fusionner les 2???

    l'idée et de faire la liste des générateurs et de leurs valeurs en une seule requête. et bien sûr : select rdb$generator_name, (select gen_id( g.rdb$generator_name,0) from rdb$database) from rdb$generators g where rdb$system_flag is null ne fonctionne pas, cela serait trop simple...

    quelqu'un à une idée??

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Par défaut
    Code:
    select gen_id( legenerateur,0) from rdb$database

    donne la valeur du générateur...
    non, ta requête ne donne pas la valeur du générateur, elle génère la valeur suivante en ajoutant 0 à la dernière valeur.

    Si le système est capable de générer la valeur suivante en ajoutant 0 ( ou 1 ou autre chose ) à la valeur du générateur, c'est donc que la valeur du générateur est stockée qq part.

    Ne serait ce pas justement dans la table rdb$generators ? As tu examiné toutes les colonnes de cette table ?

  3. #3
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Citation Envoyé par phlip
    non, ta requête ne donne pas la valeur du générateur, elle génère la valeur suivante en ajoutant 0 à la dernière valeur.
    C'est trop suptil pour moi
    Valeur n'est t'il pas égal à Valeur + 0 ?


    Citation Envoyé par phlip
    Si le système est capable de générer la valeur suivante en ajoutant 0 ( ou 1 ou autre chose ) à la valeur du générateur, c'est donc que la valeur du générateur est stockée qq part.

    Ne serait ce pas justement dans la table rdb$generators ? As tu examiné toutes les colonnes de cette table ?
    Il n'y a que 3 colonnes dans cette table et certainement pas la valeur des générateurs. Et je ne pense pas quelles soient accéssibles dans les tables systèmes. Car ces valeurs ne doivent pas pouvoir être sélectionnées et MAJ dans une transaction (de lecture ou écriture).

    Bref pour revenir au problème, en une requete je ne vois pas comment.
    Eventuellement dans une PS sous fb1.5 en utilisant un
    Execute statment dans la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    FOR select rdb$generator_name from rdb$generators where rdb$system_flag is null INTO :NAME DO
    begin
      Execute statement 'select gen_id( ' || :NAME ||',0) from rdb$database' INTO :VALEUR;
      SUSPEND;
    end
    ...
    Ou bien entendu depuis un client.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Par défaut
    hélas j'en suis arrivé aux mêmes conclusions et pas question d'installer une procédure stockée, car le but et de faire une application multi-tâches, multi-postes, multi-utilisateurs qui permet de "voir" le contenu d'une base (un peu comme ibwebadmin mais en "plus rapide"), donc rien à faire, il faudra refaire autant de requête qu'il n'y a de générateur, dommage, car j'étais parvenu à obtenir tous les "objets" en une seule requête, juste pour "montrer" (c'est en python)
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
        Query  = self.InternalQueryOpen( """
    SELECT
      CAST( %(TABLESYS)d       AS INTEGER      ) AS OBJ_ORDER,
      CAST( 'TABLESYS'         AS VARCHAR( 32) ) AS OBJ_TYPE,
      CAST( RDB$RELATION_NAME  AS VARCHAR( 32) ) AS OBJ_NAME,
      CAST( ''                 AS VARCHAR(255) ) AS OBJ_INFO
    FROM RDB$RELATIONS
    WHERE RDB$SYSTEM_FLAG = 1
      AND %(TABLESYS)d > 0
    GROUP BY RDB$RELATION_NAME
     
    UNION ALL
     
    SELECT
      CAST( %(TABLE)d          AS INTEGER      ),
      CAST( 'TABLE'            AS VARCHAR( 32) ),
      CAST( RDB$RELATION_NAME  AS VARCHAR( 32) ),
      CAST( ''                 AS VARCHAR(255) )
    FROM RDB$RELATIONS
    WHERE RDB$SYSTEM_FLAG = 0
      AND RDB$VIEW_SOURCE IS NULL
      AND %(TABLE)d > 0
    GROUP BY RDB$RELATION_NAME
     
    UNION ALL
     
    SELECT
      CAST( %(VIEW)d           AS INTEGER      ),
      CAST( 'VIEW'             AS VARCHAR( 32) ),
      CAST( RDB$RELATION_NAME  AS VARCHAR( 32) ),
      CAST( ''                 AS VARCHAR(255) )
    FROM RDB$RELATIONS
    WHERE RDB$SYSTEM_FLAG = 0
      AND RDB$VIEW_SOURCE IS NOT NULL
      AND %(VIEW)d > 0
    GROUP BY RDB$RELATION_NAME
     
    UNION ALL
     
    SELECT
      CAST( %(FUNCTION)d       AS INTEGER      ),
      CAST( 'FUNCTION'         AS VARCHAR( 32) ),
      CAST( RDB$FUNCTION_NAME  AS VARCHAR( 32) ),
      CAST( RDB$MODULE_NAME    AS VARCHAR(255) )
    FROM RDB$FUNCTIONS
    WHERE %(FUNCTION)d > 0
     
    UNION ALL
     
    SELECT
      CAST( %(PROCEDURE)d      AS INTEGER      ),
      CAST( 'PROCEDURE'        AS VARCHAR( 32) ),
      CAST( RDB$PROCEDURE_NAME AS VARCHAR( 32) ),
      CAST( ''                 AS VARCHAR(255) )
    FROM RDB$PROCEDURES
    WHERE %(PROCEDURE)d > 0
     
    UNION ALL
     
    SELECT
      CAST( %(EXCEPTION)d      AS INTEGER      ),
      CAST( 'EXCEPTION'        AS VARCHAR( 32) ),
      CAST( RDB$EXCEPTION_NAME AS VARCHAR( 32) ),
      CAST( RDB$MESSAGE        AS VARCHAR(255) )
    FROM RDB$EXCEPTIONS
    WHERE %(EXCEPTION)d > 0
     
    UNION ALL
     
    SELECT
      CAST( %(GENERATOR)d      AS INTEGER      ),
      CAST( 'GENERATOR'        AS VARCHAR( 32) ),
      CAST( RDB$GENERATOR_NAME AS VARCHAR( 32) ),
      CAST( ''                 AS VARCHAR(255) )
    FROM RDB$GENERATORS G
    WHERE RDB$SYSTEM_FLAG IS NULL
      AND %(GENERATOR)d > 0
     
    UNION ALL
     
    SELECT
      CAST( %(TRIGGER)d        AS INTEGER      ),
      CAST( 'TRIGGER'          AS VARCHAR( 32) ),
      CAST( RDB$TRIGGER_NAME   AS VARCHAR( 32) ),
      CAST( CASE RDB$TRIGGER_TYPE
              WHEN 1 THEN 'BEFORE_INSERT'
              WHEN 2 THEN 'AFTER_INSERT '
              WHEN 3 THEN 'BEFORE_UPDATE'
              WHEN 4 THEN 'AFTER_INSERT '
              WHEN 5 THEN 'BEFORE_DELETE'
              WHEN 6 THEN 'AFTER_DELETE '
            END
            || ' ' ||
            CASE RDB$TRIGGER_INACTIVE
            WHEN 0 THEN 'ACTIVE'
              ELSE 'INACTIVE'
            END
                              AS VARCHAR(255) )
    FROM RDB$TRIGGERS
    WHERE ( RDB$SYSTEM_FLAG = 0 ) OR ( RDB$SYSTEM_FLAG is NULL )
     
     
    UNION ALL
     
    SELECT
      CAST( %(CHECK)d             AS INTEGER      ),
      CAST( 'CHECK'               AS VARCHAR( 32) ),
      CAST( T.RDB$CONSTRAINT_NAME AS VARCHAR( 32) ),
      CAST( ''                    AS VARCHAR(255) )
    FROM RDB$CHECK_CONSTRAINTS T
    JOIN RDB$TRIGGERS T2 ON T2.RDB$TRIGGER_NAME = T.RDB$TRIGGER_NAME
    WHERE T2.RDB$SYSTEM_FLAG = 3
     AND T.RDB$DB_KEY = ( SELECT MIN( T3.RDB$DB_KEY ) FROM RDB$CHECK_CONSTRAINTS T3
                          WHERE T3.RDB$CONSTRAINT_NAME = T.RDB$CONSTRAINT_NAME )
     
    ORDER BY 1, 3
    """ % self.ObjectsOrder  )
        for Row in self.InternalQuery.FetchAll():
          Result.append( { 'OBJ_TYPE': Row[ 'OBJ_TYPE' ],
                           'OBJ_NAME': Row[ 'OBJ_NAME' ].strip(),
                           'OBJ_INFO': Row[ 'OBJ_INFO' ]
                         } )
    mais la requête c'est bien sûr du sql!

    Si vous avez des remarques sur la requête de ci-dessus, allez-y, je suis à l'écoute de toute suggestion!

    noter que les "as" ne sont pas nécessaire, ils sont là juste pour relire plus facilement la requête!

    et pour "voir" ce que cela donne (si le bigniou n'est pas planté) http://jjv.homelinux.org/SQLShow/index.py



    merci de votre aide.

    le sujet et donc "résolu"

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

Discussions similaires

  1. Quel est le meilleur générateur d'états selon vous ?
    Par Marc Lussac dans le forum Outils de restitution et d'analyse
    Réponses: 80
    Dernier message: 18/05/2010, 16h43
  2. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  3. [C++ builder] Comment utiliser un générateur d'ID?
    Par Nicodemus dans le forum Débuter
    Réponses: 2
    Dernier message: 17/05/2004, 13h25
  4. Générateur de doc
    Par chman dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 09/09/2003, 20h37

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