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日

相关文章

  • SQL 删除不想要的字符

    当我们在操作数据库时,可能会出现需要删除某些不需要的字符或者数据的情况。下面详细讲解SQL删除不想要的字符的完整攻略。具体方法如下: 1.使用SUBSTRING函数删除一个字符 SUBSTRING函数是SQL用于截取字符串的函数之一,我们可以使用它来删除我们不需要的字符。具体方法如下: UPDATE table_name SET column_name = …

    database 2023年3月27日
    00
  • 分享三种高效率SQL语句分页方法

    下面是分享三种高效率SQL语句分页方法的完整攻略,包含以下内容: 概述 在开发一个 Web 应用程序时,分页处理通常是必须考虑的一项功能。而对于数据库查询结果的分页,主要是依靠 SQL 语句的 LIMIT 和 OFFSET 字句来实现。本文将分享三种高效率 SQL 语句分页方法。 基础分页 最基础的分页 SQL,根据 ascending_order_fiel…

    database 2023年5月21日
    00
  • 关于Redis的内存淘汰策略详解

    Redis内存淘汰策略详解 在Redis中,内存淘汰策略是控制内存的一个重要机制。如果Redis占用的内存超过了系统的RAM容量,就会选择一些策略来强制淘汰一些数据。Redis提供了多种内存淘汰策略,下面就详细介绍一下这些策略。 noeviction noeviction策略是默认的策略,当内存不足用于新的建议(新建的键),旧键不会被驱逐(eviction)…

    database 2023年5月22日
    00
  • SQLite3数据库的介绍和使用教程(面向业务编程-数据库)

    SQLite3数据库的介绍和使用教程 什么是SQLite3数据库 SQLite 是一种关系型数据库管理系统,是一个开源的轻型数据库系统,它的存储是基于文件系统的。 一般情况下,SQLite3 被认为是以文件为载体的数据库,它的操作速度快,文件占用内存小,适用于小型应用程序(如手机App等)。但是,SQLite3 并不是不支持应用程序的高并发访问,只是sqli…

    database 2023年5月21日
    00
  • 安装Redis就那么几步,很简单

    安装Redis实际上非常简单,以下是步骤: 下载Redis 你可以在Redis的官方网站(http://redis.io/)或者Github仓库(https://github.com/redis/redis)找到Redis的最新版本。选择你所需要的版本并下载。 如果你使用的是Linux系统,你也可以使用系统的包管理器来安装Redis。比如说,使用Debian…

    database 2023年5月22日
    00
  • Linux中允许远程用户登录访问mysql的方法

    需要手动增加可以远程访问数据库的用户。 方法一、本地登入mysql,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,将”localhost”改为”%” #mysql -u root -prootmysql>use mysql;mysql>update user set host = ‘%’ where user = ‘r…

    MySQL 2023年4月13日
    00
  • Springboot整合redis步骤

    <dependency> <groupId>com.github.spt-oss</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.0.7.0</version> <…

    Redis 2023年4月16日
    00
  • DB2个人版(Linux)安装

    下面我来详细讲解“DB2个人版(Linux)安装”的完整攻略。 1. 前置条件 在安装DB2个人版之前,需要确认以下条件已经满足: 安装要求:系统为Linux 64位,内存至少为2GB。 确认是否已创建普通用户DB2INST1,并赋予sudo权限。 2. 下载DB2个人版安装媒体 在启动安装之前,需要先下载DB2个人版的安装媒体。可以前往IBM官网下载(ht…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部