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.
31
2
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:
vil affyre en sådan fejl
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:Brug aldrig
char
. For rationale se følgende spørgsmål (læs også links):