ORA-06502: PL/SQL: Numerischer oder Wert-Fehler: Zeichenkettenpuffer zu klein

Ich habe versucht, den folgenden Code verschiedene Möglichkeiten, wie durch das Herausnehmen der while oder die if, aber wenn ich beide zusammen (if und while), bekomme ich immer den Fehler am Ende...

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 durch Änderung der Deklaration der Variable "a" zu:

a varchar2(2000);

*Beachten Sie, dass hier die wesentliche Änderung darin besteht, VARCHAR2 statt CHAR zu verwenden (nicht die größere Länge). Laut @user272735 's Antwort, das ist der Schlüssel.

PL/SQL: numerischer oder Wert-Fehler: Zeichenkettenpuffer zu klein

ist darauf zurückzuführen, dass Sie eine Zeichenkette mit einer festen Länge (z. B. 20) deklarieren und ihr irgendwann in Ihrem Code einen Wert zuweisen, dessen Länge die deklarierte Länge überschreitet.

zum Beispiel:

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

wird einen solchen Fehler auslösen

Kommentare (0)

CHAR" ist ein Datentyp mit fester Länge, der so viel Platz wie möglich benötigt. So wird a:= a|'one '; mehr Platz benötigen als verfügbar ist. Ihr Problem kann auf das folgende Beispiel reduziert werden:

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;
/

Verwenden Sie niemals char. Zur Begründung lesen Sie die folgende Frage (lesen Sie auch die Links):

Kommentare (0)