web-dev-qa-db-fra.com

ORA-06502: PL / SQL: erreur numérique ou valeur: tampon de chaîne de caractères trop petit

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é.

30
meligira

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

38
L Petre

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):

13
user272735