设为首页 收藏本站
查看: 1465|回复: 0

[经验分享] ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 错误分析

[复制链接]

尚未签到

发表于 2015-11-8 11:58:13 | 显示全部楼层 |阅读模式
1. 问题起因



  最近在进行oracle的一些操作时,总会遇到这个错误:  ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小,错误如下:

ORA-00604: 递归 SQL 级别 1 出现错误
ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
ORA-06512: 在 line 7
  



2.官方解释



  查看官方文档上的解释:

ORA-06502: PL/SQL: numeric or value errorstring
Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT
NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).

Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.
  官方解释是:  想存入数据库的数据(包含数据,字符串等等)不符合该字段的定义(比如长度,约束等), 举个例子,就是说你想存一个空值到非空字段,如存入3位以上的数字到NUMBER(2)字段中,等等
  官方解决方法是: 改变数据的类型,或长度,等等。

  



3. 问题描述



  但是,实际中,我们在做升级的时候,或者做EXPDP/IMPDP的时候,根本不是我们本身的业务数据,也会报这个错误,遇到这种情况,我怎么知道去哪改这个数据呢,
  举几个例子:
  例1. 上次在做oracle升级的时候,从11.2.0.1.0升到11.2.0.1.6的时候在跑最后的升级脚本catcpu.sql的时候,就遇到这个错误:

SQL> /*****************************  PACKAGE BODY ********************************/
SQL> /*** DBMS_EXPFIL : Package to manage a Expression Engine                  ***/
SQL> /***               All procedures are defined with definer rights         ***/
SQL> /****************************************************************************/
SQL> create or replace package body dbms_expfil wrapped
2  a000000
3  1
4  abcd
5  abcd
.
.
19  b
20  dbb0 3035
21  wBYhf/HY/DuxqMBbCYAx0nWpqRUwg80A9scFYaf4k53h7RLaiTPCHPqfQYP1QG8+uv30CVrF
22  Lf5t1PSNPJhKkNUFecK3LJ0wJChaaSsloMeCeeC3pud2dm7+rVQUjJz6UkBKiymIRTD47p8N
23  +dIIc0OU7IlN6zUWPsEgm9hnXXIeGgSQFJU//nCdeBSWO7VQUXXQwvWTkRaQX+VcQUdld5As
24  cx9z+2uhSovZ8svraprK7VAh2cy8bqQBlS+1P4mkrsCSbvlsRSSqN+XgZbZqgUDSzZFfRbc0
.
.
191  
192  /
create or replace package body dbms_expfil wrapped
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
ORA-06512: 在 line 7


这种情况下,明明是oracle本身的东西出了错,我们无法去改变任何东西。  


  例2: 在做expdp/impdp 导出导入的时候,报这个错:

C:\Documents and Settings\andyleng>expdp system/oracle@test DIRECTORY=db_backup DUMPFILE=catb_normal.DMP SCHEMAS=catb logfile=expdp_catb_201020727.log parallel=1 CONTENT=ALL FLASHBACK_TIME=SYSDATE
Export: Release 11.2.0.1.0 - Production on 星期五 7月 27 17:43:11 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-31626: 作业不存在
ORA-31637: 无法创建作业 SYS_EXPORT_SCHEMA_02 (用户 SYSTEM)
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.KUPV$FT_INT", line 798
ORA-39080: 无法为数据泵作业创建队列 "KUPC$C_1_20120727174311" 和 "KUPC$S_1_20120727174311"
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.KUPC$QUE_INT", line 1530
ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小


C:\Documents and Settings\andyleng>impdp system/oracle@test DIRECTORY=db_backup DUMPFILE=scott.DMP LOGFILE=impdp_scott_20120727.log  SCHEMAS=SCOTT CONTENT=ALL PARALLEL=1 TABLE_EXISTS_ACTION=REPLACE
Import: Release 11.2.0.1.0 - Production on 星期五 7月 27 18:09:11 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-31626: 作业不存在
ORA-31637: 无法创建作业 SYS_IMPORT_SCHEMA_09 (用户 SYSTEM)
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.KUPV$FT_INT", line 798
ORA-39080: 无法为数据泵作业创建队列 "KUPC$C_1_20120727180912" 和 "KUPC$S_1_20120727180912"
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.KUPC$QUE_INT", line 1530
ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
这种情况下,貌似是oracle在创建这个任务的时候,因为ORA-06502错误无法创建。
  


  



4.问题解决



  以上两种情况,和用户数据无关,但出了ORA-06502错误,说明ORACLE本身有一张系统表在插入数据的时候不符合长短需求,而报了这个错。
  搜集信息:经查资料, oracle有一个隐含参数“_system_trig_enabled”用来控制系统触发器的,用来存储系统的一些触发事件,但这个表(目前不知道是哪个表)本身有问题,导致数据无法插入。
  解决思路: 顺着这个想法,只要我们把这个参数关掉,让系统的日志不保存在那张有问题的表中,就好了(当然有隐含风险,目前未知):


  解决方法

SQL> show parameter trig
NAME                                   TYPE                      VALUE
---------------------------------- ----------------------- ---------
_system_trig_enabled      boolean                FALSE
SQL> alter system set "_system_trig_enabled"=false;
系统已更改。

更改之后,再做上述操作,问题解决

  



5.总结

  根据问题的不同有2种解决方法
  .如果是用户数据,则更改用户表,或者数据
  .如果是oracle系统表,则使用如下语句关系统系统触发器:
  alter system set "_system_trig_enabled"=false;

  


  



版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-136571-1-1.html 上篇帖子: 6502ORA -06502: PL/SQL: 数字或值错误 : 字符到数值的转换错误 下篇帖子: PL/SQL developer ORA-12514: TNS: 监听程序当前无法识别连接描述符
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表