ORA-00942 « table or view does not exist » : 5 causes et solutions

ORA-00942 « table or view does not exist » : les 5 causes (faute de frappe, schéma, privilèges…) et leurs solutions, avec exemples SQL Oracle.

Illustration de l'erreur Oracle ORA-00942

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.

Publicité

🧪 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 exist

Point 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 GRANT direct à l’utilisateur — c’est l’un des pièges PL/SQL les plus connus.
  • La table vient d’être supprimée : un DROP TABLE récent ? Vérifiez la corbeille avec SELECT * 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

  1. SELECT table_name FROM user_tables → existe-t-elle chez vous ?
  2. SELECT owner FROM all_tables WHERE table_name='…' → autre schéma ? → préfixer.
  3. Pas visible dans all_tables mais elle devrait exister ? → privilège manquant : demander un GRANT SELECT.
  4. Dans du PL/SQL ? → le privilège doit être accordé en direct, pas via un rôle.
  5. 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.

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité