为什么Oracle不告诉你哪个表或视图不存在?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

如果你使用过Oracle,你可能会收到有用的消息“ORA-00942:表或视图不存在”。该消息是否存在合法的技术原因,不包括缺失对象的名称?

我的猜测是,当这个错误最初实现时,有人忽略了添加对象名称,现在,人们担心它会破坏兼容性来修复它。(如果解析错误消息这样愚蠢的事情发生变化,代码将会感到困惑。)

是否有开发人员友好(而不是招聘你的DBA)来确定缺失表的名称?

提问于
用户回答回答于

你可以在参数文件(纯文本或spfile)中设置EVENT以强制Oracle转储user_dump_dest中的详细跟踪文件,如果不是SQL,对象名称可能位于该文件中。

EVENT="942 trace name errorstack level 12"

如果你使用的是纯文本文件,则需要将所有EVENT设置保留在连续的行上。不知道如何应用于spfile。

用户回答回答于

SQL * Plus会告诉你不存在的表。例如:

SQL> select
  2     *
  3  from
  4     user_tables a,
  5     non_existent_table b
  6  where
  7     a.table_name = b.table_name;
   non_existent_table b
   *
ERROR at line 5:
ORA-00942: table or view does not exist

这里显示了错误发生的SQL语句中缺少的表的名称和行号。

同样,在单行SQL语句中,可以看到突出显示未知表名称的星号:

SQL> select * from user_tables a, non_existent_table b where a.table_name = b.table_name;
select * from user_tables a, non_existent_table b where a.table_name = b.table_name
                             *
ERROR at line 1:
ORA-00942: table or view does not exist

根据你的问题,我猜错误信息不包括表名的原因是错误信息本身需要是静态文本。错误行中的行号和位置显然传递回SQL * Plus。

扫码关注云+社区