J'ai essayé le code suivant de différentes manières, comme en supprimant le moment ou le si, mais quand je combine les deux (si et tant que), 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;
/
ERREUR:
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"
FIXE en changeant comment j'ai déclaré la variable "a" en:
a varchar2(2000);
* Notez qu'ici, le changement important consiste à utiliser VARCHAR2 au lieu de CHAR (pas la plus grande longueur). Selon la réponse de @ user272735, c'est la clé.
PL/SQL: erreur numérique ou valeur: tampon de chaîne de caractères trop petit
cela est dû au fait que vous déclarez une chaîne de longueur fixe (par exemple 20) et que vous lui affectez une valeur supérieure à celle que vous avez déclarée.
par exemple:
myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26
va tirer une telle erreur
CHAR
est un type de données de longueur fixe qui utilise autant d'espace que possible. Donc, a:= a||'one ';
nécessitera plus d'espace que 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;
/
Ne jamais utiliser char
. Pour toute justification, vérifiez la question suivante (lisez également les liens):