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

今天遇到一个错误提示:ORA-06502:PL/SQL :numberic
or value error: character string buffer too small,一般对应的中文信息为:ORA-06502:
PL/SQL: 数字或值错误
:字符串缓冲区太小。仔细检查调试过程中才发现是开发人员定义了一个变量,但是在脚本里面赋予了该变量超过其长度的值。结果就报这个错误。我习惯总结每一
个遇到的错误信息,既有利于学习、总结知识,也方便以后遇到此类问题能够及时给出解决方法。

 

如果执行oerr ora 06502命令,没有提及详细原因(Cause)以及解决方法(Action)。这个估计是出现这类错误的场景太多了的缘故。

$ oerr ora 06502

06502, 00000, "PL/SQL: numeric or value error%s"

// *Cause:

// *Action:

在官方文档http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/datatypes.htm,我看到了关于ORA-06502的错误的一些出现场景。非常有意思。有兴趣的最好直接阅读源文档。

1: 赋值或插入超过长度的值。

Assigning or Inserting Too-Long Values

If
the value that you assign to a character variable is longer than the
maximum size of the variable, an error occurs. For example:

   1: DECLARE
   2:  
   3: c VARCHAR2(3 CHAR);
   4:  
   5: BEGIN
   6:  
   7: c := 'abc ';
   8:  
   9: END;
  10:  
  11: /
  12:  
  13: Result:
  14:  
  15: DECLARE
  16:  
  17: *
  18:  
  19: ERROR at line 1:
  20:  
  21: ORA-06502: PL/SQL: numeric or value error: character string buffer too small
  22:  
  23: ORA-06512: at line 4
  24:  

2: 违反了SIMPLE_INTEGER Subtype约束

PLS_INTEGER and its subtypes can be implicitly converted to these data types:

·

· CHAR

·

· VARCHAR2

·

· NUMBER

·

· LONG

All of the preceding data types except LONG, and all PLS_INTEGER subtypes, can be implicitly converted to PLS_INTEGER.

A PLS_INTEGER value can
be implicitly converted to a PLS_INTEGER subtype only if the value does
not violate a constraint of the subtype. For example, casting the
PLS_INTEGER value NULL to the SIMPLE_INTEGER subtype raises an
exception, as Example 3-5 shows.

Example 3-5 Violating Constraint of SIMPLE_INTEGER Subtype

   1: DECLARE
   2:  
   3: a SIMPLE_INTEGER := 1;
   4:  
   5: b PLS_INTEGER := NULL;
   6:  
   7: BEGIN
   8:  
   9: a := b;
  10:  
  11: END;
  12:  
  13: /
  14:  
  15: Result:
  16:  
  17: DECLARE
  18:  
  19: *
  20:  
  21: ERROR at line 1:
  22:  
  23: ORA-06502: PL/SQL: numeric or value error
  24:  
  25: ORA-06512: at line 5
  26:  

3: User-Defined Constrained Subtype Detects Out-of-Range Values

Example 3-7 User-Defined Constrained Subtype Detects Out-of-Range Values

   1: DECLARE
   2:  
   3: SUBTYPE Balance IS NUMBER(8,2);
   4:  
   5: checking_account Balance;
   6:  
   7: savings_account Balance;
   8:  
   9: BEGIN
  10:  
  11: checking_account := 2000.00;
  12:  
  13: savings_account := 1000000.00;
  14:  
  15: END;
  16:  
  17: /
  18:  
  19: Result:
  20:  
  21: DECLARE
  22:  
  23: *
  24:  
  25: ERROR at line 1:
  26:  
  27: ORA-06502: PL/SQL: numeric or value error: number precision too large
  28:  
  29: ORA-06512: at line 9
  30:  

4: Implicit Conversion Between Constrained Subtypes with Same Base Type

A constrained
subtype can be implicitly converted to its base type, but the base type
can be implicitly converted to the constrained subtype only if the
value does not violate a constraint of the subtype (see Example 3-5).

A constrained subtype
can be implicitly converted to another constrained subtype with the same
base type only if the source value does not violate a constraint of the
target subtype.

Example 3-8 Implicit Conversion Between Constrained Subtypes with Same Base Type

   1: DECLARE
   2:  
   3: SUBTYPE Digit IS PLS_INTEGER RANGE 0..9;
   4:  
   5: SUBTYPE Double_digit IS PLS_INTEGER RANGE 10..99;
   6:  
   7: SUBTYPE Under_100 IS PLS_INTEGER RANGE 0..99;
   8:  
   9: d Digit := 4;
  10:  
  11: dd Double_digit := 35;
  12:  
  13: u Under_100;
  14:  
  15: BEGIN
  16:  
  17: u := d; -- Succeeds; Under_100 range includes Digit range
  18:  
  19: u := dd; -- Succeeds; Under_100 range includes Double_digit range
  20:  
  21: dd := d; -- Raises error; Double_digit range does not include Digit range
  22:  
  23: END;
  24:  
  25: /
  26:  
  27: Result:
  28:  
  29: DECLARE
  30:  
  31: *
  32:  
  33: ERROR at line 1:
  34:  
  35: ORA-06502: PL/SQL: numeric or value error
  36:  
  37: ORA-06512: at line 12
  38:  

5: Implicit Conversion Between Subtypes with Base Types in Same Family

