Je n'ai jamais eu de problème d'interprétation des messages d'erreur d'Oracle. Cela s'explique en partie par le fait que tous les outils interactifs que j'ai vus pour développer le langage SQL pour Oracle indiquent de manière utile l'endroit où la requête s'est trompée. Cela inclut SQL*Plus, comme d'autres l'ont noté, et le module Perl DBI :
$ exec_sql.pl 'select * from daul'
DBD::Oracle::db prepare failed: ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 14 in 'select * from <*>daul') [for Statement "select * from daul"] at exec_sql.pl line 68.
Eh bien, cela est un peu difficile à lire car tout est regroupé sur une seule ligne. Mais un outil GUI serait capable de pointer le token où Oracle a commencé à avoir des problèmes avec la requête. Et avec un peu de travail sur un analyseur syntaxique, vous pourriez écrire un outil pour identifier la table en question.
Pour répondre à la question sous-jacente, les erreurs Oracle ne semblent pas être conçues pour fonctionner comme vous l'attendez. Pour autant que je sache, aucun des messages d'erreur d'Oracle ne prend en charge le texte variable. Au lieu de cela, Oracle renvoie deux éléments d'information : un numéro d'erreur et un emplacement où l'erreur se produit. Si vous disposez des outils appropriés, il est assez facile de diagnostiquer une erreur à l'aide de ces éléments d'information. On peut dire que le système d'Oracle est plus agréable pour les créateurs d'outils que celui qui fournit des quantités variables de données de diagnostic en fonction de l'erreur. Imaginez devoir écrire un analyseur syntaxique personnalisé pour tous les messages d'erreur d'Oracle (y compris les erreurs futures) afin de mettre en évidence l'emplacement incriminé.
Parfois, il serait trompeur d'inclure le nom de la table. Le fait de savoir où les choses se sont mal passées peut être d'une grande aide :
SQL> select * from where dummy = 'X';
select * from where dummy = 'X'
*
ERROR at line 1:
ORA-00903: invalid table name
Quant à savoir pourquoi Oracle a choisi de procéder de cette manière, j'ai quelques spéculations :
-
IBM a utilisé ce style de message d'erreur pour System R, que Larry Ellison, Bob Miner et Ed Oates ont copié pour construire Oracle V2. (Rétrocompatibilité.)
-
Le numéro et l'emplacement de l'erreur sont la plus petite représentation possible des informations de diagnostic. (Parsimonie.)
-
Comme je l'ai indiqué ci-dessus, pour simplifier la création d'outils qui se connectent à Oracle. (Interopérabilité.)
Dans tous les cas, je ne pense pas qu'il faille être un DBA pour savoir quelle table n'existe pas. Il suffit d'utiliser les outils appropriés. (Et ajuster vos attentes, je suppose).