针对“Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题”,以下是完整攻略。
问题描述
在使用tomcat连接Oracle数据库时,出现ORA-00903 无效表名的错误。这种错误通常是由于没有正确引用或拼写表名导致的。本文将讲解使用errorstack追踪该问题的方法。
解决方法
使用errorstack追踪ORA-00903错误的方法如下:
- 在Oracle SQL*Plus中,设置errorstack的大小
ALTER SYSTEM SET events '10998 trace name errorstack level 3';
- 复现问题并查看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来识别出引用错误表名的代码行。
- 修复引用错误表名的代码,重新编译并测试。
示例说明
以下是两个示例说明,来演示上述解决方法的具体实现。
示例一
- 在Oracle SQL*Plus中,设置errorstack的大小:
ALTER SYSTEM SET events '10998 trace name errorstack level 3';
- 在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
- 以上命令返回如下错误的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行代码。
- 修复后重新编译并测试。
示例二
- 在Oracle SQL*Plus中,设置errorstack的大小:
ALTER SYSTEM SET events '10998 trace name errorstack level 3';
- 在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
- 以上命令返回如下错误的stack trace信息:
ORA-01031: 缺少 SELECT 权限
ORA-06512: 在 "SYS.DBMS_SESSION", line 70
根据以上信息,可以判断出错误发生在SYS.DBMS_SESSION存储过程的第70行代码。
- 检查当前连接用户是否具备进行SELECT操作的权限,如果没有,分配相应的权限,并重新测试。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题 - Python技术站