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 :

Balayage de tables avec le même code SQL


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut Balayage de tables avec le même code SQL
    Salut !

    pour compter les lignes d'une tables avec un critère donné comme la date p.e, c'est facile de le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select count(*) nb_ligne from tb_energie
    where tb_energie.date_mois =:date_bilan
    mon problème est que je dois vérifier une dizaine de table avec le même critère pour savoir si la MAJ a été faite. Il me parait que cela soit possible dans une PS mais je ne sais par où commencer. Je dois en 1er sélectionner mes tables en mettant leurs noms dans un vecteur p.e (est-ce possible en SQL ?) puis faire une boucle pour avoir en sortie le couple (nom_table, nbr_ligne) à la date d'entrée saisie ?

    quelqu'un peut-il me guider et m'orienter ?

    Merci par avance.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    A votre place, je procèderais comme suit :
    Je créerai une table contenant 3 colonnes (nom de table, nom de colonne, valeur du paramètre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE CHECK_TABLE (
        TABLE_NAME   VARCHAR(31),
        COLUMN_NAME  VARCHAR(31),
        PARAM_VALUE  VARCHAR(31)
    );
    La table est alimentée par les éléments que l'on veut contrôler.
    Ensuite, je créerai la procédure stockée suivante qui parcours la table et exécute une instruction SQL construite dynamiquement :
    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
    CREATE OR ALTER PROCEDURE SP_CHECK_TABLES 
    RETURNS (TableName VARCHAR(31), NbRows INTEGER)
    AS
      DECLARE VARIABLE SqlStmt VARCHAR(128);
      DECLARE VARIABLE ColumnName VARCHAR(31);
      DECLARE VARIABLE ParamValue VARCHAR(31);
    BEGIN
      FOR SELECT TABLE_NAME, COLUMN_NAME, PARAM_VALUE FROM CHECK_TABLE
          INTO :TableName, :ColumnName, :ParamValue DO
      BEGIN
        SQL = 'SELECT COUNT(*) FROM ' || TableName ||
              ' WHERE ' || ColumnName || ' = ' || ParamValue;
        EXECUTE STATEMENT SqlStmt into :NbRows;
        SUSPEND;
      END
    END
    A adapter...

  3. #3
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Salut Ph. B. et merci

    mais reste quand même assez lourd comme process puisqu'on doit à chaque fois lui renseigner le nom de la table ! aurait-il un moyen de parcourir toutes les tables de la bdd et d'exécuter la ps pour chacune des tables puis avoir le résultat dans un fichier à la sortie ?!

    je sais que j'exagère mais c'est ce que je veux avoir en finalité ....

    merci encore et bienvenue à toute autre idée

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut
    un début de réponse :
    FAQ : Comment obtenir une liste des tables, vues et colonnes d'une base de données Firebird ?

    donc avec une la procédure modifiée de ph.
    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
     
    CREATE OR ALTER PROCEDURE SP_CHECK_TABLES 
    (COLONNE VARCHAR(31), Paramvalue  VARCHAR(31))
    RETURNS (TableName VARCHAR(31), NbRows INTEGER)
    AS
      DECLARE VARIABLE SqlStmt VARCHAR(128);
      DECLARE VARIABLE ColumnName VARCHAR(31);
      DECLARE VARIABLE ParamValue VARCHAR(31);
    BEGIN
      FOR SELECT f.RDB$RELATION_NAME
    FROM RDB$RELATION_FIELDS f
    JOIN RDB$RELATIONS r ON f.RDB$RELATION_NAME = r.RDB$RELATION_NAME
    AND f.RDB$FIELD_NAME=:COLONNE
    AND r.RDB$VIEW_BLR IS NULL
    AND (r.RDB$SYSTEM_FLAG IS NULL OR r.RDB$SYSTEM_FLAG = 0);
    INTO :TableName 
    DO
      BEGIN
        SQL = 'SELECT COUNT(*) FROM ' || TableName ||
              ' WHERE ' || COLONNE || ' = ' || ParamValue;
        EXECUTE STATEMENT SqlStmt INTO :NbRows;
        SUSPEND;
      END
    END
    PS . Finalement j'aurais pas du supprimer mon premier POST j'y proposais déjà le EXECUTE STATEMENT

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par Just-Soft Voir le message
    mais reste quand même assez lourd comme process puisqu'on doit à chaque fois lui renseigner le nom de la table ! aurait-il un moyen de parcourir toutes les tables de la bdd et d'exécuter la ps pour chacune des tables puis avoir le résultat dans un fichier à la sortie ?!
    Le problème lui même n'est pas aussi simple qu'il n'y parait...
    Sinon, parcourir toutes les tables pourquoi pas ?
    Mais comment définir la colonne qui va servir de critère de filtre ? en fonction de son type ? et si il y en a plusieurs, laquelle prendre ?
    La valeur du filtre est-elle unique pour toutes les tables ?

  6. #6
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    Le problème lui même n'est pas aussi simple qu'il n'y parait...
    Sinon, parcourir toutes les tables pourquoi pas ?
    Mais comment définir la colonne qui va servir de critère de filtre ? en fonction de son type ? et si il y en a plusieurs, laquelle prendre ?
    La valeur du filtre est-elle unique pour toutes les tables ?
    Merci ....
    le chemin est assez encourageant

    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    Parcourir toutes les tables pourquoi pas ? mais comment ?
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    Mais comment définir la colonne qui va servir de critère de filtre ? en fonction de son type ? et si il y en a plusieurs, laquelle prendre ?
    La colonne en question est de type date, et fort heureusement que je n'ai qu'un seul champ date dans chacune des tables

    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    La valeur du filtre est-elle unique pour toutes les tables ?
    oui elle l'est

    espérant que je suis assez clair sur les points soulevés

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut
    une jonction supplémentaire dans ce cas là avec RDB$FIELDS permettra d'obtenir (et donc de sélectionner le nom) le type de champ

    RDB$FIELD_TYPE
    12 ->DATE
    35 ->TIMESTAMP

    Donc , toutes les tables qui ont une colonne date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT f.RDB$RELATION_NAME, f.RDB$FIELD_NAME,T.RDB$FIELD_TYPE
    FROM RDB$RELATION_FIELDS f 
    JOIN RDB$FIELDS t on f.RDB$FIELD_SOURCE=t.RDB$FIELD_NAME AND t.RDB$FIELD_TYPE in (12,35)
    JOIN RDB$RELATIONS r ON f.RDB$RELATION_NAME = r.RDB$RELATION_NAME
    AND r.RDB$VIEW_BLR IS NULL
    AND (r.RDB$SYSTEM_FLAG IS NULL OR r.RDB$SYSTEM_FLAG = 0)

Discussions similaires

  1. [Modèle Relationnel] jointure d'une table avec elle-même
    Par johnny3 dans le forum Schéma
    Réponses: 11
    Dernier message: 26/04/2015, 00h15
  2. Supprimer plusieurs tables avec le même préfixe
    Par laurentSc dans le forum Administration
    Réponses: 5
    Dernier message: 26/11/2008, 21h30
  3. [Access] Nom d'une table avec un espace dans SQL
    Par Corsaire dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 15h50
  4. Croisement d'une table avec elle même
    Par lelapin dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/09/2005, 07h44
  5. [arborescence] jointure d'une table avec elle même ?
    Par Celelibi dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/11/2004, 18h48

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