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

[Oracle 8i] Obtenir la liste des tables vides


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut [Oracle 8i] Obtenir la liste des tables vides
    Bonjour à toutes et à tous.

    Je cherche à obtenir les tables vides de ma BDD.
    Je me suis donc rapproché de la vue système ALL_TABLES.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM sys.ALL_TABLES
    WHERE num_rows = 0
    AND owner = MonUtilisateur
    Mais, étant prudent, je me suis rendu compte que cette requête me ramène également des tables non-vides. Je suis donc reparti sur la liste totale des tables (vides et non-vides) et de faire un count(*) sur chacune.

    J'ai donc fait le code PL/SQL suivant :
    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
    DECLARE
    	CURSOR cListeNomTable
    		IS
    			SELECT TABLE_NAME NomTable
    			FROM sys.all_tables t
    			WHERE owner = 'MonUtilisateur';
     
    	vListeNomTable cListeNomTable%ROWTYPE;
    	vRequete	VARCHAR2(500);
    	vNbLigne	NUMBER(10);
    BEGIN
    	OPEN cListeNomTable;
    	LOOP
    		FETCH cListeNomTable INTO vListeNomTable;
    		EXIT WHEN cListeNomTable%NOTFOUND;
     
    		vRequete := 'SELECT COUNT(*) NbLigne FROM '||vListeNomTable.NomTable;
    		EXECUTE IMMEDIATE vRequete INTO vNbLigne;
     
    		dbms_output.put_line(vListeNomTable.NomTable||'|'||vNbLigne);	
    	END LOOP;
    	CLOSE cListeNomTable;
    EXCEPTION
      WHEN OTHERS THEN
           dbms_output.put_line(vRequete);	
    END;
    Cependant, c'est long... Et je trouve ça assez peu élégant.
    Y aurait-il un autre moyen de réaliser ça ?
    Je n'arrive pas à bien maîtriser les requêtes imbriquées, peut-être y a-t-il moyen de s'en sortir de ce côté là ?

    J'ai tenté la requête 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
    SELECT
        NomTable
        , NbLigne
    FROM
    (
        SELECT
            LibTable NomTable
            COUNT(*) NbLigne
        FROM
        (
            SELECT sat.table_name libTable
            FROM sys.ALL_TABLES sat
        ) A
    ) B
    Mais fa marfe pas.

    Je n'arrive pas à voir comment je pourrais faire une requête imbriquée dans une autre et qui me donnerais ce que je veux.

    Merci d'avance pour votre aide.

    Bahan
    Bats-toi de toutes tes forces tant que tu es en vie, et n'abandonne que quand tu es mort

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    La solution en PL/SQL me semble la meilleure.

    ALL_TABLES.num_rows doit s'appuyer sur les statistiques, donc si elles ne sont pas à jour, ça ne marche pas.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Pour améliorer les performances, vous pouvez seulement tester s'il y a au moins 1 ligne dans la table ou non avec:

    SELECT count(*) INTO v_count FROM <table> WHERE rownum = 1;
    Si v_count = 0 alors la table est vide, sinon elle n'est pas vide.

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Super bonne idée ça
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Moi je fais comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    set head off
    set feed off
    spool table_vide.sql
    select 'select ''' || TABLE_NAME || ''' from ' || TABLE_NAME || 
           ' where rownum = 1 having count(*) = 0;'
    from user_tables
    order by table_name
    /
    spool off
    @table_vide
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par pifor
    Pour améliorer les performances, vous pouvez seulement tester s'il y a au moins 1 ligne dans la table ou non avec:



    Si v_count = 0 alors la table est vide, sinon elle n'est pas vide.
    ou EXISTS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 from DUAL WHERE EXISTS (SELECT 1 FROM matable)

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par pifor
    Pour améliorer les performances, vous pouvez seulement tester s'il y a au moins 1 ligne dans la table ou non avec:



    Si v_count = 0 alors la table est vide, sinon elle n'est pas vide.
    +1



    Citation Envoyé par Fred_D
    ou EXISTS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 from DUAL WHERE EXISTS (SELECT 1 FROM matable)
    ++1

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/08/2007, 16h17
  2. Obtenir la liste des tables dans Access 2007
    Par je_developpe dans le forum Access
    Réponses: 2
    Dernier message: 13/03/2007, 05h16
  3. Obtenir la liste des tables d'une table
    Par Pigoulou dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/02/2005, 14h12
  4. Obtenir le listing des tables d'une BDD
    Par zoubidaman dans le forum Outils
    Réponses: 1
    Dernier message: 10/11/2004, 00h17
  5. Obtenir la liste des tables
    Par edamiral dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 23/04/2004, 13h33

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