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