
L’erreur ORA-00942 « table or view does not exist » survient quand Oracle ne trouve pas la table (ou la vue) que votre requête référence. Trois explications dominent : la table n’existe vraiment pas (faute de frappe), elle appartient à un autre schéma, ou vous n’avez pas le droit de la voir. Voici comment trancher en 2 minutes.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Le message
ORA-00942: table ou vue inexistante
ORA-00942: table or view does not existPoint important : Oracle renvoie volontairement la même erreur qu’il s’agisse d’une table inexistante ou d’une table sur laquelle vous n’avez aucun privilège — pour ne pas révéler l’existence d’objets que vous n’avez pas le droit de voir.
Cause 1 — La table n’existe pas (ou faute de frappe)
Vérifiez dans vos propres tables :
SELECT table_name FROM user_tables ORDER BY table_name;Astuce : Oracle stocke les noms en MAJUSCULES par défaut. SELECT * FROM Clients et FROM CLIENTS sont équivalents — sauf si la table a été créée entre guillemets doubles ("Clients"), auquel cas il faut écrire SELECT * FROM "Clients" à l’identique.
Cause 2 — La table est dans un autre schéma
La table existe, mais elle appartient à un autre utilisateur. Il faut alors la préfixer :
-- ❌ ORA-00942 si la table appartient à COMPTA
SELECT * FROM factures;
-- ✅ préfixe du schéma propriétaire
SELECT * FROM compta.factures;Pour la trouver :
SELECT owner, table_name FROM all_tables WHERE table_name = 'FACTURES';Si vous y accédez souvent, créez un SYNONYM : CREATE SYNONYM factures FOR compta.factures;
Cause 3 — Vous n’avez pas le privilège SELECT
La table existe, vous connaissez son schéma… mais sans privilège, Oracle répond ORA-00942 quand même. Le propriétaire (ou le DBA) doit accorder le droit :
GRANT SELECT ON compta.factures TO mon_user;Vérifiez vos droits actuels :
SELECT * FROM all_tab_privs WHERE table_name = 'FACTURES';Notre guide GRANT Oracle détaille la gestion des privilèges.
Cause 4 — Cas particuliers à connaître
- Dans une procédure PL/SQL : les privilèges acquis via un rôle ne s’appliquent pas dans une procédure (definer’s rights). Il faut un
GRANTdirect à l’utilisateur — c’est l’un des pièges PL/SQL les plus connus. - La table vient d’être supprimée : un
DROP TABLErécent ? Vérifiez la corbeille avecSELECT * FROM recyclebin;et restaurez avec FLASHBACK DROP. - Mauvaise base / mauvais environnement : vous êtes connecté à DEV au lieu de PROD.
SELECT name FROM v$database;(ou vérifiez votre chaîne de connexion). - Vue dont la table source a disparu : la vue existe mais référence une table supprimée — recréez la table ou la vue.
Checklist de résolution
SELECT table_name FROM user_tables→ existe-t-elle chez vous ?SELECT owner FROM all_tables WHERE table_name='…'→ autre schéma ? → préfixer.- Pas visible dans
all_tablesmais elle devrait exister ? → privilège manquant : demander unGRANT SELECT. - Dans du PL/SQL ? → le privilège doit être accordé en direct, pas via un rôle.
- Supprimée récemment ? →
recyclebin+ FLASHBACK.
FAQ
Pourquoi Oracle ne distingue pas « table inexistante » et « pas de droits » ?
Par sécurité : révéler qu’une table existe alors que vous n’y avez pas accès donnerait de l’information à un attaquant. ORA-00942 couvre les deux cas.
ORA-00942 sur une table que je viens de créer dans une autre session ?
Vérifiez que le CREATE TABLE a bien été exécuté (et dans le bon schéma). Le DDL est auto-validé, donc pas de COMMIT nécessaire — c’est presque toujours un problème de schéma ou de session connectée ailleurs.
Quelle différence avec ORA-00904 ?
ORA-00904 = colonne introuvable ; ORA-00942 = table/vue introuvable.
