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 无效表名的问题 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • MySQL 中的事务理解

    MySQL 中的事务 前言 原子性 一致性 持久性 并发事务存在的问题 脏读 幻读 不可重复读 隔离性 事务的隔离级别 事务隔离是如何实现 可重复读 和 读提交 串行化 读未提交 可重复读解决了幻读吗 总结 参考 MySQL 中的事务 前言 MySQL 中的事务操作,要么修改都成功,要么就什么也不做,这就是事务的目的。事务有四大特性 ACID,原子性,一致性…

    MySQL 2023年4月12日
    00
  • Firebase和Impala的区别

    Firebase是一种由Google开发的云端后端服务,提供了一整套完整的工具和服务,用于帮助开发者构建和扩展基于移动和Web的应用程序。它提供了包括实时数据库、云存储、身份验证和消息传递等开发者所需的服务,并提供了易用的UI使开发者可以更加高效的完成应用程序的构建工作。 相比之下,Impala则是一种高效的分布式SQL查询引擎,是Apache Hadoop…

    database 2023年3月27日
    00
  • C#操作MySql的方法是什么

    这篇文章主要讲解了“C#操作MySql的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#操作MySql的方法是什么”吧! 代码介绍 功能包含: 创建数据库 创建数据表 批量添加数据 MySql事务执行 清表 分页、模糊查询 代码实现 创建数据库 public void CreateDatabase…

    MySQL 2023年4月11日
    00
  • Linux99问(下)

    下面是Linux99问的完整攻略。 Linux99问(下)攻略 简介 Linux99问(下)是一份包含99个Linux系统相关问题和答案的文档。 在本攻略中,我们将对其中的问题进行逐一解析,并提供详细的解答和实例说明,以帮助读者更好地理解和应用Linux系统。 问题列表 以下是Linux99问(下)中的问题列表: 如何查看Linux系统的发行版本? 如何查看…

    database 2023年5月22日
    00
  • 详解MySql基本查询、连接查询、子查询、正则表达查询

    下面是详解MySql基本查询、连接查询、子查询、正则表达查询的完整攻略。 MySql基本查询 MySql基本查询用于获取表格中的数据。查询语句的基本形式为SELECT语句,语法如下: SELECT column1, column2, … FROM table_name; 其中column1、column2是需要查询的列名,table_name是需要查询的…

    database 2023年5月19日
    00
  • 如何在Python中删除MongoDB数据库中的数据?

    以下是在Python中删除MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已MongoDB数据库,并已创建使用数据库和集合,同时需要安Python的驱动程序,例如pymongo。 步骤1:导入模块 在Python中使用pymongo模块连接MongoDB数据库。以下是导入p…

    python 2023年5月12日
    00
  • Oracle 和 PostgreSQL 的区别

    Oracle和PostgreSQL都是常见的关系型数据库管理系统,它们在很多方面有相似的地方,但也有很多不同之处。接下来会详细讲解Oracle和PostgreSQL的区别和相似之处。 数据库架构 Oracle和PostgreSQL在数据库架构上有所区别,PostgreSQL是输入输出管理系统(I/O manager),而Oracle是内存数据库管理系统(DB…

    database 2023年3月27日
    00
  • C#的StackExchange.Redis实现订阅分发模式

    wu大糊涂关注 一、订阅分发模式介绍 Redis发布订阅—Pub/Sub模式或者说是观察者模式。我想大家即使没有使用过,也已经耳熟能详了。 先简单举例说明下应用场景,在场景中我们可以分析到其优势在哪。 比如你的线上应用应用,你想设置一个日志报警系统,当应用出现异常的时候,立马发送通知给你,可能是短信的形式,也可能是邮件的形式。当然如果只将报警通知给你一个人,…

    Redis 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部