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

yizhihongxing

针对“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面试题:求时间差之和(有重复不计)是一个常见的面试题目,下面我们将讲解如何解决这个问题。 问题描述 我们给定了一张表,表中有两个字段start_time和end_time,这两个字段均为时间类型,我们需要求出两个时间字段的差并将它们的和作为结果返回,如果有重复的记录,则只计算一次。 解题思路 我们可以通过两个方法来解决这个问题。一是使用子查询,二是使用…

    database 2023年5月21日
    00
  • SQL多表多字段比对方法实例代码

    SQL多表多字段比对是数据库中非常常见的一种操作,常用于查询两个或多个表中相同或相似的记录。下面我来给出一份完整的攻略,帮助你掌握SQL多表多字段比对的方法。 一、理解SQL多表多字段比对的基本原理 SQL多表多字段比对的基本原理就是对比两个或多个表中的多个字段,通过某种条件进行匹配,从而找出记录中的相同或相似部分。具体操作中,我们主要使用JOIN、UNIO…

    database 2023年5月22日
    00
  • 基于mysql查询语句的使用详解

    基于MySQL查询语句的使用详解 MySQL是一种流行的关系型数据库管理系统,也是广泛使用的开源数据库。在开发Web应用程序时,需要使用MySQL来存储和管理数据。MySQL查询语句是访问和修改数据库中数据的最基本方法之一。本文将详细讲解基于MySQL查询语句的使用方法。 基本语法 MySQL查询语句通常以SELECT关键字开始,其后跟着要选择的列名或通配符…

    database 2023年5月21日
    00
  • PHP基于mssql扩展远程连接MSSQL的简单实现方法

    下面是“PHP基于mssql扩展远程连接MSSQL的简单实现方法”的完整攻略: 1. 确认mssql扩展已安装 在远程连接 MSSQL 数据库之前,需要在使用该扩展的 PHP 环境中安装 mssql 扩展。可以通过以下命令检查是否已经安装了 mssql 扩展。 php -m | grep mssql 如果输出 mssql 则表示已安装 mssql 扩展,否则…

    database 2023年5月22日
    00
  • C#操作数据库总结(vs2005+sql2005)

    C#操作数据库总结(vs2005+sql2005) 数据库连接 首先,需要引入 System.Data.SqlClient 命名空间,使用 SqlConnection 类来表示数据库连接。 建议使用 using 语句块来确保连接被正确释放: using System.Data.SqlClient; // … string connectionString…

    database 2023年5月21日
    00
  • 一次线上mongo慢查询问题排查处理记录

    针对线上MongoDB慢查询问题,以下是一些排查处理记录完整攻略。 步骤1:日志分析 1.1 查看慢查询日志 慢查询日志记录了所有执行时间超过threshold(如100ms)的数据库操作。通过查看慢查询日志,可以发现哪些操作比较耗时,作为排查问题的起点。 1.2 检查Mongodb配置文件 MongoDB的配置文件中有一项slowOpThresholdMs…

    database 2023年5月22日
    00
  • Mysql如何在select查询时追加(添加)一个字段并指定值

    在Mysql中,我们可以使用SELECT查询语句的SELECT子句中的AS关键字,追加一个字段并指定值。 具体步骤如下: 在SELECT子句中,使用AS关键字和新字段的名称指定新字段。 在AS关键字后,指定新字段的值。 下面是两个示例: 示例1:添加一个固定值的字段 假设现在我们有一张表students,包含以下三个字段: id name age 1 Tom…

    database 2023年5月21日
    00
  • Neo4j和CouchDB的区别

    Neo4j和CouchDB都是NoSQL数据库,但它们的设计理念和适用场景不同。 Neo4j 设计理念 Neo4j是一个图形数据库,它的设计理念是将数据表示为节点和关系。每个节点代表实体,每个关系代表节点之间的联系。这种方式使得查询任意两个实体之间的关系非常高效,因为查询只需要在关系图中跟踪节点和关系就可以了。 适用场景 Neo4j非常适用于需要处理丰富而复…

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