Ik heb de volgende code op verschillende manieren geprobeerd, bijvoorbeeld door de while of de if weg te laten, maar als ik beide samenvoeg (if en while), krijg ik altijd de fout aan het eind...
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"
Gefixeerd door het veranderen van hoe ik de variabele "a" verklaarde naar:
a varchar2(2000);
*Merk op dat hier de significante verandering is om VARCHAR2 te gebruiken in plaats van CHAR (niet de grotere lengte). Volgens @user272735 's antwoord, is dat'de sleutel.
PL/SQL: numerieke of waardefout: tekenreeksbuffer te klein
is te wijten aan het feit dat u een string een vaste lengte geeft (bijvoorbeeld 20), en op een bepaald punt in uw code een waarde toekent waarvan de lengte groter is dan wat u hebt aangegeven.
Bijvoorbeeld:
myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26
zal zo'n fout afgeven
CHAR
is een gegevenstype met een vaste lengte dat zo veel mogelijk ruimte gebruikt. Dus a:= a|'one ';
zal meer ruimte nodig hebben dan beschikbaar is. Uw probleem kan worden teruggebracht tot het volgende voorbeeld:
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;
/
Gebruik nooit char
. Kijk voor de beredenering naar de volgende vraag (lees ook de links):