ORA-06502: PL/SQL: numerisk eller værdifejl: tegnstrengbuffer for lille

Jeg har prøvet følgende kode på forskellige måder, f.eks. ved at fjerne while eller if, men når jeg sætter begge dele sammen (if og while), får jeg altid fejlen til sidst...

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;
/

ERROR:

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"

FIXED ved at ændre hvordan jeg deklarerede variablen "a" til:

a varchar2(2000);

*Bemærk, at her er den væsentlige ændring at bruge VARCHAR2 i stedet for CHAR (ikke den større længde). Ifølge @user272735 's svar, er det'nøglen.

PL/SQL: numerisk eller værdifejl: tegnstrengbuffer for lille

skyldes, at du erklærer en streng for at have en fast længde (f.eks. 20), og at du på et tidspunkt i din kode tildeler den en værdi, hvis længde overstiger den, du har erklæret.

f.eks:

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

vil affyre en sådan fejl

Kommentarer (0)

CHAR er en datatype med fast længde, der bruger så meget plads som muligt. Så a:= a|||'one '; vil kræve mere plads end der er til rådighed. Dit problem kan reduceres til følgende eksempel:

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;
/

Brug aldrig char. For rationale se følgende spørgsmål (læs også links):

Kommentarer (0)