针对“Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题”,以下是完整攻略。
针对“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 无效表名的问题
基础教程推荐
- 如何查看PostgreSQL数据库中所有表 2023-07-21
- PHP 分页类(模仿google)-面试题目解答 2024-02-14
- CAT分布式实时监控系统使用详解 2024-02-14
- PostgreSQL limit的神奇作用详解 2023-07-21
- docker 安装redis以及删除 2023-09-13
- DB2优化(简易版) 2024-01-01
- 具有负载均衡功能的MySQL服务器集群部署及实现 2023-12-29
- [Redis] redis业务实践 , 这次用哈希 2024-04-24
- 一文快速回顾 Java 操作数据库的方式-JDBC 2024-04-24
- mysql语法中有哪些可以删除日志的命令 2024-12-16
