当前位置: 首页 > 知识库问答 >
问题:

ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小

杜弘光
2023-03-14

我以不同的方式尝试了以下代码,比如去掉while或if,但是当我把它们放在一起(if和while)时,我总是在最后得到错误。。。

undefine numero
set serveroutput on
accept numero prompt 'Type # between 100 and 999: '
declare
   i number:=1;
   a char(25);
   b char(1);
   c varchar2(10);
   d number;
begin
   c := №
   d := length(c);
   b := substr(c, i, 1);
   while i <= d loop
     if b = '1' then
       a:= a||'one ';
     end if;
     i := i+1;
   end loop;
   dbms_output.put_line('The number is '||a);
end;
/

错误:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 13
06502. 00000 -  "PL/SQL: numeric or value error%s"

通过将变量“a”的声明方式更改为:

a varchar2(2000);

*注意,这里的显著变化是使用VARCHAR2而不是CHAR(不是更大的长度)。根据@user272735的回答,这是关键。

共有3个答案

葛烨
2023-03-14

如果csv文件中有错误或意外的等式,也可能发生这种情况。i、 e-csv文件中的一个单元格以等号(=)(excel公式)开头,这将反过来引发错误。如果您通过去掉等号来修正或删除这个等式,它应该可以解决ORA-06502错误。

寇桐
2023-03-14

CHAR是一种固定长度的数据类型,使用尽可能多的空间。所以a:=a | | |“一” 将需要比可用空间更多的空间。您的问题可以归结为以下示例

declare
  v_foo char(50);
begin
  v_foo := 'A';
  dbms_output.put_line('length of v_foo(A) = ' || length(v_foo));
  -- next line will raise:
  -- ORA-06502: PL/SQL: numeric or value error: character string buffer too small
  v_foo := v_foo || 'B';
  dbms_output.put_line('length of v_foo(AB) = ' || length(v_foo));  
end;
/

切勿使用char。有关基本原理,请检查以下问题(同时阅读链接):

  • Oracle数据类型:我应该使用VARCHAR2还是CHAR

景哲
2023-03-14

PL/SQL:数字或值错误:字符串缓冲区太小

是由于您声明一个字符串为固定长度(例如20),并且在代码中的某个点为其分配了一个长度超过您声明的值。

例如:

myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26

你会犯这样的错误吗

 类似资料: