ORA-00942: 表或视图不存在:如何找到它所指的表或视图?

9
我们正在测试一个针对ORACLE 10g的Java/Hibernate应用程序。偶尔会出现以下错误:

ORA-00942: 表或视图不存在

有没有办法找出ORACLE在谈论哪个表/视图?
我知道我可以在Hibernate中添加额外的日志级别,它将显示所有在ORACLE上执行的SQL,然后运行该SQL以找出缺少或缺少权限的TABLE/VIEW。但考虑到这是在测试/暂存阶段,这会降低性能。
有没有一种简单的方法来缩小表/视图名称的范围?

更新:

只是让你知道,我无法控制Oracle DB服务器环境。
我启用了Hibernate跟踪/日志记录,并找到了一个有效的SQL。我甚至使用了Wireshark(这是一个TCP数据包过滤器)来查看Hibernate实际发送的内容,那是一个有效的SQL。那么为什么Oracle会偶尔抱怨而不总是呢?
5个回答

7
这是我的工作内容,向原作者道歉,我知道我从某个网站上拿走了它,但现在记不起来了。
在预生产阶段,我有这个。
create table caught_errors (
  dt        date,               
  username  varchar2( 30), -- value from ora_login_user
  msg       varchar2(2000),
  stmt      varchar2(2000)
);


create or replace trigger catch_errors
   after servererror on database
declare
   sql_text ora_name_list_t;
   msg_     varchar2(2000) := null;
   stmt_    varchar2(2000) := null;
begin

  for depth in 1 .. ora_server_error_depth loop
    msg_ := msg_ || ora_server_error_msg(depth);
  end loop;

  for i in 1 .. ora_sql_txt(sql_text) loop
     stmt_ := stmt_ || sql_text(i);
  end loop;

  insert into 
    caught_errors (dt     , username      ,msg ,stmt )
           values (sysdate, ora_login_user,msg_,stmt_);
end;
/

任何时候出现服务器错误,它都会被捕获并记录到一个表中,然后我可以检查该表以找到有问题的查询,并根据需要退款以查看缺失的表(当您在sqlplus中运行查询时,它会告诉您表格)。请注意,是的,这存在问题,例如,如果删除了caught_errors或引发自身错误,则可能会得到递归循环,因此这仅存在于预生产环境中。

3

1
你应该检查账户是否拥有访问目标表的权限。

2
这并不回答问题。 - DerMike

0

如果您在导入数据库时遇到此问题,请检查表空间名称是否正确。


0

我认为这里没有什么万能的解决方法。 可能是查询中缺少表格或表格名称拼写错误。 也可能是权限问题。如果不执行查询,你无法确定。

我建议你在代码中加入工具,以便可以随时开启和关闭。运行它,提取查询,并将其发送给你的数据库管理员进行解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接