解决ORA-06502一例

| 2 Comments

昨天把瑞星防火墙升级到2009后,今天就出问题了。

用一会儿后整个windows就死掉了,点"任务管理器"也没有反应。只好硬关机,但重启后症状依旧。

无奈之下尝试卸载瑞星防火墙2009,卸载的过程中死了一次,硬关机重启后再次卸载成功。

但是卸载完后发现本地网卡、无线网卡和蓝牙均不能使用,后发现是瑞星在我的"设备管理器"的"网络适配器"下面针对本地网卡、无线网卡和蓝牙都安装了一个瑞星自己的驱动程序,而且这些驱动程序现在是处在异常状态(前面有黄色惊叹号),更要命的是这些处于异常状态的驱动程序无法卸载。无奈之下卸载掉正常的本地网卡、无线网卡和蓝牙的驱动,卸载完毕后前面有黄色惊叹号的瑞星的那些驱动也随之消失,但始终还有一个针对wan口的瑞星驱动无法卸载。

 

我知道瑞星2009很烂,所以我的防火墙一直还是2008,但昨天手欠,点了一下升级,恶梦就降临了!

 

于是心乱如麻的开始了重装的过程。

 

在重装的过程中,有同事问我问题:说他的一个存储过程,导入一批数据,这一批数据中会往某个表里插入10几条特殊数据,在插入了这10几条记录的过程中写错误日志写了4000多条,而且错误内容全部是"ORA-06502: PL/SQL: numeric or value error",他问我如何解决上述问题?

 

这里报错是非常奇怪的,因为oracle报错ORA-06502的时候通常会在报错的最后写错误的具体原因,如:

ORA -06502 : PL/SQL: numeric or value error: character string buffer too small

ORA-06502: PL/SQL: numeric or value error: character to number conversion error

 

我注意到上述报错后面没有跟具体的错误原因

 

我在我整个人的状态很混乱的情况下开始了定位错误的过程,最后被我发现造成上述错误的原因有3点,这3点我就不细说了,我这里只说为什么oracle在报错ORA-06502的时候,后面并没有跟具体的错误原因。

 

我们先来看一个报错ORA-06502,但是后面会跟具体的错误原因的例子:

SQL> create table t1(id number,name varchar2(10));

 

Table created

 

SQL> create or replace procedure P_TEST is

  2    vc_name varchar2(10);

  3  begin

  4    vc_name := '12345678910';

  5    execute immediate 'insert into t1(id,name) values(null,:1)' using vc_name;

  6 

  7    commit;

  8  end P_TEST;

  9  /

 

Procedure created

 

SQL> exec p_test;

 

begin p_test; end;

 

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

ORA-06512: at "IPRA.P_TEST", line 4

ORA-06512: at line 1

 

我们再来看一个报错ORA-06502,但是后面不跟具体的错误原因的例子:

SQL> create or replace package PCK_TEST is

  2    type typ_t1 is record

  3    (

  4      id t1.id%type,

  5      name t1.name%type,

  6      n_count number(1)

  7      );

  8  end PCK_TEST;

  9  /

 

Package created

 

SQL> create or replace procedure P_TEST is

  2    rec_t1 pck_test.typ_t1;

  3  begin

  4    for i in 1 .. rec_t1.n_count loop

  5     execute immediate 'insert into t1(id,name) values(:1,:2)' using rec_t1.id,rec_t1.name;

  6    end loop;

  7 

  8    commit;

  9  end P_TEST;

 10  /

 

Procedure created

 

SQL> exec p_test;

 

begin p_test; end;

 

ORA-06502: PL/SQL: numeric or value error

ORA-06512: at "IPRA.P_TEST", line 4

ORA-06512: at line 1

 

这里我们可以看到很清晰的看到,为什么第二次报错ORA-06502的时候并没有跟具体的错误原因----因为这里我们尝试使用rec_t1n_count,但这里rec_t1并没有初始化。

 

这就是我那位同事报错ORA-06502的根本原因

2 Comments

really sorry for wasting your time on my unnecessary error.

Leave a comment