Saya mencoba kode berikut dengan berbagai cara, seperti dengan menghilangkan while atau if, tetapi ketika saya menggabungkan keduanya (if dan while), saya selalu mendapatkan kesalahan di akhir ...
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"
DIBATASI dengan mengubah cara saya mendeklarasikan variabel "a" menjadi:
a varchar2(2000);
*Perhatikan bahwa di sini, perubahan yang signifikan adalah menggunakan VARCHAR2, bukan CHAR (bukan panjang yang lebih besar). Menurut jawaban @user272735, itulah kuncinya.
PL/SQL: kesalahan numerik atau nilai: buffer string karakter terlalu kecil
disebabkan oleh fakta bahwa Anda mendeklarasikan string dengan panjang tetap (katakanlah 20), dan pada titik tertentu dalam kode Anda, Anda menetapkan nilai yang panjangnya melebihi apa yang Anda nyatakan.
sebagai contoh:
myString VARCHAR2(20);
myString :='abcdefghijklmnopqrstuvwxyz'; --length 26
akan memecat kesalahan seperti itu
CHAR
adalah tipe data panjang tetap yang menggunakan ruang sebanyak mungkin. Jadi a:= a||'one ';;
akan membutuhkan lebih banyak ruang daripada yang tersedia. Masalah Anda dapat direduksi menjadi contoh berikut:
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;
/
Jangan pernah menggunakan char
. Untuk dasar pemikiran, periksa pertanyaan berikut (baca juga tautannya):