J'ai essayé le code suivant de différentes manières, comme en enlevant le while ou le if, mais quand je mets les deux ensemble (if et while), j'obtiens toujours l'erreur à la fin...
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 by changing how I declared the variable "a" ; to:
a varchar2(2000);
*Remarquez qu'ici, le changement significatif est d'utiliser VARCHAR2 au lieu de CHAR (pas la plus grande longueur). Selon la réponse de @user272735 's, c'est la clé.
PL/SQL : erreur numérique ou de valeur : tampon de chaîne de caractères trop petit
est due au fait que vous déclarez une chaîne de caractères d'une longueur fixe (disons 20), et qu'à un moment donné dans votre code, vous lui attribuez une valeur dont la longueur dépasse celle que vous avez déclarée.
Par exemple :
myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26
déclenchera une telle erreur
CHAR
est un type de données de longueur fixe qui utilise autant d'espace que possible. Ainsi, a:= a|'one ';
nécessitera plus d'espace que celui qui est disponible. Votre problème peut être réduit à l'exemple suivant :
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;
/
N'utilisez jamais char
. Pour le justifier, consultez la question suivante (lisez aussi les liens) :