沃梦达 / IT编程 / 数据库 / 正文

Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题

针对“Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题”,以下是完整攻略。

针对“Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题”,以下是完整攻略。

问题描述

在使用tomcat连接Oracle数据库时,出现ORA-00903 无效表名的错误。这种错误通常是由于没有正确引用或拼写表名导致的。本文将讲解使用errorstack追踪该问题的方法。

解决方法

使用errorstack追踪ORA-00903错误的方法如下:

  1. 在Oracle SQL*Plus中,设置errorstack的大小
ALTER SYSTEM SET events '10998 trace name errorstack level 3';
  1. 复现问题并查看errorstack信息

在Tomcat连接Oracle数据库时,若出现ORA-00903错误,使用以下命令来查看errorstack:

SELECT DECODE(bitand(arg.sid,0x4000),0,'Current',1,'Call') SESSION_STATE,
       NVL(w.event,'NULL') WAIT_EVENT, p.*,
       SUBSTR(decode(TYPE, 'USER',hr.name,
                             'BACKGROUND process group',hg.name,
                             TO_CHAR(TYPE))||
                     ' ('||TO_CHAR(p.spid)||')',1,28) NAME,
       'alter system dump error' COMMAND
  FROM v$process p,       v$session s,       v$lock l,
       (SELECT name, ctime FROM v$database),
       sys.v_$bgprocess bg, sys.v_$latch latches,
       v$waitstat w, v$instance i, v$thread t, v$process prcs
 WHERE p.addr      = s.paddr(+)
   AND l.sid(+)=s.sid
   AND l.TYPE(+)   = 'TM'
   AND bg.inst_id(+)=p.inst_id
   AND bg.paddr(+) = p.addr
   AND latches.inst_id(+) = p.inst_id
   AND latches.addr     (+)    = p.addr
   AND NVL(w.averagesleep,0)    (+) = NVL(l.wait_time,0)
   AND i.INSTANCE_NUMBER = p.inst_id
   AND t.instance_number = i.INSTANCE_NUMBER
   AND t.thread# = p.thread#
   AND prcs.addr (+) = l.id1

以上命令将返回错误的stack trace信息,可以根据stack trace来识别出引用错误表名的代码行。

  1. 修复引用错误表名的代码,重新编译并测试。

示例说明

以下是两个示例说明,来演示上述解决方法的具体实现。

示例一

  1. 在Oracle SQL*Plus中,设置errorstack的大小:
ALTER SYSTEM SET events '10998 trace name errorstack level 3';
  1. 在Tomcat连接Oracle数据库时,出现ORA-00903错误,使用以下命令来查看stack trace信息:
SELECT DECODE(bitand(arg.sid,0x4000),0,'Current',1,'Call') SESSION_STATE,
       NVL(w.event,'NULL') WAIT_EVENT, p.*,
       SUBSTR(decode(TYPE, 'USER',hr.name,
                             'BACKGROUND process group',hg.name,
                             TO_CHAR(TYPE))||
                     ' ('||TO_CHAR(p.spid)||')',1,28) NAME,
       'alter system dump error' COMMAND
  FROM v$process p,       v$session s,       v$lock l,
       (SELECT name, ctime FROM v$database),
       sys.v_$bgprocess bg, sys.v_$latch latches,
       v$waitstat w, v$instance i, v$thread t, v$process prcs
 WHERE p.addr      = s.paddr(+)
   AND l.sid(+)=s.sid
   AND l.TYPE(+)   = 'TM'
   AND bg.inst_id(+)=p.inst_id
   AND bg.paddr(+) = p.addr
   AND latches.inst_id(+) = p.inst_id
   AND latches.addr     (+)    = p.addr
   AND NVL(w.averagesleep,0)    (+) = NVL(l.wait_time,0)
   AND i.INSTANCE_NUMBER = p.inst_id
   AND t.instance_number = i.INSTANCE_NUMBER
   AND t.thread# = p.thread#
   AND prcs.addr (+) = l.id1

  1. 以上命令返回如下错误的stack trace信息:
ORA-00903: 无效表名

自定义异常
PKG_TEST.PRC_TEST
PROCEDURE pkg_test.prc_test
1 
1 
1 

ORA-06512: 在 "PKG_TEST", line 5
ORA-06512: 在 line 1

根据以上信息,可以判断出错误是出自PKG_TEST.PRC_TEST存储过程中的第5行代码。

  1. 修复后重新编译并测试。

示例二

  1. 在Oracle SQL*Plus中,设置errorstack的大小:
ALTER SYSTEM SET events '10998 trace name errorstack level 3';
  1. 在Tomcat连接Oracle数据库时,出现ORA-00903错误,使用以下命令来查看stack trace信息:
SELECT DECODE(bitand(arg.sid,0x4000),0,'Current',1,'Call') SESSION_STATE,
       NVL(w.event,'NULL') WAIT_EVENT, p.*,
       SUBSTR(decode(TYPE, 'USER',hr.name,
                             'BACKGROUND process group',hg.name,
                             TO_CHAR(TYPE))||
                     ' ('||TO_CHAR(p.spid)||')',1,28) NAME,
       'alter system dump error' COMMAND
  FROM v$process p,       v$session s,       v$lock l,
       (SELECT name, ctime FROM v$database),
       sys.v_$bgprocess bg, sys.v_$latch latches,
       v$waitstat w, v$instance i, v$thread t, v$process prcs
 WHERE p.addr      = s.paddr(+)
   AND l.sid(+)=s.sid
   AND l.TYPE(+)   = 'TM'
   AND bg.inst_id(+)=p.inst_id
   AND bg.paddr(+) = p.addr
   AND latches.inst_id(+) = p.inst_id
   AND latches.addr     (+)    = p.addr
   AND NVL(w.averagesleep,0)    (+) = NVL(l.wait_time,0)
   AND i.INSTANCE_NUMBER = p.inst_id
   AND t.instance_number = i.INSTANCE_NUMBER
   AND t.thread# = p.thread#
   AND prcs.addr (+) = l.id1

  1. 以上命令返回如下错误的stack trace信息:
ORA-01031: 缺少 SELECT 权限
ORA-06512: 在 "SYS.DBMS_SESSION", line 70

根据以上信息,可以判断出错误发生在SYS.DBMS_SESSION存储过程的第70行代码。

  1. 检查当前连接用户是否具备进行SELECT操作的权限,如果没有,分配相应的权限,并重新测试。

本文标题为:Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题