我从来没有遇到过解释 Oracle 错误消息的问题。部分原因是我看到的用于为 Oracle 开发 SQL 的每个交互式工具都有助于指出查询出错的位置。正如其他人所指出的,这包括 SQL*Plus 和 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.
好吧,这有点难以阅读,因为它全部压缩在一条线上。但是 GUI 工具将能够指向 Oracle 开始出现查询问题的标记。并且在解析器上做一些工作,您可以编写一个工具来挑选出有问题的表。
要回答基本问题,Oracle 错误似乎并不是按照您期望的方式设计的。据我所知,Oracle 中的错误消息都不支持可变文本。相反,Oracle 返回两位信息:错误号和错误发生的位置。如果你有合适的工具,就很容易用这些数据来诊断错误。可以说,对于工具创建者来说,Oracle 的系统比根据错误提供可变数量的诊断数据的系统更好。想象一下,必须为 Oracle 的所有错误消息(包括未来的错误)编写一个自定义解析器以突出显示有问题的位置。
有时包含表名会产生误导。仅仅知道哪里出了问题就会有很大的帮助:
SQL> select * from where dummy = 'X';
select * from where dummy = 'X'
*
ERROR at line 1:
ORA-00903: invalid table name
至于甲骨文为什么选择这样做,我有一些猜测:
IBM 将这种风格的错误消息用于 System R,Larry Ellison、Bob Miner 和 Ed Oates 将其复制以构建 Oracle V2。(向后兼容性。)
错误编号和位置是诊断信息的最小可能表示。(简约。)
正如我上面所指出的,为了简化连接到 Oracle 的工具的创建。(互操作性。)
无论如何,我认为您不需要成为 DBA 就可以确定哪个表不存在。您只需要使用适当的工具。(并调整你的期望,我想。)