Example 3-9 Implicit Conversion Between Subtypes with Base Types in Same Family

   1: DECLARE
   2:  
   3: SUBTYPE Word IS CHAR(6);
   4:  
   5: SUBTYPE Text IS VARCHAR2(15);
   6:  
   7: verb Word := 'run';
   8:  
   9: sentence1 Text;
  10:  
  11: sentence2 Text := 'Hurry!';
  12:  
  13: sentence3 Text := 'See Tom run.';
  14:  
  15: BEGIN
  16:  
  17: sentence1 := verb; -- 3-character value, 15-character limit
  18:  
  19: verb := sentence2; -- 5-character value, 6-character limit
  20:  
  21: verb := sentence3; -- 12-character value, 6-character limit
  22:  
  23: END;
  24:  
  25: /
  26:  
  27: Result:
  28:  
  29: DECLARE
  30:  
  31: *
  32:  
  33: ERROR at line 1:
  34:  
  35: ORA-06502: PL/SQL: numeric or value error: character string buffer too small
  36:  
  37: ORA-06512: at line 13
  38:  
  39:  
  40:  
时间: 2025-01-21 06:34:24

ORA-06502:PL/SQL :numberic or value error: character string buffer too small的相关文章

ORA-06502 assigning values from SQL to PL/SQL variables

    最近SQL查询返回的结果给PL/SQL变量出现ORA-06502错误.这个错误的描述是ORA-06502: PL/SQL: numeric or value error: character string buffer too small. 显而易见的是字符变量定义的长度不够,加到20,到100,继续06502,汗,咋回事呢? 1.问题描述 --出现问题是在一个package里,有两个参数游标,一个父游标,一个子游标,当父游标输出的结果传递值给子游标时提示值太大 --父游标原sql语句较

在PL/SQL 开发中调试存储过程和函数的一般性方法

存储过程|函数 在PL/SQL 开发中调试存储过程和函数的一般性方法摘要: Oracle 在PLSQL中提供的强大特性使得数据库开发人员可以在数据库端完成功能足够复杂的任务, 本文将结合Oracle提供的相关程序包(package)以及一个非常优秀的第三方开发工具来介绍在PLSQL中开发及调试存储过程的方法,当然也适用于函数. 版权声明: 本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息.原文出处: http://www.aiview.com/notes/ora_using_

PL/SQL专家指南4——调用者权限和定义者权限 下篇

-------------------------------------------------------------调用者权限和定义者权限学习--------------------------------------------------- 转自群友shehasgone: --调用者权限的存储过程  print_table create or replace procedure print_table(p_query in varchar2) authid current_user i

《Oracle PL/SQL程序设计(第5版)》一一2.4 执行必要的PL/SQL任务

2.4 执行必要的PL/SQL任务 Oracle PL/SQL程序设计(第5版)让我们把焦点转移到当把SQL*Plus作为前端工具时,该如何创建.运行.删除以及其他的PL/SQL程序管理任务.不要期待这部分能够覆盖所有细节,后面的章节会更加深入细致地介绍这些主题,这里只是快速过一遍. 2.4.1 创建存储过程 要想创建一全新的PL/SQL存储程序,你需要使用SQL中的一个CREATE语句.比如,如果你想创建一个存储函数,这个函数能够对一个字符串中的单词个数计数,你就可以使用CREATE FUNC

关于shell中的pl/sql脚本错误排查与分析

今天有个同事问我一个问题,他说运行shell脚本的时候抛出了ORA 错误,但是对于错误的原因没有思路,想让我帮他看看. 我查看了下,脚本的结构比较清晰. 脚本是有一个shell脚本,一个sql文件组成,shell脚本作为基本的流程控制,sql文件中是pl/sql脚本. 大体明白了shell脚本的部分,没有做过多的追究,就开始了解pl/sql脚本的内容了. 首先在pl/sql中声明了大量的procedure,类似shell中的function,大概有10多个procedure 然后在最后使用一个类

设置PL/SQL Developer的方法

PL/SQL Beautifier(PL/SQL 美化器) PLD 6以上版本有对DML代码格式化的功能.在SQL Window或Program Window中选中部分代码(如果 不选则对整个窗口的代码操作),在菜单中选Edit -> PL/SQL Beautifier,得到格式化的代码. 对于非法的DML语句或DDL语句,PLD将会在下方状态栏提示PL/SQL Beautifier could not parse text .在缺省的状态下,PLD会把DML语句的每一个字段都排在单独的一行,这

PL/SQL游标(原创)

游标的相关概念及特性定义映射在结果集中某一行数据的具体位置,类似于C语言中的指针.即通过游标方式定位到结果集中某个特定的行,然后根据业务需求对该行进行相应特定的操作.游标的分类显示游标:即用户自定义游标,专门用于处理select语句返回的多行数据隐式游标:系统自动定义的游标,记录集只有单行数据,用于处理select into 和DML语句游标使用的一般过程:显示游标:声明, 打开, 读取, 关闭隐式游标:直接使用读取,声明.打开.关闭都是系统自动进行的显示游标的过程描述a.声明游标CURSOR

PL/SQL的存储过程和函数(原创)

存储过程概述 存储过程是子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库.是一个有名字的PL/SQL代码块,支持接收或不接受参数,同时也支持参数输出.一个存储过程通常包含定义部分,执行部分,Exception部分,可以被其他子程序调用,也可以被重用.过程定义CREATE [OR REPLACE]PROCEDURE procedure_name[(argument_name [IN | OUT | IN OUT] argument_type)]AS | ISBEGIN    p

PL/SQL Developer 6.0.4.906特别版

PL/SQL Developer是我平时管理Oracle数据库使用最频繁的Oracle客户端GUI程序. 目前最新的版本是:6.0.4 January 5, 2005 - Version 6.0.4 releasedEnhancements Package bodies, type bodies, and materialized views would disappear from user defined folders Opening a user defined folder when