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

j'ai essayé le code suivant de différentes façons, comme en prenant le temps ou le SI, mais quand je mets les deux ensemble (si et si), 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 la façon dont j'ai déclaré la variable" a "à:

a varchar2(2000);
25
demandé sur Kiquenet 2013-09-11 06:05:45

2 réponses

PL/SQL: Erreur numérique ou valeur: tampon de chaîne de caractères trop petit

est dû au fait que vous déclarez une chaîne de caractères d'une longueur fixe (disons 20), et à un moment donné dans votre code vous lui Assignez une valeur dont la longueur dépasse ce que vous avez déclaré.

par exemple:

myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26

va déclencher une telle erreur

29
répondu L Petre 2014-10-07 13:07:55

CHAR est un type de données de longueur fixe qui utilise autant d'espace que possible. Donc a:= a||'one '; aura besoin de 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;
/

N'utilisez jamais char . Pour la justification, vérifier la question suivante (lire aussi les liens):

9
répondu user272735 2017-05-23 12:18:20