Am încercat următorul cod în diferite moduri, cum ar fi eliminând while sau if, dar când le pun pe amândouă împreună (if și while), primesc întotdeauna eroarea la sfârșit...
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"
FIXAT prin schimbarea modului în care am declarat variabila "a" în:
a varchar2(2000);
*Atenție, aici, schimbarea semnificativă este folosirea VARCHAR2 în loc de CHAR (nu lungimea mai mare). Conform răspunsului lui @user272735 's, asta'e cheia.
PL/SQL: eroare numerică sau de valoare: bufferul șirului de caractere este prea mic
se datorează faptului că ați declarat un șir de caractere ca având o lungime fixă (de exemplu, 20) și, la un moment dat, în cod, i-ați atribuit o valoare a cărei lungime depășește lungimea declarată.
de exemplu:
myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26
va declanșa o astfel de eroare
CHAR
este un tip de date cu lungime fixă care utilizează cât mai mult spațiu posibil. Astfel, a:= a|||'one ';
va necesita mai mult spațiu decât este disponibil. Problema dumneavoastră poate fi redusă la următorul exemplu:
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;
/
Nu folosiți niciodată char
. Pentru raționament, verificați următoarea întrebare (citiți și linkurile):