DBA_TABLES affiche-t-elle toutes les tables de votre base Oracle ?

Parfois, vous vous apercevez que ce que vous pensez depuis des années est faux ! Prenons le cas de DBA_TABLES, ALL_TABLES et USER_TABLES. Pensez-vous que ces vues affichent toutes les tables de la bases de données ? Et bien c’est loin d’être le cas, comme le montre le test ci-dessous :
Commençons par un cas qui fonctionne…

create table X(col1 xmltype);

select table_name from user_tables;

TABLE_NAME
----------
X

Et maintenant, le cas qui ne fonctionne pas…

create table Y of xmltype;

select table_name from user_tables;

TABLE_NAME
----------
X

Vous cherchez le Y ? Pourquoi ne s’affiche-t-il pas ? La réponse est dans le détail de la documentation « DBA_TABLES describes all relational tables in the database ». La vue qui liste toutes les tables de la base de données est en réalité DBA_ALL_TABLES comme le montre le script ci-dessous :

select table_name from user_all_tables;

TABLE_NAME
----------
X
Y

A son sujet, la documentation dit « DBA_ALL_TABLES describes all object tables and relational tables in the database ». Le saviez-vous ?