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.
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.
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
J'ai donc fait le code PL/SQL suivant :
Cependant, c'est long... Et je trouve ça assez peu élégant.
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;
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 :
Mais fa marfe pas.
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![]()
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
Partager